내가 찾은 다음 스크립트를 사용하여 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
모든 전류 루프 장치를 에칭합니다.(그렇다면) fallocate
sa 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-linux
Debian wheezy의 패키지는 너무 오래되어 이 옵션이 없습니다.