저는 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 -av /path/to/file
또는
losetup /dev/loopX /path/to/file kpartx -av /dev/loopX
이러한 장치는 장치 매퍼 장치입니다(즉,
/dev/mapper
기본적으로 from에 연결됨).사용
partprobe
losetup /dev/loopX /path/to/file partprobe /dev/loopX
이는 커널에 파티션을 확인하여
/dev/loopXpY
.가상 머신에서 라이브 CD/USB 이미지(설치 프로그램일 수 있음)를 부팅하고 내부에서 파티션을 나누세요. 이는 특수 형식(예: QEMU의 qcow2)으로 저장된 가상 머신 이미지에 대해서도 가상 드라이브를 분할할 수 있다는 분명한 이점이 있습니다.
답변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 버전으로 업그레이드해야 할 수도 있습니다.