メインシステムのスタートアッププロシージャの/etc/modules
と同様に、initrdステージでモジュール(たとえば、netconsole
)を明示的にロードします。
まず、システムのinitrdに必要なモジュールが既に含まれていることを確認しました(付録を参照)。
/initrd.img
を調べました(これは圧縮されたcpioアーカイブであるため、簡単に調べるためにzcat /initrd.img > initrd.cpio
を実行し、mc
でその中に入りました)。スクリプトの中からmodprobe
の呼び出しを探しましたが、/conf/modules
(ここで/
はinitrdのルートです)にリストされているモジュールは、/scripts/functions
からload_modules()
関数(/init
によって呼び出されます)によって自動的にロードされることがわかりました。
しかし、initrdの/conf/modules
を更新するUbuntuシステムの標準ツールは何でしょうか?
(ところで、Ubuntuのinitrdのコードの調査中に、/init
スクリプトでnetconsole
の特別なサポートがあることに気付きました。 、その他のカスタムモジュールに関して。)
上で言ったように、まず、システムのinitrdに必要なモジュール(つまり、netconsole
)が既に含まれていることを確認しました。こうやって:
# zcat /initrd.img | cpio --extract --verbose --list | fgrep netconsole
-rw-r--r-- 1 root root 25372 Aug 31 20:59 lib/modules/3.19.0-28-generic/kernel/drivers/net/netconsole.ko
109504 blocks
#
また、必要なネットワークドライバーが既に含まれていることも確認しました。
# ls -ld /sys/class/net/eth0/device/driver
lrwxrwxrwx 1 root root 0 Sep 21 15:34 /sys/class/net/eth0/device/driver -> ../../../../bus/pci/drivers/sky2
# zcat /initrd.img | cpio --extract --verbose --list | fgrep sky2
-rw-r--r-- 1 root root 92948 Aug 31 20:49 lib/modules/3.19.0-28-generic/kernel/drivers/net/ethernet/marvell/sky2.ko
109504 blocks
#
Ubuntu 14.04でinitrdにモジュールを追加する方法を発見しました。モジュールの名前を/ etc/initramfs-tools/modulesに追加しました。これにより、モジュールがinitrdファイルに追加されました。/etc/initramfs-tools/modulesに変更を加えた後、initrdファイルを更新することを忘れないでください(update-initramfs -u)。
Ubuntuは、initrdの作成を処理するためにinitramfs-tools(入門についてはman initramfs-toolsを参照)を使用します。
Initrdにモジュールnetconsoleを追加し、それを強制的にロードするには、/ etc/initramfs-tools/hooks(つまり/ etc/initramfs-tools/hooks/netconsole)に次の内容のファイルを作成します。
#!/ bin/sh PREREQ = "" prereqs() { echo "$ PREREQ" } $ 1の prereqs) prereqs exit 0 ;; esac 。 /usr/share/initramfs-tools/hook-functions force_load netconsole
実行可能にします。次に実行します:
update-initramfs -u
最新のカーネルのinitrdを更新します。