파일이 포함된 USB 스틱을 사용하여 GRUB 2 항목을 선택하세요.

파일이 포함된 USB 스틱을 사용하여 GRUB 2 항목을 선택하세요.

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/grubenvsudo 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이러한 수정으로 인해 시스템이 손상될 가능성은 거의 없습니다(깨끗한 가상 머신으로 테스트했습니다).

관련 정보