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-setup je argument, pretože udisksctl má aj iné kompetencie
  • --read-only alebo -r zabraňuje náhodným poškodeniam, možno vynechať
  • --file alebo -f prijí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

  • --show vypíše loop zariadenie, používa sa s -f
  • --partscan alebo -P vytvorí particionované loop zariadenie
  • --read-only alebo -r zabraňuje náhodným poškodeniam, možno vynechať
  • --find alebo -f ná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-device alebo -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
  • --list alebo -l vypíš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
  • --list alebo -l vypíš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
  • --json alebo -J naformá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
    }
  ]
}
  • --raw vypíš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
  • --all alebo -a vypíš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-delete je argument pre podpríkaz
  • --block-device alebo -b špecifikuje loop zariadenie na označenie

losetup #

sudo losetup -d /dev/loop0
  • --detach alebo -d špecifikuje loop zariadenie na označenie
sudo losetup -D
  • --detach-all alebo -D odpojí 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 #