Grub: USB 드라이브에서 부팅한 다음 SD 카드에서 계속 부팅하시겠습니까?

Grub: USB 드라이브에서 부팅한 다음 SD 카드에서 계속 부팅하시겠습니까?

SD 카드 리더가 내장된 오래된 노트북이 있는데 부팅 시 작동하지 않습니다.

그러나 작은 8GB USB 플래시 드라이브(USB 2.0)에서 Linux(Debian)를 부팅할 수 있지만 매우 느립니다. SD 카드는 훨씬 빠르며 다른 인터페이스에 있어야 합니다.

grub에서 SD 카드에 접근할 수 없지만 USB 플래시 드라이브에서 Debian 커널 및/또는 vmlinuz를 로드한 다음 SD 카드 드라이버를 핵심?

grub 구성 파일을 편집하지 말라고 명시적으로 명시하고 있기 때문에 혼란스럽지만 커널/vmlinuz 및 initramfs에 대해 다른 디스크를 지정할 수 있는 것 같습니다. 어떻게 해야 할지 잘 모르겠습니다. USB 플래시 드라이브에서 SD 카드를 부팅합니까?

다음은 USB 디스크의 /boot/grub.cfg에 있는 관련 코드입니다.

USB 스틱으로 부팅하려면:

### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
    set gfxpayload="${1}"
}
set linux_gfx_mode=
export linux_gfx_mode
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-aaaa-aaaa-a’ {
    load_video
    insmod gzio
    if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
    insmod part_msdos
    insmod ext2
    set root='hd2,msdos1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd2,msdos1 --hint-efi=hd2,msdos1 --hint-baremetal=ahci2,msdos1  aaaa-aaaa-a
    else
      search --no-floppy --fs-uuid --set=root aaaa-aaaa-a
    fi
    echo    'Loading Linux 4.19.0-6-amd64 ...'
    linux   /boot/vmlinuz-4.19.0-6-amd64 root=UUID=aaaa-aaaa-a ro  quiet
    echo    'Loading initial ramdisk ...'
    initrd  /boot/initrd.img-4.19.0-6-amd64
}

SD/MMC 카드로 부팅:

### BEGIN /etc/grub.d/30_os-prober ###
menuentry 'Debian GNU/Linux 10 (buster) (on /dev/mmcblk0p1)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-XXXX-XXXX-X’ {
    insmod part_msdos
    insmod ext2
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root  XXXX-XXXX-X
    else
      search --no-floppy --fs-uuid --set=root XXXX-XXXX-X
    fi
    linux /vmlinuz root=/dev/mmcblk0p1
    initrd /initrd.img
}

그것들을 결합할 수 있는 방법이 있어야 한다고 생각하시나요?

저는 SD카드를 부팅하는데 사용합니다.

LVM 파티션으로 SD 카드를 설정했기 때문에 기본 MBR 파티션으로만 설정되었기 때문에 USB 플래시 드라이브에 lvm2를 설치해야 했습니다.

나는 다음을 추가했다:

insmod lvm
insmod ext2

도착하다:

### BEGIN /etc/grub.d/05_debian_theme ###

그리고:

root=/dev/mapper/debian--vg-root

해당 메뉴 항목으로 이동합니다.

그러나 initramfs 파일은 USB와 SD에서 다르기 때문에 SD에서 부팅할 때 모든 것이 올바르게 로드되지는 않습니다.

USB 설치는 부팅만 가능한 매우 작은 셸인 반면, SD는 데스크톱 관리자 등이 포함된 전체 설치입니다.

내가 하고 싶은 것은 둘을 분리하고 각각의 initramfs 파일을 사용하여 부팅할 수 있는 것입니다. USB 카드에 대해 이 작업을 수행하고 SD 카드에 대해 별도의 항목을 부팅할 수 있지만 최소한의 USB initramfs 파일을 사용합니다.

SD 카드는 /dev/mmcblk0p1을 부팅 파티션으로 인식합니다.

이로 인해 두 가지 문제가 더 발생합니다.

  1. SD 카드의 시작 폴더 위치를 구성하도록 grub에 지시하는 방법은 무엇입니까? grub.cfg에 이를 지정할 수 있습니까? /dev/mmcblk0p1 파티션의 모든 파일을 USB 플래시 드라이브의 /boot/bootsd에 복사했습니다.

  2. USB 폴더 /boot/bootsd를 SD 카드의 /boot로 설정하는 방법은 무엇입니까? fstab과 심볼릭 링크를 사용하시나요?

