Dlaczego w ogóle potrzebne jest urządzenie pętli?


15

Wcześniej tworzyłem pliki obrazów za pomocą dd, konfigurowałem system plików na nich za pomocą mkfsi mount, aby uzyskać do nich dostęp jako zamontowane partycje. Później widziałem w Internecie, że wiele przykładów używa losetupwcześniej, aby wejść do urządzenia pętli /dev, a następnie zamontować. Nie mogłem powiedzieć, dlaczego praktycznie potrzebny jest plik obrazu, który zachowuje się jak urządzenie pętlowe i ma swój własny /devwpis, podczas gdy takie samo zachowanie można uzyskać bez wszystkich kłopotów.

Podsumowanie: W prawdziwym scenariuszu, dlaczego w ogóle potrzebujemy /dev/loopXwpisu, skoro możemy po prostu zamontować obraz fs bez niego? Jaki jest pożytek z urządzenia pętli?


9
„… podczas gdy takie samo zachowanie można uzyskać bez wszystkich problemów”. - Mylisz się;) - w systemie Linux nie można zamontować pliku bez „kłopotów” z urządzeniem pętli. Tyle, że w dzisiejszych czasach mountjest wystarczająco sprytny, aby zrobić dla ciebie kłopot. (jak pokazuje Stephen Harris w swojej odpowiedzi)
marcelm

Odpowiedzi:


22

Montowania zazwyczaj należy wykonywać na urządzeniach blokowych. Sterownik pętli umieszcza nakładkę urządzenia blokującego w pliku danych.

Jeśli wykonasz montaż w pętli bez, losetupsystem operacyjny zrobi to w tle.

na przykład

$ 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
$ 

Może być konieczne losetupbezpośrednie wywołanie, jeśli obraz pliku ma osadzone partycje.

np. jeśli mam ten obraz:

$ 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

Nie mogę tego zamontować bezpośrednio

$ 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

Ale jeśli używam, losetupa kpartxnastępnie mogę uzyskać dostęp do partycji:

$ 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
$

Nie potrzebujesz jawnego losetup, po prostu użyj mount -o loop,offset=$((512*2048)), gdzie 512jest rozmiar sektora i 2048to, co fdiskpodano Startna partycji.
Ruslan

Tak, to był tylko przykład użycia. W tym konkretnym przykładzie obliczenie przesunięcia może być łatwiejsze, ale mogą wystąpić przypadki użycia (np. Wiele partycji, które chcesz zamontować w tym samym czasie), w których łatwiej losetupi sprawiedliwie kpartx. Niech narzędzia wykonają ciężką pracę :-)
Stephen Harris

18

Systemy plików oczekują odczytu i zapisu na urządzeniach blokowych, ale pliki obrazów nie są urządzeniami blokowymi. Urządzenia pętli zapewniają urządzenie blokowe na górze pliku (lub inne urządzenie blokowe, opcjonalnie z odwzorowaniem).

W wielu przypadkach nie trzeba mountbrać pod uwagę urządzeń pętlowych, ponieważ dba o wszystko za Ciebie; ale urządzenia pętlowe są nadal zaangażowane. losetup -l -apokaże im.

Zobacz także Jaka jest różnica między mount a mount -o loop .


Więc blokowanie urządzeń jest domyślnie obsługiwane przez mount?
corsel

2
Tak, mountzajmuje się losetupdodawaniem -o loopitp.
Stephen Kitt

@corsel, W większości przypadków posiadanie polecenia montowania losetup działa dobrze, ale są wyjątki, takie jak montowanie wielu partycji z obrazu dysku.
hildred

11

Wygląda na to, że jesteś w systemie Linux, a Linux używa niewłaściwej nazwy dla tej funkcji.

Wynalazłem tę funkcję w 1988 roku na SunOS-4.0 i nazywam ją fbk- File emuluje urządzenie BlocK.

Tło jest takie, że sterownik urządzenia emuluje urządzenie blokowe na zwykłym pliku. Potrzebujesz tego, ponieważ system plików nie może używać zwykłego pliku jako pamięci w tle dla systemu plików. Potrzebuje raczej urządzenia blokowego i to właśnie fbkemuluje.

Od pewnego czasu niektóre osoby uczyniły program mountnieco bardziej sprytnym i istnieją implementacje montowania, które automatycznie tworzą fbkinstancję dla pliku na wypadek, gdyby mountprogram wykrył, że argument, który ma być urządzeniem blokowym, wydaje się być plikiem planu.


3
Bardzo imponujące CV, które masz na swoim profilu. Szacunek ...
corsel

11
Twój post jest nieco elitarny. Być może napisałeś pierwszą implementację, ale Linux używa innej implementacji, więc nie używa ona „złej” nazwy, tylko inną niż ta, którą wybrałeś dla swojej implementacji.
Austin Hemmelgarn

4
Nigdy nie mówiłem, że używają właściwego imienia, powiedziałem tylko, że twierdzenie, że jest niewłaściwe, sprawia, że ​​brzmisz jak uparty elita.
Austin Hemmelgarn

9
Nazwa „pętli” jest skrótem od „pętli zwrotnej” i odnosi się do sposobu, w jaki operacje na urządzeniu blokowym są „zapętlone” do VFS. Solaris 8 wprowadził urządzenie lofi(„plik pętli zwrotnej”), które działało podobnie; BSD wprowadziło je pod nazwą vnd(„dysk vnode”), więc koncepcja na przestrzeni lat miała wiele różnych nazw.
caf

2
Dwa najtrudniejsze problemy w CS: spójność pamięci podręcznej, nazewnictwo identyfikatorów i błędy off-by-one.
Jens

1

Nawet jeśli nie byłby potrzebny w tle do montowania systemów plików z plików, nadal byłby potrzebny do każdej instalacji za pomocą sterownika lub programu, który absolutnie oczekuje urządzenia blokującego. Pomyśl o serwerach NBD (Network Block Device), sterownikach urządzeń złożonych, takich jak mdraid, lvm itp.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.