bcdboot를 위해 꼭 EFI를 마운트할 필요는 없네요.
2019.03.06 06:57
GPT시스템에서 bcdboot를 실행하고자 할때 반드시 EFI 파티션을 마운트해야 하는줄 알았는데
UUID 값이나 LUN 번호로 접근할수 있었군요.
LUN 번호는 diskpart에서 list volume 하여 나오는 EFI 번호.
uuid는 mountvol (Linux의 mount에 준하는..) 하여 얻을수 있는데
EFI 마운트가 안됐을때 두가지 다 사용이 가능하네요.
UUID는 \\?\Volume 부분은 빼고 중괄호 부분만 써줘야 하고
LUN은 번호만 쓰거나 \Device\HarddiskVolume# (#은 번호) 형식을 쓸수 있습니다.
단 bcdedit /store ... 에서 마운트없이 하려면
맨 위 에러난것과 같이 \\?\Volume{uuid}\efi\microsoft\boot\bcd 처럼 경로를 써줘야 하며
이 접근법은 일반적인 dir 명령에서도 접근 가능합니다.
댓글 [7]
-
DarknessAngel 2019.03.06 08:17
-
Neutrino 2019.03.06 08:27
네 물론 지금 부팅한 efi 파티션을 업데이트 하자는건데 윈도우가 VHD인 경우
/s 없이 지금 해보니 Usage : 문구를 내주며 안되네요.
이젠 efi에 리눅스를 추가해볼건데 그쪽은 도대체 vhd 지원 움직임이 전혀 없는듯 하네요.
쓸데없는 Wubi는 왜만들었는지 _ _
-
DarknessAngel 2019.03.06 14:00
vhdx가 아닌 vhd 고정 크기라면 가능합니다 (이건 RAW니까요)
-
Neutrino 2019.03.06 18:36
그게 신기하게도 PXE에서는 RAW 이미지로 간주되어 부팅이 잘 되는데 로컬에서 직접부팅이 어려워요.
grub2의 kernel= 와 initrd= 에서 실패하여 (initramfs) 까지만 진행되고 그이상 진전을 못봤습니다.
그러니까 /boot 위치를 efi 파티션에 넣었고 커널까지는 주루룩~ 흐르지만 결정적으로 vhd를 / 로 마운트하지 못하네요.
아마도 initrd 자체가 vhd 지원으로 패치되지 않으면 불가한 문제로 사료되어
ext4 파티셔닝 외에는 답이 없는듯 합니다/
-
DarknessAngel 2019.03.06 21:42
바로 raw로 잡으시면 안 되고, 헤드부분만큼을 수치로 넣어서 집어넣지 않고, 그 이후부분을 디스크로 잡아서 처리하셔야 합니다
다만 부트로더 레벨에서 지원하게 하는건 현시점에서 힘들고, /boot는 별도의 외부 파티션 (어차피 efi쓰실테니 그냥 efi파티션 사이즈 키워서 거기 부트로더랑 같이 다 쑤셔박아버리면 편함)에 두셔야 합니다 (다만 loop써서 grub구성하시면 이넘들도 다 이미지에 넣어놔도 되긴합니다)
이렇게하면 부트로더 + kernel + initrd를 전부 다 기존대로 읽을 수 있으므로 작업이 쉬워집니다 (이렇게 해보신듯합니다만, vhd를 /로 마운트하도록 설정하는데 실패하신듯하군요)
전에 한번 성공했다는것 보고 그대로 따라해서 한번 성공후 손 안 되서 offset값등을 다 잊어버렸군요
-
Neutrino 2019.03.07 07:37
grub2가 vhd 지원으로 패치된 vboot를 사용했습니다.
initrd 수정은 VirtuanBox 도움을 받아 가능하고 grub.cfg의 해당부분은
set vhd=/vhd/Ubuntu.vhd set vdhost search --no-floppy -s root -f $vhd loopback lp0 $vhd tdisk=VHD linux (lp0,1)/vmlinuz root=/dev/vdhost/Partition1 vdisk=$vhd host=/dev/sda1 quiet splash initrd (lp0,1)/initrd.img
이런식인데 root= 이후부분의 뭔가를 아무리 수정해봐도 커널흐름이 끝나고 루트마운트가 안돼요.
-
DarknessAngel 2019.03.07 08:34
linux에서 vhd로 할려면 가장 간단한 방법은 grub2가 아닌 grub4dos를 쓰는겁니다
find --set-root --ignore-floppies /Test.vhd
map /Test.vhd (hd0)
map --hook
chainloader (hd0)
간단하게 이렇게만 해도 되었던걸로 기억합니다
두번째로 무식하게 vhd를 전부 램에 적재후 initrd를 뜯어고쳐서 부트 스크립트를 읽어서 처리하는 방법입니다 (사이즈상 무리라면 램 디스크를 뜯어서 부트 스크립트를 쑤셔박아서 부트하기전에 마운트할 수 있을듯 합니다)
세번째로 미시험이지만 libvhdio같은걸 쓰는 방법이 있습니다 (vmlite에 들어있는 grub2용 모듈 써보세요)
네번째로 kernel /ubuntu/vmlinuz root=/dev/disk/by-uuid/%UUID% kloop=/ubuntu/test.vhd kroot=/dev/mapper/loop0p1 이런식으로 마운트 하는 방법도 있는듯합니다 (미시험)
find --set-root --ignore-floppies --ignore-cd /ubuntu/test.vhd
uuid ()
set UUID=%?%
kernel /ubuntu/vmlinuz root=/dev/disk/by-uuid/%UUID% kloop=/ubuntu/test.vhd kroot=/dev/mapper/loop0p1 vga=792
initrd /ubuntu/initrd.img
boot안 되면
menuentry 'test.vhd' --class ubuntu {
insmod gzio
insmod part_msdos
insmod part_gpt
insmod ext2
insmod ntfs
insmod probe
set vhdfile="/ubt/test.vhd"
search -f --no-floppy --set $vhdfile
probe -u --set=uuid ${root}
loopback loop0 $vhdfile
linux (loop0,1)/vmlinuz root=/dev/disk/by-uuid/${uuid} rw kloop=$vhdfile kroot=/dev/mapper/loop0p1 vga=792
initrd (loop0,1)/initrd.img
}도 시험해봐주세요
다섯번째로 http://vdfuse.sourceforge.net 같은 프로젝트도 있으니 시험해봐주세요
추신 : 모든건 최근 가장 흔한 우분투/데비안 유포판 기준이고, 유포판마다 차이 있을 가능성 있습니다
추신2 : vhd를 static사이즈로 하는건 필수라고 생각해주세요
추신3 : VHD에 리눅스 설치하는 작업은 vm이나 vb같은 가상에서 vhd를 디스크로 마운트해서 리눅스 설치하는게 가장 확실하고 간단합니다
추신4 : 최근은 안 해봤는데, 성공하시면 어느걸로 성공하셨는지 쪽지라도 주세요
참고로 현제 부트시 사용한 efi파티션에 추가하는거라면 아에 /s를 생략해도 됩니다 (efi/bios무관하게 생략시 기본값=현제 부트 파티션)
PE등으로 부트한 경우에는 못 써먹지만, 현제 부트한 상태에서 다른 윈도를 멀티부트로 추가하는경우에는 이걸로 충분합니다