편집 3:

이제 알아낸 것 같아요. 방금 바꿨어요.

initrd /initrd.img

도착하다:

initrd /bootsd/initrd.img

그런 다음 UUID를 사용하여 USB sdc1용 SD 카드에 fstab 항목을 만들었습니다. 그런 다음 /media/usbboot/boot/bootsd에서 SD 시스템의 /boot로 ln 별칭을 만듭니다.

아직 무료가 아닌 Wi-Fi를 구성하지 않았으므로 아직 apt-get 업데이트를 수행하지 않았지만 작동할 것이라고 가정합니다.

답변1

GRUB은 모든 디스크 I/O 작업에 시스템 펌웨어 루틴(예: BIOS)을 사용하므로 BIOS가 SD 카드를 읽을 수 없으면 GRUB도 이를 수행할 수 없습니다.

GRUB의 임무는 Linux 커널과 initramfs 파일을 RAM에 로드한 다음 제어권을 Linux 커널로 전달하는 것입니다. 이 시점에서 GRUB의 작업은 완료되며 더 이상 작업에 관여하지 않습니다. 그 이후의 모든 작업은 Linux 커널과 initramfs 파일에 포함된 드라이버 및 도구에 의해 수행됩니다.

root=따라서 USB 스틱의 initramfs에 SD 카드 드라이버가 포함되어 있는 경우 다음 줄을 사용하여 부팅 매개변수를 편집하기만 하면 됩니다 .

linux   /boot/vmlinuz-4.19.0-6-amd64 root=UUID=aaaa-aaaa-a ro  quiet

이와 관련하여:

linux   /boot/vmlinuz-4.19.0-6-amd64 root=/dev/mmcblk0p1 ro  quiet

그러나 이것은 첫 번째 단계일 뿐입니다.

귀하의 시스템도고쳐 쓰다커널 및/또는 부트로더에 필요한 경우 기본 SD 카드 기반 시스템에 /bootUSB 스틱 디렉터리가 자동으로 설치되도록 준비해야 합니다. /bootUSB 스틱에 이미 /boot 디렉토리가 있으므로 /etc/fstabUSB 스틱을 다른 위치에 마운트하도록 구성하고 /boot이에 대한 심볼릭 링크를 생성해야 할 수도 있습니다 /wherever_the_USB_is_mounted/boot.

그런 다음 실행되어 grub-mkconfig -o /tmp/test-grub.cfg/tmp/에 더미 테스트 grub.cfg 파일을 자동으로 생성하고 이를 USB 스틱의 활성 파일과 비교한 후 결과가 USB 스틱에 적합한지 확인합니다. 테스트하려면 grub.cfgUSB 스틱의 파일을 옆으로 옮기고 생성된 파일로 바꿀 수 있습니다. 작동한다면 이제 "USB에서 부팅, SD의 루트 파일 시스템" 시나리오를 사용할 때 시스템에서 커널 업데이트를 수행할 수 있어야 합니다. 이는 필요한 변경을 수행하는 가장 보수적인(가장 덜 위험한) 방법이어야 합니다.

또는 SD를 루트 파일 시스템으로 사용하여 시스템을 부팅한 후에는 커널 및 initramfs 파일을 현재 /boot디렉터리에서 USB 스틱의 루트 디렉터리로 복사하고 이를 다음과 같이 마운트한 /boot다음 다음을 사용하여 USB 스틱에 GRUB를 다시 설치할 수 있습니다. 다음 명령 grub-install. 새로운 상황에 맞게 새 grub.cfg 파일(현재 USB 스틱 파일 시스템의 루트에 있음)에 다양한 경로를 자동으로 생성해야 합니다. 또한 update-initramfs -uinitramfs 파일을 업데이트하여 새 구성과 일치하는지 확인할 수도 있습니다 . 테스트가 완료된 후 /boot/bootUSB 설치의 나머지 하위 디렉터리를 삭제할 수 있습니다. 이 방법은 가장 보수적인 방법보다 더 깔끔한 구성을 생성하지만 GRUB를 USB에 다시 설치하는 데 실패할 경우 부팅 실패의 위험이 있습니다.

