![파일이 포함된 USB 스틱을 사용하여 GRUB 2 항목을 선택하세요.](https://linux55.com/image/195829/%ED%8C%8C%EC%9D%BC%EC%9D%B4%20%ED%8F%AC%ED%95%A8%EB%90%9C%20USB%20%EC%8A%A4%ED%8B%B1%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20GRUB%202%20%ED%95%AD%EB%AA%A9%EC%9D%84%20%EC%84%A0%ED%83%9D%ED%95%98%EC%84%B8%EC%9A%94..png)
Windows와 Ubuntu 20.04가 설치된 컴퓨터가 있습니다. 활성 파티션(BIOS의 첫 번째 부팅 항목)은 Ubuntu가 설치된 파티션입니다. Windows를 부팅 옵션으로 사용하도록 GRUB에 수동으로 항목을 만들었고 이것이 기본값으로 설정되었습니다.
USB 스틱(또는 더 나은 SD 카드)을 사용하여 기본 선택을 변경할 수 있기를 바랍니다. 연결되어 있으면 Ubuntu(첫 번째 항목)로 부팅해야 하며, 연결되어 있지 않으면 기본 선택(세 번째 항목, Windows)을 사용해야 합니다.
GRUB을 USB 스틱/SD 카드에 설치/복사/추가하고 이를 BIOS 부팅 순서의 첫 번째 항목으로 선택하고 현재 Ubuntu 파티션으로 폴백하려면 (어쨌든 방법을 모르겠습니다) 부팅 순서에서 첫 번째?
아니면 파일을 스틱/카드에 넣은 다음 GRUB에서 읽을 수 있게 해주는 도구가 있습니까?
업데이트: GRUB 구성 파일을 확인한 결과 이라는 /boot/grub/grubenv
줄이 있는 파일이 있다는 것을 발견했습니다 next_entry=
. 이 줄은 제가 가끔 sudo grub-reboot 0
사용하기 때문에 존재합니다.재시작우분투를 입력하십시오. 실행하면 sudo grub-reboot 0
줄이 next_entry=0
.
/etc/default/grub/00_header
이제 특정 USB 장치가 연결되어 있는지 확인하고 그렇다면 next_entry=0
파일 에 쓰거나 이 작업을 수행하는 grubenv
방법과 유사하게 필요한 변수를 설정하는 일부 코드를 추가하기 위해 수정하려고 생각하고 있습니다 .next_entry=0
이제 내 질문은 에서 무엇을 할 수 있는지 모르겠습니다. 00_header
결국 curl
변수를 가져오는 데 사용하는 것이 완벽할 것입니다. 하지만 이 시점에는 네트워크가 없고 컬이 인식되는 명령이 아닌 것 같습니다.
시스템 손상 위험 없이 이 파일의 기능을 이해하기 위해 GRUB를 디버깅/학습하려면 어떻게 해야 합니까?
현재 문제가 발생하면 통찰력을 얻기 위해 되돌릴 수 있는 스냅샷이 있는 클린 VM을 사용하는 것을 고려하고 있습니다. 하지만 아마도 여기 전문가들이 알려주는 한두 가지 팁이 제게는 귀중한 정보가 될 것입니다.
답변1
한때 Multisystem이라는 소프트웨어가 있었습니다. 아직 거기 있는 것 같군요. 일반적으로 USB 스틱에 여러 배포판을 설치할 수 있는 소프트웨어입니다. 이를 사용할 수 있는 방법(저도 사용해 본 적이 있음)은 grub(USB 플래시 드라이브용 grub)을 부팅하는 데 사용하는 것입니다. Ventoy라는 새로운 도구를 보았지만 사용해 본 적이 없습니다. 같은 방식이 있는 것 같습니다. 기본적으로 주머니에는 GRUB이 있습니다. 그렇지 않으면 Windows로 부팅하는 데 익숙합니다. 저는 (의도적으로) grub을 설치하지 않았고 USB 스틱을 사용하여 데비안으로 부팅하는 이중 부팅도 했습니다. 이 작업을 수행하는 더 깔끔한 방법이 있지만 이것이 더 쉬울 것이라고 생각했습니다.
답변2
부팅 프로세스를 중단하고 GRUB 2 선택 메뉴에서 쉘에 들어가면 명령을 실행하여 연결된 장치를 나열할 수 있습니다 ls
.
제 경우에는 USB 스틱이 (hd0,msdos1)
.
/boot/grub/grub.cfg
먼저 다음 내용이 포함되도록 파일 을 수정했습니다 .
### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
# =================== BEGIN MODIFICATION ===================
if [ -s (hd0,msdos1)/grub_boot_config ]; then
set next_entry=0;
fi
# =================== END MODIFICATION ===================
if [ "${initrdfail}" = 2 ]; then
set initrdfail=
elif [ "${initrdfail}" = 1 ]; then
...
내가 달리면 next_entry=0
어디에 설정 될까요?$prefix/grubenv
sudo grub-reboot 0
이것은 작동하지만 다시 빌드하기 때문에 커널 업그레이드 후에는 유지되지 않습니다./boot/grub/grub.cfg
/etc/grub.d/00_header
그런 다음 다음을 추가하도록 수정했습니다 .
cat << EOF
if [ -s \$prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
EOF
# =================== BEGIN MODIFICATION ===================
cat << EOF
# =================== BEGIN MODIFICATION ===================
if [ -s (hd0,msdos1)/grub_boot_config ]; then
set next_entry=0;
fi
# =================== END MODIFICATION ===================
EOF
# =================== END MODIFICATION ===================
cat <<EOF
if [ "\${initrdfail}" = 2 ]; then
set initrdfail=
elif [ "\${initrdfail}" = 1 ]; then
...
그리고 방출한 sudo update-grub
다음 생성합니다./boot/grub/grub.cfg
결과적으로 USB 스틱을 삽입하고 grub_boot_config
루트 디렉터리(비어 있을 수 있음)에 파일이 포함되어 있으면 (hd0,msdos1)/grub_boot_config
성공하고 next_entry=0
.
다음 개선 사항은 0
파일(또는 시작해야 하는 모든 메뉴 항목)에 포함시키고 스크립트가 이를 읽고 설정하도록 next_entry
하고 (hd0,msdos1)
.
그럼에도 불구하고 오타에 대한 복원력이 매우 뛰어나므로 /boot/grub/grub.cfg
이러한 수정으로 인해 시스템이 손상될 가능성은 거의 없습니다(깨끗한 가상 머신으로 테스트했습니다).