2015年6月12日

IPv6で、fe80にping

IPv6で、fe80::/10のアドレス(リンクローカル・ユニキャスト・アドレス)にpingする場合。

Linuxの場合:
-I (interface)を付けて実行します。
ping6 -I eth0 fe80:(略)
-I オプションを指定しない場合は、"connect: Invalid argument"などが発生します。

----
注:ローカルからのPINGに応答するためには、PINGのRequest/Replyの他に、近隣探索(Neighbor Discovery)も有効にしておく必要があります。

PINGを受ける側で(最低限)必要なのは
IN: 128 (PING 要求)
OUT: 129 (PING 応答)

IN: 135 (近隣要請 (Neighbor solicitation))
OUT: 136 (近隣広告 (Neighbor advertisement))
です。
(135/136は、MACアドレスの要求/送信などに利用されます。)

参考:IPv6 Neighbor Discovery

----
グローバルアドレスへのpingの場合は、-I オプションを付けなくても大丈夫です。
例:(注:IPv6専用のアドレスです)
ping6 ipv6.google.com
※グローバルアドレスと通信する場合は、
(インターネットに直結している場合は) ifconfigで、eth0などに
inet6 (略) <global>のアドレスが表示されている必要があります。

Windowsの場合は、「ローカルエリア接続の状態」で、
「IPv6 接続」が「インターネット」と表示されている必要があります。

----
Windowsの場合:(Windows7の場合)

ping -6 fe80:(略)
を実行します。

----
hostsを使う場合は、インターフェイスID (10や11などの数字)も必要です。
hostsの例:
fe80:(略)%10 hostname
(アドレス)%(インターフェイスID) (ホスト名)

ping -6 hostname
※hostsで%(インターフェイスID)を付けていない場合は、
ping 要求ではホスト hostname が見つかりませんでした。ホスト名を確認してもう一度実行してください。
などが表示されます。

----
インターフェイスIDの探し方。

使用するインターフェイスを確認します。
netsh interface ipv6 show interface
名前欄が「ローカル エリア接続」などになっているインターフェイスの、Idx欄が、インターフェイスIDです。

代替コマンド
route -6 print
インターフェィス一覧や、ルートテーブルから、インターフェイスIDを探します。


----
補足:
ICMPv4とv6では、Type番号が異なります。

Type番号(一部)

v4の場合:
3: 宛先到達不能
8: エコー要求
0: エコー応答

v6の場合:
0-127:エラー
128-255:メッセージ

1: 宛先到達不能
128: エコー要求
129: エコー応答

参考:
ICMPv6 パケット タイプとコード

2015年6月4日

IPv6で、route add

addとdelが、非対称な動作をしていて悩ましいので、メモ。
/etc/sysconfig/ なんてフォルダはありません、というディストリビューション用に。


GW_ADDRは、ゲートウェイのアドレスです。
適宜読み替えて下さい。

事前の準備-> IPv6で、NICにアドレスを設定する方法

デフォルトゲートウェイを設定する場合(route add)


動く:
route -A inet6 add default gw GW_ADDR metric 1 dev eth0

確認用のコマンド:
route -6

表示例:
Destination Next Hop (略) If
::/0 GW_ADDR (略) eth0
::/0 :: (略) lo

※ IPv6の場合は、自動的に作成されるアドレスもあるので、
表示はもっと長いです。

※ 表示に時間がかかる場合は、route コマンドに -n を付けて実行してみましょう。
時間がかかる場合は、おそらく、名前解決に時間がかかっているので。
(DNSの設定次第だと思いますが、強引に、Ctrl+Cで止めて、再度routeコマンドを実行すると表示される場合もあります。)


---
動かない:
route -A inet6 add default gw GW_ADDR metric 1
SIOCADDRT: Invalid argument が表示されます。
デバイス名を指定しないと、動かないようです。

確認用のコマンド:
route -6

表示例:
Destination Next Hop (略) If
::/0 :: (略) lo


デフォルトゲートウェイを削除する場合(route del)


(デバイス毎に実行しなくても)大丈夫: ※dev eth0などの指定も可能です
route -A inet6 del default

確認用のコマンド:
route -6

表示例 (route delの実行前):
Destination Next Hop (略) If
::/0 GW_ADDR (略) eth0
::/0 :: (略) lo

表示例 (route delの実行後):
Destination Next Hop (略) If
::/0 :: (略) lo

---
注意:
(消そうとしている)ルートが存在しない場合に、route delをすると、
SIOCDELRT: No such process が表示されます。

IPv6で、NICにアドレスを設定する方法

設定ファイルを探してみても、IPv6関連のファイルが無いっ!という時のために。
※設定が無ければ作ればいいと思うの!というディストリビューション用。
※カーネルをIPv6のサポートありでビルドしてある事が前提です。

---
デフォルトルートの設定 -> IPv6で、route add

---
NICにIPv6のアドレスを固定で割り当てるには・・・
(ifconfigで一時的に割り当てるのでなく、起動後も設定を残したい場合。)
  1. 設定ファイルを作ります。(内容は、NIC用のアドレス/プレフィックス長とゲートウェイのアドレス)
  2. 設定を読み込むスクリプトを作ります。(今回は、rc.inet1を改造)

設定ファイルを作ります


rc.inet1.confには、IP4の設定しか入っていないと思います。
(rc.inet1の先頭で読み込まれます。)

