web-dev-qa-db-ja.com

chrootからLinuxシステムを起動する:これを行うためのより良い方法はありますか?

Chrootedシステムで起動するようにGrubメニューエントリを設定したい(既存のシステムに過度に触れないようにchrooted debootstrapをインストールした)。

現在、私はそれを達成するために以下を行っています:

  1. Chrootされた環境内にlinux-imageとその仲間をインストールします

  2. 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を変更するたびに手動でハッキングする必要があります。それをより良くする方法は?

4
Vi.

私は同じ問題に遭遇し、結局 これを書く 異なるシステム(現在は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 を参照してください。

3
lemonsqueeze

なぜrun-initからchrootに切り替えたのですか?あなたはそれをすべきではありません。 run-initは、initramfsルート内のすべてを削除してから、$ rootmntにchrootします。あなたはその振る舞いを維持したいのです。

毎回手動でinitramfsを再構築する必要がないようにする方法については、/ usr/share/initramfs-toolsでinitスクリプトのマスターコピーを編集してください。これは、initramfs-toolsパッケージをアップグレードするまでは少なくとも機能するはずです。

恒久的な解決策は、initスクリプトにパッチを適用して、rootmntに何かを追加するためのブート引数を認識し、そのパッチをdebianに含めるために送信することです。次に、その方法で起動する必要があるエントリの引数をgrubに追加できます。

1
psusi