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을 부팅 파티션으로 인식합니다.
이로 인해 두 가지 문제가 더 발생합니다.
SD 카드의 시작 폴더 위치를 구성하도록 grub에 지시하는 방법은 무엇입니까? grub.cfg에 이를 지정할 수 있습니까? /dev/mmcblk0p1 파티션의 모든 파일을 USB 플래시 드라이브의 /boot/bootsd에 복사했습니다.
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 카드 기반 시스템에 /boot
USB 스틱 디렉터리가 자동으로 설치되도록 준비해야 합니다. /boot
USB 스틱에 이미 /boot 디렉토리가 있으므로 /etc/fstab
USB 스틱을 다른 위치에 마운트하도록 구성하고 /boot
이에 대한 심볼릭 링크를 생성해야 할 수도 있습니다 /wherever_the_USB_is_mounted/boot
.
그런 다음 실행되어 grub-mkconfig -o /tmp/test-grub.cfg
/tmp/에 더미 테스트 grub.cfg 파일을 자동으로 생성하고 이를 USB 스틱의 활성 파일과 비교한 후 결과가 USB 스틱에 적합한지 확인합니다. 테스트하려면 grub.cfg
USB 스틱의 파일을 옆으로 옮기고 생성된 파일로 바꿀 수 있습니다. 작동한다면 이제 "USB에서 부팅, SD의 루트 파일 시스템" 시나리오를 사용할 때 시스템에서 커널 업데이트를 수행할 수 있어야 합니다. 이는 필요한 변경을 수행하는 가장 보수적인(가장 덜 위험한) 방법이어야 합니다.
또는 SD를 루트 파일 시스템으로 사용하여 시스템을 부팅한 후에는 커널 및 initramfs 파일을 현재 /boot
디렉터리에서 USB 스틱의 루트 디렉터리로 복사하고 이를 다음과 같이 마운트한 /boot
다음 다음을 사용하여 USB 스틱에 GRUB를 다시 설치할 수 있습니다. 다음 명령 grub-install
. 새로운 상황에 맞게 새 grub.cfg 파일(현재 USB 스틱 파일 시스템의 루트에 있음)에 다양한 경로를 자동으로 생성해야 합니다. 또한 update-initramfs -u
initramfs 파일을 업데이트하여 새 구성과 일치하는지 확인할 수도 있습니다 . 테스트가 완료된 후 /boot/boot
USB 설치의 나머지 하위 디렉터리를 삭제할 수 있습니다. 이 방법은 가장 보수적인 방법보다 더 깔끔한 구성을 생성하지만 GRUB를 USB에 다시 설치하는 데 실패할 경우 부팅 실패의 위험이 있습니다.
편집 2와 관련하여 :
- SD 카드의 시작 폴더 위치를 구성하도록 grub에 지시하는 방법은 무엇입니까? grub.cfg에 이를 지정할 수 있습니까? /dev/mmcblk0p1 파티션의 모든 파일을 USB 플래시 드라이브의 /boot/bootsd에 복사했습니다.
grub-mkconfig
커널과 initramfs 파일이 포함된 디렉토리를 찾고 싶을 뿐입니다 /boot
. 당신의 임무는 올바른 파일 시스템/디렉토리가 존재하도록 상황을 정리하는 것입니다. 이렇게 하면 모든 커널 및 initramfs 업데이트가 자동으로 올바르게 처리됩니다.
또 다른 해결책은 에 있습니다 . 그런 다음 원하는 경로 이름을 사용할 수 있습니다. 그러나 표준 커널 패키지는 단순히 파일을 에 설치 하고 동일한 디렉터리 initramfs 파일에 해당 파일을 만든 다음 실행하므로 /etc/grub.d/40_custom
직접 업데이트해야 합니다. 표준 위치에 있는 구성 파일을 새로 고칩니다.vmlinuz-<version>
/boot
grub-mkconfig
- 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 플래시 드라이브에.
그런 다음 설치 프로그램이 작업을 수행하도록 하십시오.