루프 없이 일반 파일의 볼륨을 분할하려면 어떻게 해야 합니까?

루프 없이 일반 파일의 볼륨을 분할하려면 어떻게 해야 합니까?

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

  1. 각 파티션에 대해 선형 모드에서 루프 또는 장치 매퍼를 사용하십시오. 포맷을 위해 이러한 설정을 병렬로 수행할 필요는 없습니다.

  2. 파트엑스/kpartx루프/장치 매퍼 장치 또는 일반 파일에서 고려해야 할 파티션을 커널에 알리려면 다음을 수행하십시오.

    kpartx -av /path/to/file
    

    또는

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

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

  3. 사용하여partprobe

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

    이는 커널에 파티셔닝을 확인하도록 지시하여 /dev/loopXpY.

  4. 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 버전으로 업그레이드해야 할 수도 있습니다.

관련 정보