IPV6用の設定ファイルを、作りましょう。
(rc.inet1.confの中に書いてもよいですが、分けておいたほうが無難です。)
今回は、ファイル名を"rc.inet1_v6.conf"にしてみました。

IPv6用に分かりやすい名前の変数を作りましょう。
必要なのは、NICに割り当てるアドレス/プレフィックス長と、ゲートウェイのアドレスです。

---
例: rc.inet1_v6.conf
※ ファイル名、変数名は独自に決めたものです。
※ rc.inet1.confを流用して作っています。

# eth0
IPADDR_V6[0]="アドレス/プレフィックス長"

# eth1
IPADDR_V6[1]=""

# eth2
IPADDR_V6[2]=""

# Gateway
GATEWAY_V6="ゲートウェイのアドレス"


設定を読み込むスクリプトを作ります

今回は、rc.inet1を改造します。

---
例: rc.inet1
※ かなり省略しています。

# 設定を取り込みます。
. /etc/rc.d/rc.inet1.conf
. /etc/rc.d/rc.inet1_v6.conf

# (略)

# ("IPADDR"で検索して、改造したい部分を見つけます)
# IPv4
if [ ! "${IPADDR[$i]}" = "" ]; then
  (略)
fi
# IPv6 (IPv4用のコードをコピーして改造します)
if [ ! "${IPADDR_V6[$i]}" = "" ]; then
  /sbin/ifconfig ${1} add ${IPADDR_V6[$i]}
  # ゲートウェイはデバイス毎に設定しないとrouteコマンドが動かないので、
  # gateway_up()からコピーして改造します。
  if [ ! "$GATEWAY_V6" = "" ]; then
    /sbin/route -A inet6 add default gw ${GATEWAY_V6} metric 1 dev ${1}
  fi
fi

# ("GATEWAY"で検索して、改造したい部分を見つけます)
# gateway_down() からコピーして改造します。
gateway_down_v6() {
  if /sbin/route -6 -n | grep "^::/0" 1> /dev/null ; then
    # 各デバイスに設定したデフォルトゲートウェイを消します。(個別に消さなくても大丈夫)
    /sbin/route -A inet6 del default
  fi  
}

試します。

最初に、ネットワークの停止を試します。(書き間違いなどでエラーが発生しないか確認したいので、起動より停止の方が安全。)
※ネットワーク経由で作業している時は、接続が切れます。要注意。
./rc.inet1 down

設定値を確認します。
例:
ifconfig
ifconfig -a
route
route -6
※不要なアドレスが設定されていないか確認します。
※NICがダウンしたか確認します。
※不要なルートが設定されていないか確認します。


ネットワークを開始してみます。
./rc.inet1 up

設定値を確認します。
(略)
※IPv6アドレスが正しく設定されたか確認します。
※想定どおりにNICがUPしたか確認します。
※デフォルトルートが正しく設定されたか確認します。


もう一度、ネットワークを停止してみます。
./rc.inet1 down

設定値を確認します。
(略)
※不要なルートが残っていないか確認します。

あとは、お好みで。


---
注意:
ケーブルが接続されていない場合などは、不要なルートができたり、消せなくなったりする場合があります。
(アドレスが見つからない などのエラーメッセージがでる場合も。)

アドレスが重複した場合は、
SIOCSIFADDR: File exists
などが表示されます。

note - what is "BIOS INT 13h AX=4C00h" ? mentioned in ISOLINUX wiki

This is a translation of my page ノート 「BIOS INT 13h AX=4C00h」について - SYSLINUX、ElToritoBoot 関連の話題

---
From SYSLINUX wiki - Can I boot other operating systems with ISOLINUX?
Starting in version 1.65, ISOLINUX supports booting disk images of other operating systems. However, this feature depends on BIOS functionality which is apparently broken in a very large number of BIOSes.
...
please complain to your vendor and indicate that "BIOS INT 13h AX=4C00h fails". Note that you can use MEMDISK as a recommended alternative;

What "BIOS INT 13h AX=4C00h" mean?

The answer is "ElToritoBoot".
El torito boot is used for bootable DVD, etc.

---
syslinux/syslinux.git - path: root/memdisk/memdisk.inc

Int13Funcs
...
%if ELTORITO ; EDD El Torito Functions
; ELTORITO _must_ also have EDD
dw ElToritoEmulate ; 4Ah - Initiate Disk Emulation
dw ElToritoTerminate ; 4Bh - Terminate Disk Emulation
dw ElToritoBoot ; 4Ch - Initiate Disk Emu. and Reboot
dw ElToritoCatalog ; 4Dh - Return Boot Catalog
%endif ; ELTORITO

ノート 「BIOS INT 13h AX=4C00h」について - SYSLINUX、ElToritoBoot 関連の話題

(EN) -> note - what is "BIOS INT 13h AX=4C00h" ? mentioned in ISOLINUX wiki

ISOLINUXのwikiで、
if you find that it doesn't work, please complain to your vendor and indicate that "BIOS INT 13h AX=4C00h fails"
訳:うまく動かなかったら、(BIOSの)ベンダに、"BIOS INT 13h AX=4C00h"が動作していないと伝えてね!
と書いてありますが、これは何かというと・・・

