Linuxでは、GRUBで特定のデバイスを考慮grub-install <device>
しなくてもchroot環境で実行できる方法を探しています(起動時にそのデバイスを表示したくありません)。update-grub
Aドライブのシステムから独自のシステムを持つBドライブにルートを移動して、そこにgrubをインストールできるようにしたいと思います。したがって、grubはBに独自にインストールされ、アイテムAとBを含みます。動作するがディスクB(Aを除く)を起動すると、不要なすべての項目(Aを含む)が表示されます。だから私の質問です。
私がテストしたのは…
/dev/sdaディスクに新しいDebian Busterのインストールを開始し、新しいDebian Busterのインストールを含む2番目のディスク/dev/sdbを起動すると、次の結果が表示されます。
root@buster:~# blkid -s UUID
/dev/sda1: UUID="0505963d-a522-415c-ba85-57bac4b7e0ae"
/dev/sda5: UUID="40e956ea-05c7-4099-b9c8-3b0c97780db0"
/dev/sdb1: UUID="afc267fa-5f9b-464a-b9c0-02437f83b28f"
/dev/sdb5: UUID="ae03e23b-cdbf-4b46-96d1-0f1b0b5ac13b"
=> 2つのディスクが一覧表示されます
GRUBメニューの開始は次のとおりです(UUIDを表示するコマンドも作成しましたが、結果はフランス語です)。
Debian GNU/Linux [0505963d-a522-415c-ba85-57bac4b7e0ae]
Options avancées pour Debian GNU/Linux [0505963d-a522-415c-ba85-57bac4b7e0ae]
=> /dev/sda1のみが含まれています
だからchroot環境を準備しました。
root@buster:~# DEST=/dev/sdb
root@buster:~# mkdir -p /mnt${DEST}1
root@buster:~# mount -t ext4 ${DEST}1 /mnt${DEST}1
root@buster:~# for i in /dev /proc /sys /run /sys ; \
do mount -B $i /mnt${DEST}1$i ; done
root@buster:~# DEST=$DEST chroot /mnt${DEST}1
chroot環境で:
root@buster:/# cat /etc/fstab
...
UUID=afc267fa-5f9b-464a-b9c0-02437f83b28f / ext4 ...
UUID=ae03e23b-cdbf-4b46-96d1-0f1b0b5ac13b none swap ...
root@buster:/# blkid -s UUID
/dev/sda1: UUID="0505963d-a522-415c-ba85-57bac4b7e0ae"
/dev/sda5: UUID="40e956ea-05c7-4099-b9c8-3b0c97780db0"
/dev/sdb1: UUID="afc267fa-5f9b-464a-b9c0-02437f83b28f"
/dev/sdb5: UUID="ae03e23b-cdbf-4b46-96d1-0f1b0b5ac13b"
=> chroot環境は、chroot以外の環境と同じものを表示します。
私はそれにグラブをインストールしました。
root@buster:/# grub-install ${DEST}
root@buster:/# update-grub
=>成功、エラーなし!
ただし、GRUBメニューが表示された場合(上記で使用したものと同じコマンド):
Debian GNU/Linux [afc267fa-5f9b-464a-b9c0-02437f83b28f]
Options avancées pour Debian GNU/Linux [afc267fa-5f9b-464a-b9c0-02437f83b28f]
Debian GNU/Linux 10 (buster) (sur /dev/sda1) [0505963d-a522-415c-ba85-57bac4b7e0ae]
Options avancées pour Debian GNU/Linux 10 (buster) (sur /dev/sda1) [0505963d-a522-415c-ba85-57bac4b7e0ae]
=> /dev/sdb1 および /dev/sda1 パーティションがリストされていますが、/dev/sda1 は不要です。
そのため、GRUBが特定のデバイスを考慮せずにchroot環境にGRUBをインストールする方法を探しています。
オンラインで検索しましたが、これを達成する方法と可能性が見つかりませんでした。どうすればいいですか?
さて、私はある程度私を満足させる解決策を見つけました。それはシステムに拘束されません。
アイデアは、GRUBをインストールする前にos-proberを実行不可能にしてから実行することです(源泉アイデア):
os_prober_path=$( which os-prober ) && perms=$( getfacl -e $os_prober_path ) \
&& chmod a-x $os_prober_path
grub-install ${DEST}
update-grub
[[ $os_prober_path ]] && echo "$perms" |setfacl -M- $os_prober_path
最後に、私たちは以下を持っています:
# needs : gawk acl
DEST=/dev/sdb
mkdir -p /mnt${DEST}1
mount -t ext4 ${DEST}1 /mnt${DEST}1
for i in /dev /proc /sys /run /sys ; do mount -B $i /mnt${DEST}1$i; done
DEST=$DEST chroot /mnt${DEST}1
os_prober_path=$( which os-prober ) && perms=$( getfacl -e $os_prober_path ) \
&& chmod a-x $os_prober_path
grub-install ${DEST}
update-grub
[[ $os_prober_path ]] && echo "$perms" |setfacl -M- $os_prober_path
exit
for i in /dev /proc /sys /run /sys ; do umount -l /mnt${DEST}1$i; done
umount -l /mnt${DEST}1
rmdir /mnt${DEST}1
しかし、私はいつも特定のデバイスを無効にする方法を探しています。だから別の考えがあるなら...
ベストアンサー1
grubメニューの生成方法を制御したいようです。これらの情報は一般的に/etc/grub.d
。
もちろん、他のすべてのオペレーティングシステムを削除するには、os-proberを無効にしてchmod ugo-x /etc/grub.d/30_os-prober
スクリプトの実行を停止するだけです。
一般的な状況は他のオペレーティングシステムがインストールされていないため、マウントポイントがこのスクリプトのしくみに影響を与える可能性はほとんどありません。ドライブに何がインストールされているかを調べるために、メモリにドライブをマウントしようとします。
/dev
あなたのスクリプトはあなたがchroot環境にバインドをインストールしていることを確認しました。 os-proberを制御できる場合は、/ devからドライブを取り外して制御できます。
あなたは試すことができますバインドマウント/ devの代わりにデバイスファイルをコピーします。その後、実行する前に必要な項目を削除できますupdate-grub
。
失敗した場合は、os-proberを完全に無効にしてから、不要なドライブを除いてこれを模倣するための独自のスクリプトを作成する必要があります。