Tradiční mount
Linux nepotřebuje žádnou speciální podporu pro to, abyste připojili obraz disku v souboru a mohli pracovat s jeho obsahem. Pokud jste root, stačí zavolat něco jako:
# mount -o loop disk.iso /mnt/data/
Tohle jste zřejmě věděli. Ve zvoleném adresáři se objeví obsah souborového systému a vy máte přístup k datům na disku. Tohle funguje dobře. Pokud jste root.
Jako běžný uživatel máte s tímto přístupem smůlu, protože obecné právo připojovat či odpojovat disky by vytvořilo v systému významnou bezpečnostní díru. Uživatel by mohl připojit cokoliv kamkoliv a nahradit tak libovolné systémové soubory svými vlastními.
Přístup k systémovému volání mount()
má tedy jen root. Utilita mount
má sice nastaven setUID bit a běží tedy vždy pod rootem, běžnému uživateli ale na požádání připojí jen ta média, u kterých je to výslovně povoleno v konfiguračním souboru /etc/fstab
.
Běžný uživatel
Ovšem i běžnému uživateli by se někdy hodilo mít možnost se takto pohodlně dostat k souborům na obrazu disku. Jednou z možností by bylo rozbalit si obraz pomocí nějaké utility ( 7z
rozumí například CD formátu ISO9660). To ovšem není totéž, jako zapisovat přímo do uloženého obrazu.
Můžeme chtít například upravit data na obraze virtuálního stroje, než ho nabootujeme. Nebo máme obraz ve formátu, kterému běžné kompresní utility nerozumí, ale náš systém s ním umí pracovat. Můžeme také jednoduše chtít pracovat s obrazem bez práv roota, protože každé jejich zbytečné použití je prostě zbytečné.
V Linuxu k takové akci poslouží velmi dobře balíček udisks2, který máte už dost možná už nainstalovaný v systému. Pokud ne, požádejte svého správce o instalaci. Už ho nebudete nikdy muset obtěžovat s požadavky na připojení uživatelských obrazů disků.
Příkaz udisksctl
Pokud máte balíček nainstalovaný, můžete používat utilitu udisksctl
, která je jeho součástí. Ta dovoluje připojovat obrazy disků do souborů v adresáři /dev
i běžnému uživateli. Může to dělat každý uživatel, který je oprávněný připojovat vyměnitelná média, tedy uživatel přihlášený na místní konzoli.
Základní použití je snadné, pokud už máte na disku obraz, zavolejte:
$ udisksctl loop-setup -f disk.img Mapped file disk.img as /dev/loop8.
Byl nám přidělen soubor /dev/loop8
, ve kterém je vidět obsah námi zadaného obrazu, jako by šlo o výměnné médium. Pokud máme v systému nějaký automounter, už si pravděpodobně všiml nového disku a připojil ho.
Pokud ne, můžeme to udělat ručně. Opět na to nemáme přímá oprávnění, takže využijeme udisksctl
a připojíme si obsah disku:
$ udisksctl mount -b /dev/loop8 Mounted /dev/loop8 at /media/ubuntu/mujdisk
Disk je připojený do adresáře pro připojení výměnných zařízení. Podadresář dostal název podle nálepky (Label) v souborovém systému. Pokud by žádnou neměl (nastavuje se pomocí e2label
), použije se UUID. Adresář se sice bude jmenovat jinak, ale výsledek bude stejný: máme přístup k souborům umístěným v daném obraze a můžeme s nimi pracovat pomocí běžných utilit.
Když chceme skončit, nejprve odpojíme přípojný bod a poté zrušíme mapování do /dev
:
$ udisksctl unmount -b /dev/loop8 $ udisksctl loop-delete -b /dev/loop8
Démon v pozadí
Možná vás zajímá, jak to celé funguje. Vězte, že v pozadí běží démon zvaný Disk Manager. Na disku je to binárka udisksd
a v systémech se systemd se o její spuštění stará jednoduchá služba udisks2.service
. Pro komunikaci obslužné utility a samotného démona pak slouží DBus, konkrétně jméno org.freedesktop.UDisks2
.
Kromě utility udisksctl
existuje také knihovna libudisks2
, která umožňuje volat funkce démona z vlastního kódu. Můžete tak nad funkcionalitou postavit další aplikaci nebo ji integrovat třeba do správce souborů.