Chrootedシステムで起動するようにGrubメニューエントリを設定したい(既存のシステムに過度に触れないようにchrooted debootstrapをインストールした)。
現在、私はそれを達成するために以下を行っています:
Chrootされた環境内にlinux-imageとその仲間をインストールします
Initramfsを手動でリマスターして、通常の動作の代わりにシステムにchrootします。
rootmnt=$rootmnt/root/squeeze
...
#exec run-init ${rootmnt} ${init} "$@" <${rootmnt}/dev/console >${rootmnt}/dev/console
exec chroot ${rootmnt} ${init} "$@" <${rootmnt}/dev/console >${rootmnt}/dev/console
3 ../boot/grub.cfgにエントリを追加します。
menuentry 'Chrooted debian Squeeze' {
...
linux /root/squeeze/boot/vmlinuz root=... rw
initrd /root/squeeze/boot/initrd-chroot
}
動作しますが、セットアップは簡単ではなく、initrdを変更するたびに手動でハッキングする必要があります。それをより良くする方法は?
私は同じ問題に遭遇し、結局 これを書く 異なるシステム(現在はdebian、ubuntu)間で痛みを伴わずに動作させるために:
make_chroot_initrd
スクリプトを実行して、既存のイメージから新しいchroot対応のinitrdイメージを作成します。
# ./make_chroot_initrd /chroot/trusty/boot/initrd.img-3.13.0-32-generic
making new initrd: /chroot/trusty/boot/initrd.img-3.13.0-32-generic.chroot
新しいイメージは、chroot=
ブートパラメータを処理できることを除いて、まったく同じになります。
ブートローダーとしてgrub2を使用すると、/boot/grub/grub.cfg
にエントリを追加できます。
(またはおそらくより良い/etc/grub.d/40_custom
)
menuentry "ubuntu trusty, (linux 3.13.0-32) (chroot)" {
insmod ext2 # or whatever you're using ...
set root='(hd0,7)' # partition containing the chroot
set chroot='/chroot/trusty' # chroot path
linux $chroot/boot/vmlinuz-3.13.0-32-generic root=/dev/sda7 chroot=$chroot rw
initrd $chroot/boot/initrd.img-3.13.0-32-generic.chroot
}
(ファイル/パーティションを自分のものに合わせて変更してください)
満足したら、変更を永続的にすることができます
(initramfs-toolsパッケージがアップグレードされるまで)。
chrootされたシステムの場合:
# cd /usr/share/initramfs-tools
# cp -pdrv . ../initramfs-tools.orig # backup
# patch -p1 < path_to/boot_chroot/initrd.patch
# rm *.orig */*.orig
# update-initramfs -u
今後、通常のinitrdイメージはchrootブートをサポートします。
別のinitrd.chrootを使用する必要はありません。この場合、同期が外れる可能性があります。
詳細については、 boot_chroot を参照してください。
なぜrun-initからchrootに切り替えたのですか?あなたはそれをすべきではありません。 run-initは、initramfsルート内のすべてを削除してから、$ rootmntにchrootします。あなたはその振る舞いを維持したいのです。
毎回手動でinitramfsを再構築する必要がないようにする方法については、/ usr/share/initramfs-toolsでinitスクリプトのマスターコピーを編集してください。これは、initramfs-toolsパッケージをアップグレードするまでは少なくとも機能するはずです。
恒久的な解決策は、initスクリプトにパッチを適用して、rootmntに何かを追加するためのブート引数を認識し、そのパッチをdebianに含めるために送信することです。次に、その方法で起動する必要があるエントリの引数をgrubに追加できます。