Linux에서는 GRUB에서 특정 장치를 고려 grub-install <device>
하지 않고도 chroot 환경에서 실행할 수 있는 방법을 찾고 있습니다 (부팅 시 해당 장치가 표시되는 것을 원하지 않습니다).update-grub
A 드라이브의 시스템에서 자체 시스템이 있는 B 드라이브로 루트를 이동하여 그곳에 grub을 설치할 수 있도록 하고 싶습니다. 따라서 grub은 B에 자체적으로 설치되며 항목 A와 B를 포함합니다. 작동하지만 디스크 B(A 제외)를 부팅하면 원하지 않는 모든 항목(A 포함)이 표시됩니다. 그러므로 내 질문입니다.
제가 테스트한 것은...
/dev/sda 디스크에 새로운 Debian Buster 설치를 시작하고 새로운 Debian Buster 설치가 포함된 두 번째 디스크 /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가 아닌 환경과 동일한 것을 봅니다.
나는 그것에 grub을 설치했습니다.
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를 완전히 비활성화한 다음 불필요한 드라이브를 제외하고 이를 모방하기 위한 자체 스크립트를 만들어야 할 수도 있습니다.