Mikor kell loop device mount-oláskor?

Fórumok

Sziasztok!

Arra kellett ráébredjek, nem tudom, mikor kell megadni a mount opciói között a loop-ot. A kérdés úgy merül fel, hogy készítettem egy live Linuxot, a pendrive elején van maga a live image, a pendrive közepétől pedig egy btrfs filerendszer, ehhez nem tartozik partíciós tábla, hiszen felesleges, mert tudom, milyen címre tettem a filerendszert. A blogom vége felé írok erről. Lényegében elbizonytalanodtam, hogy melyik forma a helyes. Az alábbi:

mount -o loop,offset=$OFFSET,compress=lzo,noatime "$DEVICE" "/mnt/$HNAME"

vagy ez:

mount -o offset=$OFFSET,compress=lzo,noatime "$DEVICE" "/mnt/$HNAME"

A DEVICE például /dev/sdb, vagy amit korábban megállapított magáról, lásd a blogban a kódrészletet.

Szóval hogy is van ez?

Hozzászólások

Csak találgatok: a loop az nem egy olyan image, amihez nem tartozik eszköz fájl?
(mknod és környéke)

Jó, de egy filerendszerhez minek eszköz file? Tehát mi a különbség aközött, ha egy fizikai eszközön hozok létre egy filerendszert, ahhoz képest, hogy azt egy eszközön lévő filerendszerben lefoglalt területen, egy fileban teszem?

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Akkor kell a loop device, ha nem block device-t csatolsz fel, hanem image fájlt. A "mount -o loop ..." parancs kiadásakor a loop driver létrehoz egy /dev/loopXX block device-t, és a mount valójában azt csatolja fel.

A "mount -o loop imagefile mountpoint" parancs kiváltható ezzel:

losetup /dev/loop0 imagefile
mount /dev/loop0 mountpoint

az umount után pedig a statikusan létrehozott /dev/loop0-t ezzel tudod megszüntetni:

losetup -d /dev/loop0

Ezt érteném, ha tudnám, miért teszünk különbséget device file és reguláris file között. A gondom az, hogy én a /dev/sdb-n lévő btrfs filerendszert is loop,offset=2147483648 paraméterrel csatoltam fel, működik is, noha a /dev/sdb maga is blockdevice. Ebben az esetben talán felesleges volt a loop opció.

Az zavar meg, hogy a 2 GiB-os offset használatával picit olyan, mintha a fizikai szektorokon egy image file lenne a filerendszer, de mivel az a fizikai eszközön van, így mégsem file, hiszen nem filerendszeren van. Avagy másképpen: minden fizikai eszközön lévő filerendszer éppen ilyen, legfeljebb nincsen offset.

Tehát akkor itt elhagyható a loop? Azzal, hogy én kiírtam, valamit redundásan csináltam, vagy az oprendszer rájött erre, és ignorálta a loop opciót? Az a bajom, hogy nem értem pontosan, miben más az eszközfile, ahol a fizikai eszközt érem el, az azon lévő byte-okat, s miben más a filerendszer egy file-ja, amikor az azon lévő byte-okra címzek.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Az általad megadott offset az a loop device opciója. A block eszközök "többet tudnak" mint a reguláris fájlok, tehát ahogy a loop device képes arra, hogy block eszközt emuláljon reguláris fájlból, úgy képes arra, hogy egy block device (megadott offsetű és méretű részéből) is megtegye.

A Linux egy olyan állatfajta, hogy sokmindent megcsinál kérés nélkül is. Például, bizonyos korlátok között kitalálja a fájlrendszer típusát, ha nem adod meg a mountnak a "-t" opciót.

Vígan el birom képzelni, hogy "csendben" berántja a loop opciót is automatikusan, ha szükség van rá - például, ha megadtad az offset opciót.

Próbáld ki, hogy mount előtt és után is kiadod a "losetup -a" opciót. Ha berántotta a loop-ot, akkor látni fogod a losetup kimenetében /dev/loopXX néven.

