mount

  1. Maszyna wirtualna ma dostęp do urządzenia blokowego /dev/vdb (blkid). Poniższe komendy tworzą na tym urządzeniu tablice partycji gpt i dwie partycje podstawowe:

    # parted -s /dev/vdb mktable gpt print
    # parted -s /dev/vdb mkpart primaty 1    200  print
    # parted -s /dev/vdb mkpart primary 200 1000  print
    

    Teraz można na tych partycjach utworzyć system plików Ext4:

    # mkfs -t ext4 -m0 /dev/vdb1
    # mkfs -t ext4 -m0 /dev/vdb2
    

    i sprawdzić zawartość superbloku każdego z nich (tune2fs -l \dev/vdb1|2). Zawartość superbloku i informacje o grupach bloków można uzyskać przy pomocy komendy dumpe2fs /dev/vdb1|2).

    Należy także utworzyć w katalogu /mnt dwa podkatalogi (vdb1|2), utworzyć w nich jakiś plik (touch vdb1/x1 vdb2/x2), a następnie przeanalizować wyniki komend:

    # stat /mnt
    # stat /mnt/vda1; stat /mnt/vda1/x1
    # stat /mnt/vda2; stat /mnt/vda1/x2
    

    Tak przygotowane partycje mogą zostać zamontowane w katalogach /mnt/vdb1 i /mnt/vdb2, pod warunkiem, że jądro zawiera moduł do obsługi system plików Ext4. Przy pomocy komendy lsmod można sprawdzić jakie moduły zostały załadowane i czy wśród nich jest moduł ext4.

    # mount /dev/vdb1 /mnt/vdb1/
    # mount /dev/vdb2 /mnt/vdb2/
    # mount
    

    Teraz należy ponownie przeanalizować wyniki działania komend:

    # stat /mnt
    # stat /mnt/vda1; stat /mnt/vda1/x1
    # stat /mnt/vda2; stat /mnt/vda1/x2
    

    i porównać z wynikami wcześniejszymi.

  2. Zmodyfikuj poprzednie zadanie zakładając na partycji /dev/vda2 system plików VFAT. Systemu VFAT nie wykorzystuje pojęcia i-węzła. Dlaczego zatem wynik działania komendy stat /mnt/vsd2/x2 wygląda następująco

      File: ‘x2’
      Size: 0               Blocks: 0          IO Block: 2048   regular empty file
    Device: fd12h/64786d    Inode: 3           Links: 1
    Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2022-01-20 21:03:58.000000000 +0100
    Modify: 2022-01-20 21:03:58.000000000 +0100
    Change: 2022-01-20 21:03:58.000000000 +0100
    Birth: -
    
  3. Porównaj działanie komend mount oraz findmnt.

  4. Jakie znaczenie mają parametry Mount count i Maximum mount count (man tune2fs)?

  5. Korzystając z testowego systemu plików (np. /dev/vdb1) nadaj parametrowi Maximum mount count wartość 3.

    Przeanalizuj działanie następującej sekwencji komend:

    # tune2fs  -l /dev/vdb1 | grep -i count
    # mount /dev/vdb1 /mnt/vdb1; umount /mnt/vdb1
    # fsck /dev/vdb1
    # mount /dev/vdb1 /mnt/vdb1; umount /mnt/vdb1
    # fsck /dev/vdb1
    # tune2fs  -l /dev/vdb1 | grep -i count
    # mount /dev/vdb1 /mnt/vdb1; umount /mnt/vdb1
    # tune2fs  -l /dev/vdb1 | grep -i count
    # fsck /dev/vdb1
    # tune2fs  -l /dev/vdb1 | grep -i count
    
  6. Przygotuj testowe systemy plików ext4 na urządzeniach /dev/vdb1 i /dev/vdb2 oraz dodaj do /etc/fstab wiersz:

    /dev/vdb1     /mnt/vdb1 ext4   defaults 0 0
    

    Jakie są domyślne opcje montowania? Zob. man mount

  7. Sprawdź działanie opcji (no)exec:

    # mount /mnt/vdb1; mount | grep vdb1
    # mount -o remount,noexec /mnt/vdb1; mount | grep vdb1
    # cp /usr/bin/ping /mnt/vdb1
    # /mnt/vdb1/ping localhost
    # mount -o remount,exec /mnt/vdb1
    # /mnt/vdb1/ping localhost
    
  8. Sprawdź działanie opcji (no)dev:

    # mkfs.vfat /dev/vdb2
    # mkdir /mnt/vdb1/dev; cp -aL /dev/vdb2 /mnt/vdb1/dev
    # mount /mnt/vdb1/dev/vdb2 /mnt/vdb2
    # df -T; umount /mnt/vdb2
    # mount -o remount,nodev /mnt/vdb1
    # mount /mnt/vdb1/dev/vdb2 /mnt/vdb2
    
  9. Sprawdź działanie opcji (no)suid:

    # mount /mnt/vdb1; mount | grep vdb1
    # mount -o remount,nosuid /mnt/vdb1; mount | grep vdb1
    # cp /usr/bin/passwd /mnt/vdb1
    # su - labul
    # /mnt/vdb1/passwd
    
  10. Sprawdź działanie opcji (a)sync:

    # mount /mnt/vdb1; mount | grep vdb1
    # time dd if=/dev/zero of=/mnt/vdb1 bs=1M count=500
    # mount -o remount,sync /mnt/vdb1;
    # time dd if=/dev/zero of=zero bs=1M count=500
    
  11. W czasach, kiedy nie było narzędzi do zarządzania urządzeniami w przestrzeni użytkownika (zob. następne zadanie), trzeba było używać innych metod. Jako superużytkownik utwórz na urządzeniu /dev/vdb1 system plików ext4 i utwórz w nim katalog labul tak, żeby labul był jego właścicielem. Następnie umieść w /etc/fstab następujący wpis:

    /dev/vdb1   /mnt/vdb1  ext4 rw,user 0 0
    

    Czy użytkownik labul może zamontować ten zasób? Czy może w podkatalogu labul umieszczać pliki?

    Co się dzieje jeśli opcje “rw,user” zamienić na “defaults”?

  12. Montowanie przy pomocy komendy mount wymaga uprawnień superużytkownika. Komenda udisksctl (man udisksctl) pozwala zwykłemu, nieuprzywilejowanemu użytkownikowi na przeprowadzenie operacji montowania. Jako użytkownik labul wykonaj komendy:

    # udisksctl mount -b /dev/vdb1
    # df -Ph
    

    Gdzie zasób dyskowy został zamontowany? Czy użytkownik labul może tworzyć i modyfikować pliki w podkatalogu labul?

  13. Co należy zrobić, żeby użytkownik labul nie musiał podawać swojego hasła przy każdej próbie montowania?

    Jako użytkownik root wykonaj komendy:

    # cd /etc/polkit-1/rules.d
    # wget http://jkob.fizyka.umk.pl/labul/scripts/50-udisks.rules
    # systemctl restart polkit
    

    Jako użytkownik labul wykonaj komendę udisksctl mount -b /dev/vdb1.

    Uwaga! Przed przystąpieniem do tego ćwiczenia zakomentuj w pliku /etc/fstab wpis dotyczący montowania urządzenia /dev/vdb1. Po zakończeniu ćwiczenia odkomentuj ten wpis i – jako użytkownik labul – wykonaj montowanie zasobu przy pomocy komendy udisksctl. Czy w obu przypadkach zastosowanie komendy udisksctl daje ten sam efekt?

  14. Chcąc udostępnić jakis system plików w kilku odrębnych punktach montowania można go oddzielnie w tych miejscach montować. Lepiej posłużyć sie opcją --bind. Przeanalizuj konsekwencje zastosowania nastepującej sekwencji komend:

    # mkdir /vdb1 /mnt/root
    # mount /dev/vdb1 /vdb1
    # mount --bind / /mnt/root
    # ls /mnt/root/etc
    # ls /mnt/root/dev
    # ls /mnt/root/vdb1
    
    # mount --bind /dev /mnt/root/dev/
    # mount --bind /vdb1 /mnt/root/vdb1
    
    # chroot /mnt/root
    # ls /dev; ls /vdb1
    

    Zob. http://docs.1h.com/Bind_mounts

  15. Przeanalizuj działanie urządzeń specjalnych /dev/loop0, /dev/loop1, …

    • Utwórz dwie partycje /dev/vdb[12] po 200 MB każda i utwórz na nich system plików ext4. Na partycję /dev/vdb1 skopuj /bin, a następnie ją zarchiwizuj przy pomocy komendy dd.

    • Niech partycja /dev/vdb2 będzie kopią partycji /dev/vdb1 utworzoną przy pomocy jej obrazu vdb1.img. Porównaj zawartość obu partycji.

    • W jaki sposób sprawdzić zawartość obrazu partycji bez kopiowania go na istniejącą partycję?

    • Pobierz dsl.iso i sprawdzić zawartość katalogu boot (plik isolinux.cfg).

  16. Zapoznaj się z komendą sshfs, która wykorzystując ssh i system plików w przestrzeni użytkownika FUSE (Filesystem in Userspace) pozwala na zamontowanie katalogu domowego ze zdalnego serwera. Zob. skrypt sshfsctl.