루핑 없이 일반 파일의 볼륨을 분할하는 방법은 무엇입니까?

루핑 없이 일반 파일의 볼륨을 분할하는 방법은 무엇입니까?

저는 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_partDebian 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 이미지를 분할하려는 경우 다음과 같은 몇 가지 옵션이 있습니다.

  1. 각 파티션에 대해 선형 모드에서 라운드 로빈 또는 장치 매퍼를 사용합니다. 포맷하기 위해 이러한 설정을 동시에 수행할 필요는 없습니다.

  2. 부분/파텍스루프/장치 매퍼 장치 또는 일반 파일에서 고려해야 할 파티션을 커널에 알려줍니다.

    kpartx -av /path/to/file
    

    또는

    losetup /dev/loopX /path/to/file
    kpartx -av /dev/loopX
    

    이러한 장치는 장치 매퍼 장치입니다(즉, /dev/mapper기본적으로 from에 연결됨).

  3. 사용partprobe

    losetup /dev/loopX /path/to/file
    partprobe /dev/loopX
    

    이는 커널에 파티션을 확인하여 /dev/loopXpY.

  4. 가상 머신에서 라이브 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 버전으로 업그레이드해야 할 수도 있습니다.

관련 정보