편집 2와 관련하여 :

  1. SD 카드의 시작 폴더 위치를 구성하도록 grub에 지시하는 방법은 무엇입니까? grub.cfg에 이를 지정할 수 있습니까? /dev/mmcblk0p1 파티션의 모든 파일을 USB 플래시 드라이브의 /boot/bootsd에 복사했습니다.

grub-mkconfig커널과 initramfs 파일이 포함된 디렉토리를 찾고 싶을 뿐입니다 /boot. 당신의 임무는 올바른 파일 시스템/디렉토리가 존재하도록 상황을 정리하는 것입니다. 이렇게 하면 모든 커널 및 initramfs 업데이트가 자동으로 올바르게 처리됩니다.

또 다른 해결책은 에 있습니다 . 그런 다음 원하는 경로 이름을 사용할 수 있습니다. 그러나 표준 커널 패키지는 단순히 파일을 에 설치 하고 동일한 디렉터리 initramfs 파일에 해당 파일을 만든 다음 실행하므로 /etc/grub.d/40_custom직접 업데이트해야 합니다. 표준 위치에 있는 구성 파일을 새로 고칩니다.vmlinuz-<version>/bootgrub-mkconfig

  1. USB 폴더 /boot/bootsd를 SD 카드의 /boot로 설정하는 방법은 무엇입니까? fstab과 심볼릭 링크를 사용하시나요?

정확히. 추가 bootsd폴더가 있으면 작업이 약간 복잡해지지만 가능합니다. 항목 fstab은 다음과 같습니다.

UUID=aaaa-aaaa-a /usbkey <filesystem type> defaults 0 2

이렇게 하면 폴더에 대한 비기호적 링크 경로가 /usbkey/boot/bootsd.

/boot그런 다음 SD 파일 시스템의 현재 디렉터리를 따로 이동하고 심볼릭 링크로 바꿀 수 있습니다.

mv /boot /boot.old
ln -s /usbkey/boot/bootsd /boot

set root=<something>search ... --set=root ...GRUB가 GRUB 자체 목적을 위한 루트 파일 시스템에 대해 말할 때 이는 단순히 GRUB이 파일을 로드할 파일 시스템의 루트를 의미한다는 점을 명심하십시오 . 시작 시 GRUB는 Linux의 단일 통합 디렉터리 트리를 표시하지 않습니다. 기본적으로 한 번에 하나의 파일 시스템만 살펴봅니다.

GRUB의 경우 이 줄 root=의 옵션은 linux <somewhere>/vmlinuz-<version> root=...Linux 커널의 또 다른 부팅 옵션일 뿐입니다. 그러나 커널 및/또는 initramfs 파일의 부팅 스크립트의 경우 이 옵션은 Linux가 루트 파일 시스템으로 사용하는 파일 시스템을 지정합니다.

답변2

내 상황

지난 주에 새로운 고속 nvme 카드가 있는 컴퓨터에 Xubuntu를 설치했는데 컴퓨터가 부팅 시 카드를 인식하지 못했습니다.

Xubuntu는 설치 프로그램 Ubiquity를 사용하며 설치 중에 파티션 창에서 수동 파티션을 의미하는 "기타"를 선택했습니다.

  • 루트를 분할했는데,/, nvme 카드에
  • 부팅 파티션을 나누었습니다./시작하다, SSD에 연결하면 시작 시 인식됩니다.

당신의 상황

내 생각에는 현재 데비안 설치 프로그램으로 매우 비슷한 일을 할 수 있을 것 같습니다. 별도의 부팅 파티션과 기본 파티션이 있는 기존 텍스트 모드 데비안 설치 프로그램을 사용하여 수동으로 파티션을 나누었습니다. 새 설치 프로그램이 그렇게 하지 않으면 이전 텍스트 모드 설치 프로그램으로 돌아갈 수 있습니다.

  • 루트 파티션을 배치하고,/, 메모리 카드에 저장합니다( PCI를 통해 연결된 경우 mmcblk0첫 번째 파티션 으로 간주됨 mmcblk0p1).
  • 부팅 파티션을 배치하고,/시작하다, USB 플래시 드라이브에.

그런 다음 설치 프로그램이 작업을 수행하도록 하십시오.

관련 정보