"Vígan el birom képzelni, hogy "csendben" berántja a loop opciót is automatikusan, ha szükség van rá"

Pl. .iso csatoláskor? Mert hogy én csak simán "mount valami.iso mappa" paranccsal csatolgatom mióta csak linuxozom, és sose nyivákolt, problémázott. Vagy az iso az más "állatfajta"?

--
openSUSE 12.2 x86_64

> Tényleg ezt csinálja. :)

Nnna, akkor ma sem sikerült hazudnom :)

> Tehát akkor elvileg kell neki a loop opció az általam kérdezett esetben, ám konkrétan
> mindegy, mert ha nem adom meg, akkor is úgy veszi, mintha megadtam volna.

Szerintem praktikus azért megtanulni mindennek a korrekt használatát, mert legközelebb eléd tesznek egy olyan rendszert, ami mérsékeltebben gondolatolvasó, aztán meg nézel nagyokat, hogy miért nem azt csinálja, amit szeretnél.

Szerk: ja bocs, ez utóbbit írtam már pár sorral feljebb. Na, most lesz az, hogy lefekszem aludni. Jóéjt :)

Egyetértek, csak megzavart, hogy itt az sdb maga is fizikai block device, s nem igazán érzem különleges feature-nek az offset-et, tehát azt a tényt, hogy picit más helyről kell olvasni, más helyre kell írni az adatot, mint offset nélkül. Szóval ehhez minek loop device, nem tudom, de elfogadom, hogy kell, ez ilyen.

Apropó, akkor az sdb1-hez miért nem kell? Mert a partíciós táblában megadott kezdőcím az éppen egy offset. Mindegy is, gyanítom, sosem tudom meg.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

"nem igazán érzem különleges feature-nek az offset-et, tehát azt a tényt, hogy picit más helyről kell olvasni, más helyre kell írni az adatot, mint offset nélkül"
Viszont a fajlrendszer implementacionak igy nem kell ezt kezelnie es nem futhatsz bele olyanba, hogy helytelenul kezeli es ossze-vissza ir neked a megadott offset helyett. A loop device elrejti ezt a reszletet es igy nincs gond.

"Apropó, akkor az sdb1-hez miért nem kell? Mert a partíciós táblában megadott kezdőcím az éppen egy offset."
Mert maga az sdb1 helyettesiti. Avagy a fajlrendszernek nem kell tudnia az offset-rol es a particio mereterol, mert a particio maga is egy block device.

Úgy látom, a mount igen intelligens. Egyrészt, a losetup-ot is megcsinálja - mondjuk ezt tudtam róla -, ugyanakkor, ha nem adom meg a loop opciót, s szükség lenne rá, nem hibát dob, hanem úgy működik, mintha megadtam volna:

mount -o ro,offset=2147483648 /dev/sdb /mnt/pen
mount | grep sdb

/dev/sdb on /mnt/pen type btrfs (ro,relatime,seclabel,space_cache)
losetup -a
/dev/loop0: [0005]:732487 (/dev/sdb), offset 2147483648
umount /mnt/pen

mount -o loop,ro,offset=2147483648 /dev/sdb /mnt/pen
mount | grep sdb

/dev/sdb on /mnt/pen type btrfs (ro,relatime,seclabel,space_cache)
losetup -a
/dev/loop0: [0005]:732487 (/dev/sdb), offset 2147483648
umount /mnt/pen

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Akkor most próbáld ki, hogy a mountolás után nem a sima "mount" paranccsal kérdezed le, hogy mi minden van felcsatolva, hanem a cat /proc/mounts-szal.

Előbbi ugyanis az mtab fájlból dolgozik, ahová a mountolás során a /dev/sdb-t írja be a mount bináris, merthogy ő azt kapta a parancssorában. Utóbbiból viszont látni fogod, hogy roppant mód nem a /dev/sdb van felcsatolva, hanem a /dev/loop0 ...