나는 OS 개발을 시도하고 있으며 부트 로더로 시작했습니다. 여기서 0단계는 ext4 파티션(첫 번째 LBA로 지정됨)의 파일(inode로 지정됨)에서 1단계를 로드합니다. 물론 부팅할 무언가가 필요해서 QEMU를 선택했습니다. 이제 뭐?
지금까지 잘 작동한 것은 다음과 같습니다.
truncate -s64M /tmp/SomeVolume
/sbin/mke2fs -t ext4 -F /tmp/SomeVolume
yasm phase0.asm
dd if=phase0 of=/tmp/SomeVolume conv=notrunc
약 64MB의 볼륨을 만들고 ext4로 포맷한 다음 처음 1024옥텟을 Phase0(항상 크기가 1024바이트임)으로 덮어씁니다. 이것은 잘 작동합니다.
하지만 이제는 보다 현실적인 시나리오를 위해 테스트하기 위해 적절하게 분할된 파일을 만들고 싶습니다. /sbin/cfdisk
볼륨 파일을 사용할 수 있다는 것을 알고 있지만 mke2fs
파일 내에서 범위를 선택할 수 있는 매개변수가 없습니다.
이제 나는 알고 있어요루프를 이용한 솔루션max_part
, 하지만 불행하게도 저에게는 작동하지 않는 것 같습니다( Debian jessie에서는 변경할 수 없는 것 같습니다 ). 있는 것 같다다른 모듈이 호출되었습니다.nbd
, 하지만 해당 모듈에 대한 서버와 클라이언트가 설치되어 있지 않습니다. 그리고 사용자 영역에서 분명히 수행될 수 있는 작업에 루트 권한이 필요하다는 사실이 조금 우스꽝스러워지고 있습니다.
사용자로서 이 작업을 어떻게 수행할 수 있습니까? 아니면 내가 만든 ext4 형식 파일 주위에 MBR/GPT 파티션 볼륨을 구축해야 합니까?
답변1
먼 길. 그러나 재미를 위해:
1.
임시 이미지를 만듭니다.
$ truncate -s64MiB tmp.img
2.
다음을 사용하여 두 개의 파티션을 만듭니다 fdisk
.
다소 자세하지만 괜찮습니다.
$ fdisk tmp.img
첫 번째 파티션:
: n <Enter>
: <Enter> (p)
: <Enter> (1)
: <Enter> (2048)
: +40M <Enter>
두 번째 파티션:
: n <Enter>
: <Enter> (p)
: <Enter> (2)
: <Enter> (83968)
: <Enter> (131071)
우리가 쓰려고 하는 내용을 인쇄하세요:
: x
: p
Nr AF Hd Sec Cyl Hd Sec Cyl Start Size ID
1 00 32 33 0 57 52 5 2048 81920 83
2 00 57 53 5 40 32 8 83968 47104 83
작성하고 종료합니다.
:w (Dont! forget ;-) )
40MiB와 23MiB의 두 파티션이 있습니다.
81920 * 512 / 1024 / 1024 = 40MiB
47104 * 512 / 1024 / 1024 = 23MiB
3.
두 개의 파일 시스템을 만듭니다.
truncate -s40MiB ext4.img
truncate -s23MiB ext3.img
mke2fs -t ext4 -F -L part_ext4 ext4.img
mke2fs -t ext3 -F -L part_ext3 ext3.img
4.
모두 함께 꿰매십시오.
2048*512
임시 이미지에서 첫 번째 바이트를 추출합니다 .
dd if=tmp.img of=disk.img bs=512 count=2048
그것들을 결합하십시오:
cat ext4.img ext3.img >> disk.img
괜찮은.
답변2
귀하의 질문을 정확하게 이해하고 있는지 잘 모르겠습니다. VM 이미지를 분할하려는 경우 다음과 같은 몇 가지 옵션이 있습니다.
각 파티션에 대해 선형 모드에서 루프 또는 장치 매퍼를 사용하십시오. 포맷을 위해 이러한 설정을 병렬로 수행할 필요는 없습니다.
파트엑스/kpartx루프/장치 매퍼 장치 또는 일반 파일에서 고려해야 할 파티션을 커널에 알리려면 다음을 수행하십시오.
kpartx -av /path/to/file
또는
losetup /dev/loopX /path/to/file kpartx -av /dev/loopX
장치는 장치 매퍼 장치입니다(즉,
/dev/mapper
기본적으로 에 연결됨).사용하여
partprobe
losetup /dev/loopX /path/to/file partprobe /dev/loopX
이는 커널에 파티셔닝을 확인하도록 지시하여
/dev/loopXpY
.VM에서 라이브 CD/USB 이미지(설치 프로그램일 수 있음)를 부팅하고 내부에서 파티셔닝을 수행합니다. 이는 특수 형식(예: QEMU의 qcow2 등)으로 저장된 VM 이미지의 경우에도 가상 드라이브를 분할할 수 있다는 분명한 이점이 있습니다.
답변3
http://blog.lifebloodnetworks.com/?p=934
이에 대한 정보가 있는 것 같습니다. 원시 디스크를 루프백 장치로 마운트할 수 있는 것 같습니다.
원시 디스크 이미지를 루프백 장치로 마운트합니다.losetup /dev/loop0 [path to image]
kpartx를 실행하고 다음을 수행합니다.kpartx -va /dev/loop0
이렇게 하면 각 X가 다른 파티션인 /dev/mapper/loop0pX에 파티션이 추가됩니다.
이제 각 파티션을 마운트할 수 있습니다:mount /dev/mapper/loop0pX /media/partition
백업에 아무 것도 쓰지 않으려면 읽기 전용으로 마운트하면 됩니다.mount -o ro /dev/mapper/loop0pX /media/partition
작업이 끝나면 청소를 해야 합니다.
마운트 해제: umount /media/partition
매퍼 장치 제거: kpartx -d /dev/loop0
루프백 장치 제거:losetup -d /dev/loop0
이러한 명령은 모두 루트로 실행해야 할 수도 있습니다. loop0이 사용 중이라고 보고하면 다른 루프 장치(/dev/loop1 등)를 선택하세요.
-편집: 루트가 아닌 사용자가 이 작업을 수행하려고 하므로 위의 내용이 유용하지 않을 수 있습니다.
답변4
max_part를 망칠 필요가 없습니다. parted
루프 장치에 파티션을 생성하거나 partprobe
파티션이 이미 있는 경우 활성화하는 데 사용합니다 . 테스트/불안정한 parted 버전으로 업그레이드해야 할 수도 있습니다.