syslinux/syslinux.git - path: root/memdisk/memdisk.inc
Int13Funcs
...
%if ELTORITO ; EDD El Torito Functions
; ELTORITO _must_ also have EDD
dw ElToritoEmulate ; 4Ah - Initiate Disk Emulation
dw ElToritoTerminate ; 4Bh - Terminate Disk Emulation
dw ElToritoBoot ; 4Ch - Initiate Disk Emu. and Reboot
dw ElToritoCatalog ; 4Dh - Return Boot Catalog
%endif ; ELTORITO
※AHレジスタの値だけ書いてあります。(AX=4C00hなので、AH=4Ch)

ElToritoBootの事でした。
これは、起動用DVDなどで使われています。

QEMU (Bochs BIOS 2.4) で、Linuxのセットアップ用DVDが起動できなかったのも、
このあたりの問題かな・・と。

補足:
Note: In Syslinux 4.05, the .img support has been removed from ISOLINUX.
とあるので、4.xxのツリーを参照しました。

参考:
HOW TO MAKE A BOOTABLE SLACKWARE DVD ISO IMAGE

man mkisofs
-b eltorito_boot_image
-c boot_catalog

2015年6月3日

Kernel Panic not syncing (intel_pmu_init or intel_rapl) under QEMU - Reason and HowTo

This is a translation of my page "QEMU環境で、Kernel Panic not syncing が発生する場合の対処法 (確定) "
(summarized)

[What happens]

Kernel Panic - not syncing: Attempted to kill init!
is displayed in boot time.

intel_pmu_init
or
intel_rapl
also displayed in trace.


QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
in dmesg.


Environment:
QEMU guest. Bochs BIOS <= 2.4.x
Processor: >= Sandy Bridge

[Why it happens]
Bochs BIOS 2.4.x is "before" Sandy Bridge BIOS.
February 22, 2011: Bochs 2.4.6
(from Bochs News)


Sandy Bridge is released April 2011 (Xeon E3-1200 family), March 2012 (E5-2600 faimly).
(from Wiki "Xeon")

So, some features after Sandy Brige are not implemented.

[How to resolve]
Do NOT use features after SandyBridge.
Disable them in config and compile kernel.

Disable Intel P-state
CONFIG_X86_INTEL_PSTATE=n

Disable Intel RAPL
CONFIG_INTEL_RAPL=n

Kernel Panic VFS under QEMU - Reason and HowTo

I've translated my page "QEMU環境で、Kernel Panic VFS が発生する場合の対処法 (確定) "
(summarized)

[What happens]

Kernel Panic - not syncing: VFS: Unnable to mount root fs on unknown-block (0, 0)
will be displayed in boot time.

Environment:
QEMU guest. VirtIO enabled (for /dev/vda*)
Using udev.


---
If you run lilo and you see

Fatal:raid_setup:stat("/dev/sda1")
-> Check lilo.conf

Fatal: do_disk: stat /dev/vda: No such file or directory
-> Check /dev/vda exists.

Fatal: Illegal 'root=' specification: /dev/vda1
-> Check /dev/vda1 exists.

[Why it happens]

In setup environment, major number of /dev/vda* are 254.
After setup (and rebooted), major number of /dev/vda* are 253.
(Major number in other environment may differ in other environment.)

With "root=":
"device with (major, minor) number (254, 1)" will be used as /dev/vda1. (Or the number when "lilo" command used)
So, boot with DVD works, boot from HDD fails.
If rerun "lilo" command after HDD (or DVD with boot option) boot, system will boot from HDD.
(as new and correct major number will be stored.)

With "append=" or "addappend=":
"/dev/vda1"(as passed as option string) will be used.
So, system will boot even when major number is changed.


---
cf:
We have to enabel 9Pfs in kernel (build) config.

# Networking support / Plan 9 Resource Shareing Support (9P2000)
CONFIG_NET_9P=y

# File systems / Network File Systems
CONFIG_9P_FS=y # depends on CONFIG_NET_9P=y etc.

If CONFIG_9P_FS is disabled, it also cause Kernel Panic VFS.
(as system cannot recognize /dev/vda)

[How to resolve]

If using LILO:

Pass "root=/dev/vda1" option is important part of this how-to.
It seems to be a timing problem.
After LILO knows what the /dev/vda1 is and pass "root=..." as option, it works.
"append=" or "addappend=" in lilo.conf will work under same mechanism.

---
If you cannot boot the system, try boot options.

With setup DVD, when displayd "boot:"
type
huge.s root=/dev/vda1 ro
and hit Enter.


After boot, you will see normal login prompt.

cf: "root=/dev/vda1" should not contain any space characters.
Space character will separate options.
NG: root = /dev/vda1
(it means "root", "=" and "/dev/vda1" are passed)

From HDD boot, when you sea Linux splash screen (if bitmap set),
hit Tab and boot: prompt displayed,
type (if your label is "Linux")
Linux root=/dev/vda1 ro
and hit Enter.


---
Check /dev/vda and /dev/vda1 are exist.

Sample:
ls -l /dev/vda*
brw-rw---- 1 root disk 254, 0 (time) /dev/vda
brw-rw---- 1 root disk 254, 1 (time) /dev/vda1
...

In setup environment, also check /dev/vda in your /dev/vda1 partition.
Sample:
mount /dev/vda1 /mnt
ls -l /mnt/dev/vda*

If /mnt/dev/vda* aren't exist in setup environment,
create them with SAME major number as /dev/vda*.
Using same major number is needed for "lilo" command to work.
mknod /dev/vda b 254 0
mknod /dev/vda1 b 254 1
chmod 660 /dev/vda
chmod 660 /dev/vda1
chown root:disk /dev/vda
chown root:disk /dev/vda1

