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?
- 4467 megtekintés
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)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
A block eszközökön végre lehet hajtani olyan rendszerhívásokat (IOCTL) amiket egy fájlon nem. A loop driver célja az, hogy fizikai block eszközt emuláljon egy image fájlból.
- A hozzászóláshoz be kell jelentkezni
Mire gondolsz? Például? Az ATA parancsokat a blockeszköznek mondjuk? Teszem azt, a /dev/sda-nak lehet mondani, hogy állítsa le a motort, menjen standby-ba, vagy nyissa ki az ajtaját?
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
Na, azt hiszem, most jön az, hogy bedugom a pendrive-ot, és kipróbálom loop opció nélkül... Mindjárt nyilatkozom az eredményről. :)
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Nálam például ezt mondja a man mount: (Debian 7.0)
...
This type of mount knows about four options, namely loop, offset, size‐
limit and encryption, that are really options to losetup(8).
Naugye hogy naugye :)
- A hozzászóláshoz be kell jelentkezni
"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
- A hozzászóláshoz be kell jelentkezni
Szó nélkül berántja hozzá a loop device-t.
Ezért kell Linux mellett tucatnyi más UNIX-származékot is használni, az esetek 99+ százalékában nem fogják hasonlóképpen kinyalni a seggedet, és legalább megtanulod a "technikailag korrekt" használatot :)
- A hozzászóláshoz be kell jelentkezni
Há' nyalja csak, ha má' vasat raktam alá... :D
--
openSUSE 12.2 x86_64
- A hozzászóláshoz be kell jelentkezni
Igaz, viszont valljuk be, igen kényelmes ez így, valamint nem kell azon agyalni, hogyan derítsem ki, milyen filerendszer van az adott eszközön vagy image-ben, megállapítja, s felcsatolja.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Kényelmesnek kényelmes, de azért jobb az ilyet tudni :-)
- A hozzászóláshoz be kell jelentkezni
Tényleg ezt csinálja. :) 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.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
> 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 :)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
"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.
- A hozzászóláshoz be kell jelentkezni
Jóéjt és köszönöm a segítséget! :)
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Ú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
- A hozzászóláshoz be kell jelentkezni
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 ...
- A hozzászóláshoz be kell jelentkezni
Aham...:
/dev/loop0 /mnt/pen btrfs ro,seclabel,relatime,space_cache 0 0
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Nézd meg strace -f paranccsal, mit csinál a mount! Lehet, hogy meg fogsz lepődni? :)
Ma délután játszottam vele, mert a szűz openwrt nem bírta felcsatolni a pendrive-omat.
- A hozzászóláshoz be kell jelentkezni
Őszintén szólva nem vágyom strace-elni, de gyanítom, ezer felé forkolódik, vélelmezem, egy élesített fork-bomba. :)
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
A poén számomra az volt, hogy végigpróbálta valamennyi ismert fájlrendszer mountját, mire rátalált a megfelelőre.
- A hozzászóláshoz be kell jelentkezni