Prístup k partíciám raw súborového systému bez potreby manuálne zadávať offset a size
# udisksctl
sudo pacman -S udisks2
man 1 udisksctl
# losetup
sudo pacman -S util-linux
man 8 losetup
udisksctl #
Oprávnenia root nie sú potrebné
udisksctl loop-setup --read-only --file <raw-image>.img
udisksctl loop-setup -rf <raw-file>.img
Mapped file raw-image.img as /dev/loop0.
Umiestnenie súboru image je zadané ako voľba
loop-setupje argument, pretože udisksctl má aj iné kompetencie--read-onlyalebo-rzabraňuje náhodným poškodeniam, možno vynechať--filealebo-fprijíma umiestnenie súboru raw súborového systému
Umiestnenie prvého nepoužitého particionovaného loop zariadenia, s ktorým bol image asociovaný, sa vypíše automaticky
losetup #
Vyžaduje oprávnenia root
sudo losetup --show --partscan --read-only --find <raw-image>.img
sudo losetup --show -Prf <raw-image>.img
/dev/loop0
Raw image súbor je zadaný ako argument
--showvypíše loop zariadenie, používa sa s-f--partscanalebo-Pvytvorí particionované loop zariadenie--read-onlyalebo-rzabraňuje náhodným poškodeniam, možno vynechať--findalebo-fnájde prvé nepoužité zariadenie
Kontrola je podrobnejšia, keďže väčšina akcií sa nespúšťa automaticky, ale explicitne
Zisťovanie a výpis #
udisksctl #
Poskytnutie informácií o konkrétnom loop zariadení
udisksctl info -b /dev/loop0
--block-devicealebo-bšpecifikuje loop zariadenie na zisťovanie
Nepôsobivý výstupný úryvok, skrátený
/org/freedesktop/UDisks2/block_devices/loop0:
org.freedesktop.UDisks2.Block:
...
PreferredDevice: /dev/loop0
ReadOnly: false
Size: 1845493760
Symlinks:
UserspaceMountOptions:
org.freedesktop.UDisks2.Loop:
Autoclear: false
BackingFile: raw-image.img
SetupByUID: 0
org.freedesktop.UDisks2.PartitionTable:
Partitions: /org/freedesktop/UDisks2/block_devices/loop0p1
/org/freedesktop/UDisks2/block_devices/loop0p2
Type: dos
Pozor: môže spôsobiť závrať
udisksctl dump
losetup #
Poskytnutie informácií o konkrétnom loop zariadení
losetup -l /dev/loop0
--listalebo-lvypíše informácie o konkrétnom loop zariadení
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0 0 0 0 1 image-A.img 0 512
Poskytnutie informácií o všetkých používaných loop zariadeniach
losetup -l
--listalebo-lvypíše informácie o všetkých používaných loop zariadeniach bez zadania konkrétneho
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0 0 0 0 1 image-A.img 0 512
/dev/loop1 0 0 1 0 image-B.img 0 512
--jsonalebo-Jnaformátuje výstup ako JSON, používa sa s-l
{
"loopdevices": [
{
"name": "/dev/loop0",
"sizelimit": 0,
"offset": 0,
"autoclear": false,
"ro": false,
"back-file": "raw-image.img",
"dio": false,
"log-sec": 512
}
]
}
--rawvypíše dáta bez nadbytočných medzier
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0 0 0 1 0 image-A.img 0 512
/dev/loop1 0 1 0 0 image-B.img 0 512
--allalebo-avypíše všetky používané loop zariadenia (ale prečo?)
/dev/loop0: []: (image-A.img)
/dev/loop1: []: (image-B.img)
Odstránenie #
Nastaví príznak autoclear — zariadenie bude uvoľnené okamžite keď nebude potrebné, alebo napríklad po odmontovaní
udisksctl #
udisksctl loop-delete -b /dev/loop0
Zariadenie je zadané ako voľba
loop-deleteje argument pre podpríkaz--block-devicealebo-bšpecifikuje loop zariadenie na označenie
losetup #
sudo losetup -d /dev/loop0
--detachalebo-dšpecifikuje loop zariadenie na označenie
sudo losetup -D
--detach-allalebo-Dodpojí všetky používané zariadenia
Záver #
Po vyskúšaní udisksctl aj losetup na prácu s loop zariadeniami a manipuláciu s raw obrazmi súborového systému, osobne oveľa viac preferujem losetup. Je to nástroj špecializovaný presne na túto úlohu a skoro nič iné, v súlade s UNIX filozofiou. Udisksctl bol navrhnutý pre trochu inú rolu a pokrýva širšie prípady použitia, jedným z ktorých je aj práca s loop zariadeniami.
Našiel som len jeden legitímny dôvod na použitie udisksctl pre túto úlohu — bol už nainštalovaný na mojom systéme, pretože naň závisejú napríklad mintstick a gnome-control-center.
Keby som chcel udržať systém čistý, snažil by som sa používať balíčky, ktoré sú už nainštalované, namiesto inštalácie nových. Ale hej, balíčky, ktoré priniesli udisks2 (závisia od neho), sú už dosť veľké UI nástroje, takže hovoriť tu o efektivite nie je celkom na mieste.
Oba spomínané nástroje dokážu prácu spraviť celkom dobre a líšia sa iba mierne v syntaxi. Kde sa líšia najviac, je formát výstupu dát. Losetup poskytuje viacero možností formátovania výstupu. Dokonca zahŕňa JSON, čo pôsobí definitívne oveľa modernejšie.
Zostavenie Dockerfile s raw výstupom losetup určite pôsobí rýchlejšie, keď nemusím tráviť veľa času parsovaním komplexných textových výstupov a môžem namiesto toho tráviť čas budovaním samotnej veci. Hoci nemôžem vymyslieť žiadny príklad použitia webovej technológie v spojení s losetup na využitie formátovania JSON výstupu.
Dajte mi vedieť o akýchkoľvek skutočných prípadoch použitia JSON výstupu tu, skutočne ma to zaujíma. Možno by to mohlo byť nazretie do inej vývojovej perspektívy.
Odkazy #
- https://en.wikipedia.org/wiki/Loop_device
- https://wiki.archlinux.org/index.php/udisks#Mount_loop_devices
- https://github.com/karelzak/util-linux
- https://github.com/storaged-project/udisks
- https://stackoverflow.com/questions/5881134/cannot-delete-device-dev-loop0
- https://unix.stackexchange.com/questions/520286/why-is-udisksctl-loop-setup-so-slow