2014년 12월 21일 일요일

Loop device

이전글 "디스크 파티션 분석"에서 램디스크를 사용하여 가상의 블럭장치를 만들었다. 가상의 블럭 장치를 만들기 위한 더 일반적인 방법은 루프 장치를 사용하는 것이다. 아래와 같은 명령으로 루프 장치를 만들 수 있다.

먼저 dd 명령으로 가상 블럭 장치로 사용할 512KB 크기의 VirtualDisk.img라는 파일을 만든다. 
# dd if=/dev/zero of=VirtualDisk.img bs=512 count=1024  
1024+0 records in
1024+0 records out
# ls -l ./VirtualDisk.img 
-rw-rw-r--   1 root      root         524288 Dec 21 15:50 ./VirtualDisk.img

이제 devb-loopback을 실행시켜 해당 파일을 루프 장치로 연결한다. (루프 장치란, 파일을 블록장치로 매핑한 pseudo-device를 일컫는다. 블록 장치이므로 포맷 후 원하는 디렉토리에 마운트하여 사용할 수 있다.  루프 장치를 루프백 장치라고도 부르는데, 루프백 장치는 네트워크 장치에서 사용하는 용어와 겹치므로 루프백 장치라고 부르면 안된다는 의견이 있으나, QNX Neutrino에서는 루프백 장치라는 용어를 사용한다)
# devb-loopback loopback blksz=512 fd=./VirtualDisk.img
# ls -l /dev/lo*
brw-------   1 root      root         9,   0 Dec 21 15:54 /dev/lo0
# df -P /dev/lo* 
Filesystem            512-blocks      Used Available Capacity  Mounted on      
/dev/lo0                    1024      1024         0     100%   

참고: 만일 리눅스에서 루프 장치를 만든다면 다음과 같이 해야 한다.
$ sudo losetup /dev/loop0 ./VirtualDisk.img

아래를 보면 Sector(Block Size)크기가 512 이며 1024개의 실린더로 생성 되었음을 알 수 있다.
# ls -l /dev/lo* 
brw-------   1 root      root         9,   0 Dec 21 15:59 /dev/lo0
# df -P /dev/lo0
Filesystem            512-blocks      Used Available Capacity  Mounted on      
/dev/lo0                    1024      1024         0     100%                  
# fdisk -z /dev/lo0

FDISK
Ignore Next Prev Change Delete Boot Unboot Restore Loader Save Quit

        _____OS_____     Start      End     ______Number_____    Size    Boot  
        name    type    Cylinder  Cylinder  Cylinders  Blocks                  

--> 1.  ______ (___)    _______   _______   _______   _________  _____
    2.  ______ (___)    _______   _______   _______   _________  _____
    3.  ______ (___)    _______   _______   _______   _________  _____
    4.  ______ (___)    _______   _______   _______   _________  _____


 Choose a partition by typing the partition number OR moving the pointer
 with the UP/DOWN arrows.
 Then, choose one of the actions on the top line of the screen.
          


Drive : /dev/lo0                    Config:     1 Heads
Size  : 0 Mbytes                                1 Sectors/track
Loader: None                                 1024 Cylinders
Blocks: 1024                                  512 Block Size

                                    Last cylinder is 1023

이전글 "디스크 파티션 분석"에서 QNX fdisk가 실린더 경계에서만 파티션 시작이 가능하여 MBR/VBR/EBR등이 위치한 실린더에 첫번째 섹터를 제외한 나머지 섹터들이 낭비되었는데, 위와 같이 실린더당 섹터가 하나씩만 가지도록 설정하면 이러한 낭비를 막을 수 있다. 물론 실제 물리 블록 장치의 경우 실린더당 섹터는 물리적으로 정해져 있으므로 낭비는 피할 수 없다. (참고: 리눅스의 fdisk는 섹터 단위로 파티션 위치를 설정할 수 있으므로 이러한 낭비가 발생하지 않는다. )

# mkdosfs /dev/lo0 

Format complete: FAT12 (4096-byte clusters), 492 kB available.

별로도 파티션을 만들지 않고 위와 같이 통째로 포맷을 하면, MBR없이 첫 섹터에 VBR이 생성되며 사용 가능한 상태가 된다. (물론 파티션을 나눌 수도 있다)
# mount -tdos /dev/lo0 /mnt/dos

# mount
/dev/hd0t179 on / type qnx6 
/dev/lo0 on /mnt/dos type dos (fat12) 

# df -P /mnt/dos
Filesystem            512-blocks      Used Available Capacity  Mounted on      
/dev/lo0                     984         0       984       0%  /mnt/dos/