왜 루프 장치가 필요한가?


15

나는 이전에 사용하여 이미지 파일을 만드는 데 사용 dd, 사용하여에 파일 시스템을 설정 mkfs하고 mount파티션을 마운트로 그들에 액세스 할 수 있습니다. 나중에 인터넷에서 많은 예제가 losetup미리 아래 /dev에서 루프 장치 항목을 만든 다음 마운트하는 데 사용하는 것을 보았습니다 . 루프 장치로 작동하고 자체 /dev항목을 갖는 이미지 파일이 실제로 필요한 이유를 알 수 없었지만 모든 번거 로움없이 동일한 동작을 얻을 수 있습니다.

요약 : 실제 시나리오 /dev/loopX에서 fs 이미지를 마운트하지 않고 마운트 할 수 있는데 왜 엔트리가 있어야합니까? 루프 장치의 용도는 무엇입니까?


9
"... 모든 번거 로움없이 동일한 동작을 얻을 수 있습니다." -당신은 틀렸다;)-리눅스에서, 루프 장치의 "번거 로움"없이는 파일 마운트 할 수 없다 . 요즘 mount은 당신을 위해 번거 로움을 해줄만큼 영리합니다. (스티븐 해리스가 그의 답변에서
알 수 있듯이

답변:


22

마운트는 일반적으로 블록 장치에서 수행해야합니다. 루프 드라이버는 블록 장치 프런트 엔드를 데이터 파일에 넣습니다.

없이 루프 마운트를 수행 losetup하면 OS가 백그라운드에서 수행합니다.

예 :

$ dd if=/dev/zero of=/tmp/foo bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0798775 s, 1.3 GB/s
$ mke2fs /tmp/foo
mke2fs 1.42.9 (28-Dec-2013)
....


$ losetup    
$ mount -o loop /tmp/foo /mnt1    
$ losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         1  0 /tmp/foo
$ umount /mnt1
$ losetup
$ 

losetup파일 이미지에 파티션이 포함되어 있으면 직접 호출해야 할 수도 있습니다 .

예를 들어이 이미지가있는 경우 :

$ fdisk -l /tmp/foo2      

Disk /tmp/foo2: 104 MB, 104857600 bytes, 204800 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x1f25ff39

     Device Boot      Start         End      Blocks   Id  System
/tmp/foo2p1            2048      204799      101376   83  Linux

직접 장착 할 수 없습니다

$ mount -o loop /tmp/foo2 /mnt1
mount: /dev/loop0 is write-protected, mounting read-only
mount: wrong fs type, bad option, bad superblock on /dev/loop0,
       missing codepage or helper program, or other error

하지만 사용하는 경우 losetupkpartx그때 파티션에 액세스 할 수 있습니다 :

$ losetup -f /tmp/foo2
$ losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /tmp/foo2
$ kpartx -a /dev/loop0
$ mount /dev/mapper/loop0p1 /mnt1
$

당신은 명시하지 않아도 losetup바로 사용할 mount -o loop,offset=$((512*2048))경우, 512섹터 크기이며, 2048무엇 fdisk으로 준 Start파티션의.
Ruslan

예, 이것은 사용법의 예일뿐입니다. 이 특정 예제에서는 오프셋 계산을 쉽게 할 수 있지만 그것은 단지에보다 쉽게 할 수 있습니다 사용 사례 (동시에 탑재 할 예를 들어 여러 개의 파티션)이있을 수있다 losetupkpartx. 도구가 열심히 일하도록하십시오 :-)
Stephen Harris

18

파일 시스템은 블록 장치를 읽고 쓸 것으로 예상하지만 이미지 파일은 장치를 차단하지 않습니다. 루프 장치는 파일 위에 블록 장치를 제공합니다 (또는 다른 블록 장치 (선택적으로 리매핑 포함)).

대부분의 경우 이미지를 마운트 할 때 루프 장치를 고려할 필요가 없습니다 mount. 그러나 루프 장치는 여전히 관련되어 있습니다. losetup -l -a그들을 보여줄 것이다.

mount와 mount -o 루프의 차이점은 무엇입니까?를 참조하십시오 .


따라서 블록 장치-화는 암시 적으로 mount?
corsel

2
예, mount돌봐 losetup추가 -o loop
스티븐 키트

@corsel, 대부분의 경우 mount call losetup을 사용하면 정상적으로 작동하지만 디스크 이미지에서 여러 파티션을 마운트하는 것과 같은 예외가 있습니다.
11

11

Linux에 있고 Linux는 해당 기능에 잘못된 이름을 사용합니다.

1988 년에 SunOS-4.0 fbk에서이 기능을 발명 했으며이 기능을 호출했습니다 . 파일은 BlocK 장치를 에뮬레이트합니다.

배경은 장치 드라이버가 일반 파일 위에 블록 장치를 에뮬레이트한다는 것입니다. 파일 시스템은 일반 파일을 파일 시스템의 백그라운드 스토리지로 사용할 수 없으므로 이것을 필요로합니다. 오히려 블록 장치가 필요하며 이것이 fbk에뮬레이션됩니다.

때때로 어떤 사람들은 프로그램 mount을 좀 더 영리하게 만들었고 프로그램 이 블록 장치로 예상되는 인수가 대신 계획 파일 인 것으로 감지하는 fbk경우 파일에 대한 인스턴스를 자동으로 생성하는 마운트 구현이 mount있습니다.


3
프로필에서 얻은 인상적인 이력서. 존중 ...
corsel

11
귀하의 게시물이 다소 간결한 것으로 표시됩니다. 첫 번째 구현을 작성했을 수도 있지만 Linux는 다른 구현을 사용하므로 '잘못된'이름을 사용하지 않고 구현에 선택한 것과 다른 이름을 사용합니다.
Austin Hemmelgarn

4
나는 그들이 올바른 이름을 사용했다고 말한 적이없고, 단지 그것이 틀렸다고 주장하는 것은 당신이 평론가들과 같은 소리를 낸다고 말했다.
오스틴 헤멜 가른

9
'루프'이름은 "루프백"의 약자이며 블록 장치의 작업이 VFS로 "루프백"되는 방식을 나타냅니다. Solaris 8 lofi은 비슷하게 작동 하는 ( "루프백 파일") 장치를 도입했습니다. BSD는 그 이름 vnd( "vnode disk")으로 그것들을 소개하여 그 개념은 수년에 걸쳐 많은 다른 이름을 가졌습니다.
caf

2
CS에서 가장 어려운 두 가지 문제는 캐시 일관성, 식별자 이름 지정 및 일대일 오류입니다.
Jens

1

파일에서 파일 시스템을 마운트하기 위해 백그라운드에서 필요하지 않더라도 블록 장치를 절대적으로 기대하는 드라이버 또는 프로그램을 사용하는 설정에는 여전히 필요합니다. nbd (네트워크 블록 장치) 서버, mdraid, lvm 등과 같은 복합 블록 장치 드라이버를 생각하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.