Just /dev/vda and /dev/vda1 are enogh.
(In boot time, udev will automatically create /dev/vda*)

---
Modify "/etc/lilo.conf".
Use "addappend=" instead of "root=" in image section.



Also you need to add disk= and modify boot= setting
to use virtual disk (/dev/vda*)

---
/etc/lilo.conf (Sample)
# I have /(root) and /boot in /dev/vda1.

lba32

# Add disk= line.
# If you have more than 7 partitions in /dev/vda, use 15, 31 or 63 for max-partitions.
disk = /dev/vda bios=0x80 max-partitions=7

# Change /dev/sda to /dev/vda
boot = /dev/vda

# Copy your append=, vga= ... from lilo.conf
append=" vt.default_utf8=0"prompt
timeout = 50
vga = normal

# Linux bootable partition config
# Copy your image= from lilo.conf
image = /boot/vmlinuz

#  Do NOT put spaces in each options.
# NG: addappend=" root = /dev/vda1"
addappend=" root=/dev/vda1"

label = Linux
read-only
# Linux bootable partition config ends

---
Save lilo.conf and call "lilo".
Check "Added Linux *" is displayed.


If using GRUB:

kernel /boot/vmlinuz root=/dev/vda1 ... may work. (Sorry, I've not tested.)
If it doesn't,this how-to will not work for you.

Search google with keyword "udev fix major number".


--- added ---
There are "/(root) or /boot on LVM" problems, but using LVM may be onother choice.
4.4.8. Persistent Device Numbers
Some applications work best if the block device always is activated with the same device (major and minor) number. You can specify these with the lvcreate and the lvchange commands by using the following arguments:
--persistent y --major major --minor minor
Use a large minor number to be sure that it has not already been allocated to another device dynamically.
LINUX ALLOCATED DEVICES (2.6+ version)
Select major number in "local/experimental use" range.
240-254 block LOCAL/EXPERIMENTAL USE
Allocated for local/experimental use. For devices not
assigned official numbers, these ranges should be
used in order to avoid conflicting with future assignments.
ref:
Installing Slackware on Logical volumes

2015年6月2日

QEMU環境で、Kernel Panic VFS が発生する場合の対処法 (確定)

Translation -> Kernel Panic VFS under QEMU - Reason and HowTo

[現象]

VirtIOが有効な環境のQEMUゲストで、Linuxの起動時に、Kernel Panicが発生します。

表示例:
Kernel Panic - not syncing: VFS: Unnable to mount root fs on unknown-block (0, 0)
が表示されます。
※設定(lilo.conf)によって、(0, 0)の中の数字が(253, ?)、(254, ?)などに変わるようです。

※トレースに、intel_pmu_init あるいは intel_raplなどが表示される場合は、別の問題です。
QEMU環境で、Kernel Panic not syncing が発生する場合の対処法


[対応策]


----
注意:
カーネルのビルド時の設定(.config)で、
CONFIG_9P_FS
などを有効にしておく必要があります。(無効の場合は、/dev/vdaなどを認識しないようです。)
CONFIG_9P_FS は、(File systems / Network File Systems)にあります。
※CONFIG_9P_FS は、CONFIG_NET_9Pに依存しています。
CONFIG_NET_9P は、(Networking support / Plan 9 Resource Shareing Support (9P2000))にあります。

----
LILOの場合:
root=ではなく、 addappend=" root="を利用します。

lilo.confの例 (該当部分のみ抜粋):
# root = /dev/vda1
addappend=" root=/dev/vda1"
注意:addappend=の中の root=/dev/vda1に、スペースを含めるのはNGです。
間にスペースがあると、(分解されて) 別のオプションとして処理されます。

補足:なぜ、addappend= を使うと動くのか?
addappend= (または append=) は、boot: プロンプトなどに渡すオプションを指定するものです。

言い換えると、boot: プロンプトで、root=/dev/vda1を指定したら立ち上がるので、
addappend= で、root=/dev/vda1を指定すれば、立ち上がるということです。
(/dev/vda1を、どのタイミングで取得するかが鍵なのだと思います。)

なお、/dev/vda*のメジャー番号を確認した所、
セットアップ時(254)とセットアップ後(253)で異なっていました。


addappend=" root=/dev/vda1"とした場合は、
/dev/vda1のメジャー番号が変わっても立ち上がります。

root=/dev/vda1とした場合は、
最後に"lilo"コマンドを実行した時と、/dev/vda1のメジャー番号が
変わっていない場合のみ、立ち上がります。

メジャー番号が変わっている場合は、
Kernel Panic ・・・ unknown-block (254, 1) が発生します。
(表示されるメジャー番号は、liloを実行した時のもの。)


GRUBの場合も、似たような方法で解決する可能性があります。
(試していないので、未確定です。)

[原因]

udev(あるいはデバイスマッパ)によって、デバイス(/dev/vdaなど)のメジャー番号が
変化するために発生すると現象だと思われます。



参考:
[dm-devel] Weird discrepancy between /dev/mapper/* and /dev/dm-* devices breaks lilo
This is a problem hitting lilo relatively hard as it has logic to
 ignore devices with the same major/minor
訳(一部):「LILOにはメジャー/マイナー番号が被ると、 そのデバイスを無視するメカニズムがある。」

これが、Kernel Panic VFSの、問題の本質の部分だと思います。


関連のありそうな資料:

付録A デバイスマッパー
A.3. デバイスマッパーによる udev デバイスマネージャーのサポート
10-dm.rules:
以下の変数は、10-dm.rules で設定されています。
(略) DM_UUID: デバイスマッパーデバイスのUUID

11-dm-lvm.rules:
LVM デバイス用に適用されるルールを格納し、ボリュームグループの論理ボリュームのシンボリックリンクを作成します。

13-dm-disk.rules:
/dev/disk/by-id、/dev/disk/by-uuid、および /dev/disk/by-uuid ディレクトリー内にシンボリックリンクを作成します。

処理の順番は、10, 11, (12), 13・・・なので、
UUIDを付ける -> LVM関連 -> その他のディスク の順に処理されると思います。
この辺りで何かが起きている予感がします。

[現象の詳細]

・ Slackware のセットアップ時 (セットアップ用DVDで起動)

ls -l /dev/vda*
(略) 254, 0 /dev/vda
(略) 254, 1 /dev/vda1
・・・

注:MBRディスクです。(GPTではありません)
※parted等でmsdosのラベルを付けただけでは、既存のGRUBの1stステージが生き残りますが、
以降の作業でMBRをLILOで上書きしています。 (起動時のGRUB表示はありません。)

環境補足:
/(root), /boot : /dev/vda1 (ext4、パーティションのタイプは83 (Linux))

他に、LVMのパーティションが存在します。


セットアップで、パッケージのインストールまで終了した後の作業
※セットアップ中に表示されるliloconfigは、
MBR(またはルートパーティション)へのインストールでエラーが発生するので、
そこで終了します。

mount /dev/vda1 /mnt
chroot /mnt
mknod /dev/vda b 254 0
mknod /dev/vda1 b 254 1
chmod 660 /dev/vda
chmod 660 /dev/vda1
chown root:disk /dev/vda
chown root:disk /dev/vda1


lilo.conf (抜粋):

boot=/dev/vda
disk=/dev/vda bios=0x80 max-partitions=7
(略)

image = ・・・
# addappend=" root=UUID=・・・"
root = /dev/vda1
label = Linux
(略)

# lilo
Added Linux *


参考: UUIDを使う場合(GPTディスクの場合)
ArchWiki - Persistent block device naming - "Boot managers"
If you are using LILO, then do not try this with the root=... configuration option; it will not work. Use append="root=..." or addappend="root=..." instead.
と書いてあるので、LILOの場合は、root="UUID=・・・"ではなく、
addappend=" root=UUID=・・・"を使います。

append= を使うと、グローバル(共通設定)にあるappend= の「かわりに」.、
imageセクション内のappend= で指定した内容が使われます。

addappend= の場合は、共通設定のappend= に「加えて」、
imageセクション内のaddappend= で指定した内容が使われます。

※append= などの内容は、LILOがチェックしないので注意しましょう。

追記:
ArchWikiの記述は、"UUIDの場合はaddappend=・・・"を使う と書いてあるように見えますが、
UUID以外の指定方法 (/dev/vda1などでの指定)でも、addappend=で問題が解決するようです。

ちなみに、root="LABEL=・・・"や、root="UUID=・・・"という指定自体は有効です。
(起動できるかどうかは、環境次第です。)
参考:
man lilo.conf ("root="のあたりを参照して下さい)


追記2:
ArchWiki - Persistent block device naming
UUID以外の指定方法についての考察などが書かれています。

この中で、
Both contain strings to indicate which subsystem they belong to (i.e. -ide- for by-path, and -ata- for by-id) and thus are not suitable (略)
訳:-ide-や-ata-を含むから、by-pathや、by-idは、
デバイス名の代わりに使う固定の名前としては使えない

と書かれていますが、QEMU(仮想)環境では少し状況が異なります。

tape device pass-through with virtio-scsi
この例に出てくるような、address type='pci'の場合は、-pci-が文字列に現われるかと思います。
例:
ls /dev/disk/py-path
pci-(略)-virtio-pci-(略)

とは言っても、LILOでは使えないようなので、GRUBで試す時用の知識ですが・・
参考程度に。


・ Slackware のセットアップ後 (HDDから起動)

LILOの場合は、起動直後に、次の表示で止まります。
Please append a correct "root=" boot option; here are the available partitions:
fd00 (略) vda driverL virtio_blk
fd01 (略) vda1 (vda1のPARTUUID)
(略) sr0 driver: sr
Kernel Panic - not syncing: VFS: Unnable to mount root fs on unknown-block (0, 0)
CPU: 0 PID: 1 Comm: swapper/0 Not tainted (カーネルバージョン)

"Kernel Panic" "VFS""Unnable to mount root fs"が、この問題を見分けるポイント。
lilo.confの内容により、(0, 0) 以外の数字が表示される場合もあります。

例: (253, ?)、(254, ?)など。

この、 254以外の数字(253)を見かけた というのが、大きなポイント。


PID: 1 (= init)・・・の表示は、/(root)がマウントできないことが原因と推測します。


※GRUBの場合は、起動プロセスがある程度進んだ後で、
Kernel Panic - not syncing: VFSで止まります。
(その分、原因の切り分けが困難になります。)

→ sr0 (CD/DVD)の後に、Kernel Panic VFSの表示が出るので、
HDD側か、DVD側か、仮想化(virtio、9P)関連か、
(GRUB自体も独立したモジュールを持っているので)GRUB関連か、
それとも他の問題(QEMU、Bochs関連など)か、切り分けが困難になります。

systemdも利用している環境では、さらに、initrdの問題も検討対象となります。

GRUBを利用している場合は、pagerなどのオプションを利用して、
起動画面を一時停止しながら見るとよいと思います。

参考:
ArchWiki - GRUB 「デバッグメッセージを有効にする」
以下を grub.cfg に追加してください:
set pager=1
set debug=all
追加する場合は、menuentryの中に書きます。
※あまり・・・かなり・・・お勧めしませんが。
(余計な表示が9割以上あって、本来の表示を探すのに苦労します。)

「systemd debug」などで検索してみるとよいかと思います。


・ Slackware のセットアップ後
(セットアップ用DVDのboot:プロンプトで、root=/dev/vda1 などを指定して起動)

セットアップ後のLinuxが立ち上がります。
/dev/vda  : (254, 0)
/dev/vda1: (254, 1)
になっています。

LVM管理下のディスク:
/dev/mapper/(略)  -> /dev/dm-0
/dev/dm-0 : (253, 0)
になっています。

QEMU環境で、Kernel Panic not syncing が発生する場合の対処法 (確定)

Translation -> Kernel Panic not syncing (intel_pmu_init or intel_rapl) under QEMU - Reason and HowTo

[現象]

QEMUゲストで、Kernel Panicが発生します。

表示例:
Kernel Panic - not syncing: Attempted to kill init!
が表示されます。

トレースに、
intel_pmu_init
などが表示されます。

intel_rapl
が表示される場合も、ほぼ同じ原因です。

表示の例など:
[SOLVED] Slackware 64bit 14.1 (RC) kernel 3.10.16 and VirtualBox

This time the GPU is with intel_pmu_init as opposed to intel_pstate_init on VBOX.
When qemu is invoked with either -cpu host or -cpu SandyBridge, the panic happens.

※SandyBridge以外(IvyBridgeなど)でも、同様の報告があります。

[原因]

QEMUが使用している Bochs BIOSのバージョンが低いために発生します。
表示例: (dmesgなどで取得)
QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
※一部のディストリビューションでは、Standard PC・・・の部分を書き換えてあるようです。

これは、Bochs BIOSのバージョン2.4 以前を使用している場合の表示です。
バージョン2.4は、SandyBridgeのリリースより前のものです。

未実装の項目(SandyBridge以降の機能)にアクセスしたため発生する現象です。
※仮想環境で、本来は未対応のCPUを載せた場合などに発生します。
(440FX に、Xeon E5-2600ファミリー(SandyBridge)を載せた場合など)


参考:
Bochs News/History Bochsのバージョン履歴
February 22, 2011: Bochs 2.4.6
Wiki - Xeon(Sandy Bridgeマイクロアーキテクチャ世代)
インテル Xeon プロセッサー E3系
2011年4月6日 (Xeon E3-1200) に発表された、エントリー向け Sandy Bridge となる。
インテル Xeon プロセッサー E5系
2012年3月から販売(E5-2600ファミリー)。E5-4600ファミリーおよびE5-2400ファミリーは2012年5月から販売。

他にも、未実装のMSR (model-specific register) に アクセスすると、
Kernel Panicが発生するという報告がありますが、
これも、同系統の問題と思われます。

Kernel Panic (kill initではなく、VFS) が発生した原因を、
パワーが上がらず、ハードディスクが回転していないのでは?
とする説もありますが、これの一部は、同じ原因で発生すると思います。
(パワーマネージメント周りの未実装項目にあたっていると予想します。)

※ Kernel Panic VFSの原因は、おそらく、udev(あるいはデバイスマッパ)が
デバイス(/dev/vdaなど)のメジャー番号を付け替える事だと思われます。
あくまで、「スピンアップしない」としたら、パワーマネージメント周りという推測です。

[対策]

Sandy Bridge以降の機能を使用しないようにします。
(カーネルのリビルドが必要です。もしかしたら、ブートオプションでも回避可能かもしれません)

例:
Kernel Panic時のトレースなどに、intel_pmuが表示される場合
 → Intel P-state を使用しないようにします。(CONFIG_X86_INTEL_PSTATE=n)

Kernel Panic時のトレースなどに、intel_raplが表示される場合
 → CONFIG_INTEL_RAPL=nにします。



[補足]
Kernel Panic - not syncing: Attempted to kill init!は、
SELinuxが原因とする説もあります。(おそらく、トレースに現われる文字列が変わります。)

※selinux=0などのブートオプションを使用するには、カーネルのビルド時に有効にしておく必要があります。
disable関連の設定:  CONFIG_SECURITY_SELINUX_BOOTPARAM
enforce関連の設定: CONFIG_SECURITY_SELINUX_DEVELOP
などの設定を確認して下さい。(ブート時、起動後それぞれの設定項目があります。)
 intel_pmu_init、intel_raplなどが表示される場合は、本現象、
それ以外は他の問題という切り分けが必要かと思います。

Linux カーネルのリビルド 使用するディスク容量について

カーネルのリビルド時に、make oldconfigなどで設定ファイルを作ると、
ドライバなどが数多く選択された状態になります。

この状態でビルドすると、ビルド時間もディスク容量もかなり大きなものになります。

VirtualBox上のLinux(CPU*4、CPUの使用率制限なし、メモリ8G)で、
ビルド時間:約j1時間
使用したディスク容量:約5GB (実際に/lib/modulesに配置されるのは、約2GB)
でした。

不要なドライバなどを全て外した状態では、
ビルド時間:約10分
使用したディスク容量:約200MB
になっています。
※そんなの、config次第でしょと言われそうですが(笑)


1時間待って、ビルドがそろそろ終わったかな・・と見に来たら、
ディスクがいっぱいになってエラー終了なんて事にならないように、
気をつけましょうね~ というのが、今回の話題。

おまけ。
ビルド用に、可変サイズでなく固定サイズで10GBくらいのディスクを作って、
ext3でフォーマットしておくとよさげです。
大きなサイズのext3パーティションは、フォーマットに時間がかかるので、
急いでいる時は、必要最小限のサイズで。

VirtIO環境でLILOがエラーを出す場合の対処法 (主にsetup時)

VirtIO環境で"lilo"を実行すると、エラーが表示される場合の対処法です。

※setup時に発生した場合の対処法です。LILOを使用する場合は、1回正しくセットアップできれば、次からはほぼ大丈夫なので・・
(GRUBを使用する時は、問題を切り分けにくい所にはまると、毎回悩んだりしますが。)

一部の現象は、GRUBでも発生します。(原因が同じなので)

Slackwareのセットアップ時を想定しています。
他のディストリビューションを使用する場合は、パス等を適宜読み替えて下さい。

パッケージのインストールが終了し、セットアップ中に表示される、
LILOの設定画面 (liloconfig)が、エラーを表示した後とします。


セットアップ用DVDが起動しない場合は、別の対応が必要です。
(設定を変えてカーネルをコンパイルし、DVDを作り直すなど。)
DVDに入っているセットアップ用のisolinux/initrd.img は、
通常のmkinitrdで作るinitrd.gzと構成が異なるので注意しましょう。
※ext4、CD/DVDなどを読むために必要な項目は、モジュールにせず、カーネルに組み込みましょう。
モジュールにすると、セットアップ時にアクセスできなくなる場合があります。
initrd.imgに組み込んでおけばアクセスできるはずですが、既存のものを使いまわすと思いますので・・


「VirtIOだからアクセスできない」という話題をたまに見ますが、BIOSなどから見たら、FAT(と、一部環境でHFS+)以外は同条件です。
(ext4などのパーティション上のファイル(/boot)が見えるかどうかと、ほぼ同義です。)
「ext4は読めるけれど、/dev/vdaにアクセスできない」場合は、/dev/vdaが作成されているか、
カーネル自体がサポートしているか(configを取得できる場合)を確認しましょう。
※/proc/config.gzなどを見られるのは、CONFIG_IKCONFIG、CONFIG_IKCONFIG_PROCなどを有効にした場合のみです。
※/bootなどにconfigが置いてある場合も、ビルド時に使用したconfigと異なる場合がありますので、注意しましょう。

[追記]

追記がなぜか上の方にある!という突っ込みは置いておいて・・
QEMU環境で、Kernel Panic VFS が発生する場合の対処法 (確定)

lilo.confで、
root=/dev/vda1ではなく、
addappend=" root=/dev/vda1"を指定します。(root=の行は指定しなくても動きます。)


Kernel Panic VFSの原因は、/dev/vda*のメジャー番号が変化するから。
(セットアップ時 (またはDVD起動) :254、セットアップ後(HDDから起動) :253)

HDD起動でも、Tabキーでboot: プロンプトを表示し、
Linux root=/dev/vda1 と打つことで起動できたので、(Linuxは、ラベルなので、適宜読み替えて下さい。)
これに相当する、addappend=" root=/dev/vda1"で、問題が解決します。

[事前準備]

セットアップ画面を終了(EXITメニュー) した後、セットアップ用DVDを再度入れ、再起動しておきます。
再起動せず作業をする事も可能だと思いますが、その場合は、セットアップ中に色々マウントされているので、注意して作業しましょう。

/bootおよび、/ (root) は、/dev/vda1にあるものとします。

"parted -l" あるいは "fdisk -l" で表示されるデバイス名が/devv/vdaである事を確認します。
セットアップ用DVDが起動でき、セットアップ可能な時点で大丈夫とは思いますが、念のため。
/dev/sda あるいは /dev/hda となっていた場合は、おそらく、/dev/vda*が作成されていません。
(vdaは、udevなどによる自動作成。)

/dev/vda* が存在するか、/dev/block/25*:*などのリンクが切れていないか、確認しておきましょう。
"25*:*"の部分は、/dev/vda*のメジャー番号:マイナー番号で、254:0などになります。
※メジャー番号は環境によって変わるようです。気になる場合は、デバイスマッパーなどのキーワードで検索しましょう。

例:
ls -l /dev/vda*
brw-rw----  1 root disk 254 ,0 (時間) /dev/vda
brw-rw----  1 root disk 254 ,1 (時間) /dev/vda1
(略)

ls -l /dev/block/
lrwxrwxrwx 1 root root (略) 254:0 -> ../vda
lrwxrwxrwx 1 root root (略) 254:1 -> ../vda1
(略)

ls /sys/dev/block/
(略) 254:0@ 254:1@ (略)

[共通]

  1. mount /dev/vda1 /mnt を実行します。
  2. 作業中に元の画面も表示したいので、Alt+F2で、別のコンソールを開きます。
  3. chroot /mnt を実行します。
以降の作業は、/mnt に chroot した後の環境で行います。
chroot前の環境にも同様のパスが存在しますので注意しましょう。

[dev/vda* が無い場合]

※chrootする前の /dev/vda* ではなく、/mnt/dev/vda* です。

  1. メジャー番号が分からない場合は、コンソールを切り替えて確認します。
  2. dev/vda および dev/vda1 を作ります。

コンソールを切り替えて確認

Alt+F1 で、元のコンソール (chroot前の環境)に戻ります。
(もしくは、exitで、chroot環境から抜けます。)

ls -l /dev/vda*
(アクセス権、所有者、メジャー番号などを確認します)

表示の例:
ls -l /dev/vda*
brw-rw----  1 root disk 254 ,0 (時間) /dev/vda
brw-rw----  1 root disk 254 ,1 (時間) /dev/vda1
(略)

Alt+F2 で、作業用のコンソールに戻ります。
(もしくは、chroot /mntで、chroot環境に戻ります。)

dev/vda および dev/vda1の作成

※誤って、chroot前の/devに作成しないように注意しましょう。

例: メジャー番号が254の場合
mknod /dev/vda b 254 0
mknod /dev/vda1 b 254 1

chmod 660 /dev/vda
chmod 660 /dev/vda1

chown root:disk /dev/vda
chown root:disk /dev/vda1

ls -l /dev/vda

正しく作成できた事を確認します。

作るのは、liloの実行に必要なデバイスのみで大丈夫です。(udevなどを有効にしたカーネルの場合。)
デバイスのメジャー番号、マイナー番号は、chrootする前の /dev/vda* と合わせる必要があります。
(あわせないと、liloを実行した時にエラーが発生します。)

エラーの例: (lilo.confがの内容が正しい場合)

(/dev/vda が無い場合)
Fatal: do_disk: stat /dev/vda: No such file or directory

(/dev/vda1 が無い場合)
Fatal: Illegal 'root=' specification: /dev/vda1

[設定 (lilo.conf) に誤りがある場合]


現象:
liloを実行すると、次のようなエラーが表示されます。

Fatal:raid_setup:stat("/dev/sda1")
※デバイス名は環境によって異なります

対処法:
  1. etc/lilo.cnf の設定を見直します。
  2. lilo を実行します。 ※dev/vda、dev/vda1 を事前に作っておく必要があります。

etc/lilo.conf

注意:セットアップ用の環境では、liloconfigで作り直すと、 キャッシュされた内容になる場合がありますので、注意しましょう。

# lba32 の行が抜ける場合があります。必要に応じて追記します。(気になる場合は、1023シリンダ問題で検索)
lba32

# boot= の行を変更します。(/dev/sdaになっている場合)
# disk= の行を追加します。
boot=/dev/vda
disk=/dev/vda bios=0x80 max-partitions=7

# addappend= の行を追加します。 ←ここが重要
#root=/dev/vda1
addappend=" root=/dev/vda1"

※追記: root=では、/dev/vda1のメジャー番号が変わると起動しません。
(Kernel Panic VFSが発生します。)

bios= の指定(BIOSが認識する1番目のディスク(起動ディスク)を、vdaに割り当てる)が誤っている場合は、起動時に「LI」などで表示が止まるかと思います。
max-partitions= で指定する値は、7, 15, 31, 63のいずれかです。パーティション数に応じて設定しましょう。多くの場合、7 または15を指定します。
詳細は、lilo.confのマニュアルの、disk=のあたりを参照して下さい。

参考:
Boot from virtio block device - KVM "Booting with lilo"
man lilo.conf (英語) (詳しい。disk=のあたりを参照。)
man lilo.conf (日本語) (ざっくり)
JF - LILO "the Linux Loader" の動作について 「1.3 BIOS によるディスクデータのロード」 ("bios="で指定する値について書かれています)

lilo を実行

Warning: '/proc/partitions' does not exist, disk scan bypassed
などのワーニングが表示される場合があります。
これは、 /proc/partitionsが存在しないので、/dev/vdaなどを確認できないという表示です。

Added Linux *
(ラベルが"Linux"の場合)
などが表示されれば、起動可能なはずです。

追記:・・と思いましたが、おそらくudevなどが悪さ(デバイスのメジャー番号の変更)をして、
立ち上がらないので、安定した立ち上げ方法を検討中です。→ 対応策が確定しました。
(DVDのboot:プロンプトでオプション指定(root=/dev/vda1) すれば一応立ち上がりますが・・)

さらに追記:
lilo.confの内容を変更したら、立ち上がるようになりました。
詳細は上の方を参照して下さい。


補足:
chroot前の/procを、/mnt/procにマウント(mount -o bind)すれば、
'/proc/partitions' does not existのワーニングは消えますが、
/devと/mnt/devの内容が一致していない (vda2から7を作成していない) ので、
Warning: '/proc/partitions' does not match '/dev' directory structure/
Warning: '/dev' directory structure is incomplete; device (254, 2) is missing.
などのワーニングが発生します。

また、 メジャー番号 (254) が実験的だという
Warning: /proc/partitions references Experimental major device 254.
などのワーニングも発生します。

参考:
LINUX ALLOCATED DEVICES (2.6+ version) (major#: 240-254 block LOCAL/EXPERIMENTAL USE)