tarball에서 .img 생성: /dev/loop 장치

tarball에서 .img 생성: /dev/loop 장치

내가 찾은 다음 스크립트를 사용하여 tarball에서 .img를 만들려고 합니다.

#!/bin/bash

# Packages required
# dosfstools parted 
# Can be run on any Linux system
# loop.max_part=15 must be in kernel cmdline (cmdline.txt for rpi)
# then reboot

echo "creating image to fit on 2Gb card"
dd if=/dev/zero of=arch-rpi.img bs=1M count=1850

echo "Partitioning"
fdisk arch-rpi.img <<EOF
o
n
p
1

+100M

t
c
n
p
2


w
EOF

sleep 5

losetup -f arch-rpi.img
sleep 5

echo "Formatting vfat"
mkfs.vfat /dev/loop0p1
sleep 5
mkdir boot
echo "Mounting boot"
mount /dev/loop0p1 boot
echo "Installing"

echo "Formatting ext4"
mkfs.ext4 /dev/loop0p2
sleep 5
mkdir root
echo "Mounting root"
mount /dev/loop0p2 root

wget http://archlinuxarm.org/os/ArchLinuxARM-rpi-latest.tar.gz
echo "Installing"
bsdtar -xpf ArchLinuxARM-rpi-latest.tar.gz -C root
sync
mv root/boot/* boot
sync
umount boot root
losetup -d /dev/loop0p1
losetup -d /dev/loop0p1
losetup -d /dev/loop0
echo "All complete, image arch-rpi.img created, compressing...."
zip -9 arch-rpi.img.zip arch-rpi.img

저는 Raspberry Pi - Raspbian Wheezy에서 이 작업을 수행하고 있습니다. 해당 줄에 도달하면 mkfs.vfat /dev/loop0p1해당 파일/디렉토리가 없다고 표시됩니다. 나는 Linux에서 .img를 루프 장치로 마운트한 다음 mkfs를 사용하여 타르볼용 이미지를 준비하려고 한다는 것을 충분히 읽었지만 왜 Loop0p# 파일이 그렇지 않은지 잘 모르겠습니다. 거기에는 로 나열되어 있습니다 fdisk -l. 내가 찾은 이 스크립트가 작동하도록 하려면 어떻게 해야 합니까?

답변1

losetup -P할당을 생성 하는 데 사용되는 루프 장치가 필요합니다 -P. 그렇지 않으면 원래 루프 장치를 분할한 다음 partx -u커널의 파티션 테이블을 업데이트해야 합니다. 장치 /dev/loop0p가 나타납니다뒤쪽에커널은 파티션이 실제로 분할되어 있음을 인식합니다. 부분적으로는 그 뒤에 숨은 의도일 수도 있지만 sleep 5거의 확실하게 하나 sync이거나 둘 다여야 합니다.

어쨌든 증명하려면:

sudo sh -s <<\IN
    losetup -D                          
    fallocate "-l$((1024*1024*1024))" loop        
    printf %s\\n n '' '' '' ''  w y | gdisk loop
    sync; losetup -f loop
    lsblk /dev/loop*
IN

따라서 위의 시퀀스는 먼저 -D모든 전류 루프 장치를 에칭합니다.(그렇다면) fallocatesa 1GB tmp 파일에 GPT 파티션 테이블을 작성하고 단일 파티션을 만든 다음 sync파일 시스템을 생성하고 이를 -f사용 가능한 첫 번째 루프 장치에 할당한 다음 사용 가능한 모든 루프 장치를 나열해 봅니다 lsblk. 다음과 같이 인쇄됩니다.

NAME  MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0   7:0    0   1G  0 loop 

하지만해당 줄을 다음과 같이 변경 하면 losetup:

losetup -fP loop

...대신 인쇄됩니다.

NAME      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0       7:0    0    1G  0 loop 
├─loop0p1 259:0    0 1023M  0 loop 
└─loop0p2 259:1    0 1007K  0 loop 

... losetup백업 파일의 파티션 테이블이 먼저 스캔되기 때문입니다. 보시다시피 추가 1M을 알아차리기보다는 별로 좋지 않습니다.(사실 이것은 분할된 테이블의 마지막 반복임이 거의 확실합니다)할당되지 않은 공간으로 별도의 파티션으로 해석하지만 아마도 tmpfs에 쓰고 있기 때문일 것입니다.(연속 두 번)1GB 파일홀 외에 실제 데이터로 작업하는 것이 더 정확할 것입니다.(그리고 스크립트처럼 지원 파일을 0으로 설정하면 dd어쨌든 이 문제가 처리됩니다.). 어쨌든 - mkfs.whatever그러면 실제 파티션에서 자유롭게 할 수 있습니다 mount. 같은 결과를 partx -u얻을 것입니다./dev/loop0

답변2

파티셔닝 지원은 드라이버에서 선택 사항이며 loop드라이버를 로드할 때 매개변수에 의해 결정됩니다. max_part기본값은 0이므로 루프 드라이버는 파티션을 찾지도 않습니다. 값이 0이 아니면 드라이버는 그만큼의 파티션을 지원합니다. 커널 빌드 옵션에 따라 드라이버가 커널에 포함될 수 있습니다. 이 경우 loop.max_part=…부팅 시 커널 명령줄을 전달해야 하거나 모듈로 로드해야 합니다. 이 경우 max_part=…부팅 시 로드된 모듈을 전달해야 합니다.

Debian에서 wheezy loop는 모듈이며 max_part매개변수가 전달되지 않습니다. 파티셔닝 지원을 받으려면 모듈을 언로드하고 매개변수를 사용하여 다시 로드하십시오 max_part(먼저 다음을 사용하여 기존 루프 장치를 비활성화해야 합니다 losetup -d:

if lsmod | grep -wq loop; then rmmod loop; fi
modprobe loop max_part=31

options loop max_part=31추가하여 기본값으로 설정할 수 있습니다 /etc/modprobe.conf.

모듈을 언로드할 수 없는 경우(또는 loop커널이 내장된 배포판에서 재부팅) 수동으로 파티션의 오프셋을 계산 -o하고 losetup. 전체 디스크 이미지에서 파일 시스템 읽기

최신 배포판을 사용하세요.losetup -P루프 장치를 설정할 때 사용할 수 있습니다.:


losetup -P -f arch-rpi.img

하지만 util-linuxDebian wheezy의 패키지는 너무 오래되어 이 옵션이 없습니다.

관련 정보