Tips en Trucs 2016

Bestandssystemen samenvoegen met mhddfs

Veronderstel, je bewaart muziek, foto's, video's, documenten of wat dan ook op een aparte schijf. Maar na een tijdje raakt die vol. Je hebt nog een harde schijf liggen, maar ook deze is niet groot genoeg om alle bestanden op te slaan. Hoe krijg je alle bestanden op de twee schijven. Er zijn twee oplossingen:

De eerste oplossing is veel werk, je moet uitzoeken welke bestanden je op de welke schijf zult plaatsen en daar dan ook steeds aan denken. En dan nog zal de ene schijf waarschijnlijk sneller vollopen dan de andere. De RAID oplossing lost het probleem op, maar ten koste van betrouwbare opslag of opslagruimte.

Onlangs vond ik een derde oplossing: mhddfs. Mhddfs is een FUSE module waarmee je verschillende kleinere bestandssystemen kunt combineren in één groot virtueel bestandssysteem. Dit virtueel bestandssysteem bevat alle bestanden van de deelnemende bestandssystemen en alle beschikbare opslagruimte. En in tegenstelling tot andere FUSE modules (zoals unionfs) kan je nieuwe bestanden aan het virtuele bestandssysteem toevoegen. Waar het bestand wordt opgeslagen, wordt op een intelligente manier door mhddfs bepaald.

Installatie

De standaard softwarebronnen van openSUSE Leap 42.1 bieden mhddfs niet aan. Als volgt installeer je in een terminal het mhddfs pakket uit de home:-miska-:virtio softwarebron:

dany@laptop:~> sudo /sbin/OCICLI https://software.opensuse.org/ymp/home:-miska-:virtio/openSUSE_Leap_42.1/mhddfs.ymp
root's password:
Als u verdergaat, dan worden de volgende installatiebronnen toegevoegd:
        * http://download.opensuse.org/repositories/home:/-miska-:/virtio/openSUSE_Leap_42.1/
Als verdergaat, dan zullen de volgende softwarepakketten worden geïnstalleerd op uw systeem:
        * mhddfs
Continue? y/N
y
Toevoegen van installatiebronnen...

Indien je voor de eerste keer de home:-miska-:virtio softwarebron gebruikt, moet je deze vertrouwen door de GnuPG-sleutel te importeren. Selecteer daarvoor met de Tab-toets de Vertrouwen knop en bevestig het de Return-toets.
Niet-vertrouwde GnuPG-sleutel importeren

Voorbeeld

Als voorbeeld gebruik ik twee USB Sticks, de ene staat vol bestanden, de andere is leeg. Het spreekt voor zich dat dit ook werkt met harde schijven. We willen dus de opslagruimte van de twee USB Sticks samenvoegen tot een opslagruimte die halfvol is. Eerst zorgen we voor mappen waar we de USB Sticks straks aan koppelen:

dany@laptop:~> sudo mkdir /mnt/sdb
dany@laptop:~> sudo mkdir /mnt/sdc

Plug de USB Sticks in de computer. Controleer of het besturingssysteem de USB Sticks opmerkt en welke apparaatnaam ze kregen:

dany@laptop:~> dmesg -T
...
[za aug 27 14:13:45 2016] usb 2-2: new high-speed USB device number 10 using xhci_hcd
[za aug 27 14:13:45 2016] usb 2-2: New USB device found, idVendor=13fe, idProduct=3600
[za aug 27 14:13:45 2016] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[za aug 27 14:13:45 2016] usb 2-2: Product: USB DISK 2.0
[za aug 27 14:13:45 2016] usb 2-2: Manufacturer:         
[za aug 27 14:13:45 2016] usb 2-2: SerialNumber: 07A30902E5A4B9F9
[za aug 27 14:13:45 2016] usb-storage 2-2:1.0: USB Mass Storage device detected
[za aug 27 14:13:45 2016] usb-storage 2-2:1.0: Quirks match for vid 13fe pid 3600: 4000
[za aug 27 14:13:45 2016] scsi host6: usb-storage 2-2:1.0
[za aug 27 14:13:46 2016] scsi 6:0:0:0: Direct-Access              USB DISK 2.0     PMAP PQ: 0 ANSI: 0 CCS
[za aug 27 14:13:46 2016] sd 6:0:0:0: Attached scsi generic sg1 type 0
[za aug 27 14:13:47 2016] usb 2-1: USB disconnect, device number 9
[za aug 27 14:13:47 2016] sd 6:0:0:0: [sdb] 7831552 512-byte logical blocks: (4.01 GB/3.73 GiB)
[za aug 27 14:13:47 2016] sd 6:0:0:0: [sdb] Write Protect is off
[za aug 27 14:13:47 2016] sd 6:0:0:0: [sdb] Mode Sense: 23 00 00 00
[za aug 27 14:13:47 2016] sd 6:0:0:0: [sdb] No Caching mode page found
[za aug 27 14:13:47 2016] sd 6:0:0:0: [sdb] Assuming drive cache: write through 
[za aug 27 14:13:47 2016]  sdb:
[za aug 27 14:13:47 2016] sd 6:0:0:0: [sdb] Attached SCSI removable disk
[za aug 27 14:13:51 2016] usb 2-1: new high-speed USB device number 11 using xhci_hcd
[za aug 27 14:13:51 2016] usb 2-1: New USB device found, idVendor=13fe, idProduct=3100
[za aug 27 14:13:51 2016] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[za aug 27 14:13:51 2016] usb 2-1: Product: USB DISK 2.0
[za aug 27 14:13:51 2016] usb 2-1: Manufacturer:         
[za aug 27 14:13:51 2016] usb 2-1: SerialNumber: 07A40802CF367103
[za aug 27 14:13:51 2016] usb-storage 2-1:1.0: USB Mass Storage device detected
[za aug 27 14:13:51 2016] scsi host7: usb-storage 2-1:1.0
[za aug 27 14:13:52 2016] scsi 7:0:0:0: Direct-Access              USB DISK 2.0     PMAP PQ: 0 ANSI: 0 CCS
[za aug 27 14:13:52 2016] sd 7:0:0:0: Attached scsi generic sg2 type 0
[za aug 27 14:13:53 2016] sd 7:0:0:0: [sdc] 7634944 512-byte logical blocks: (3.91 GB/3.64 GiB)
[za aug 27 14:13:53 2016] sd 7:0:0:0: [sdc] Write Protect is off
[za aug 27 14:13:53 2016] sd 7:0:0:0: [sdc] Mode Sense: 23 00 00 00
[za aug 27 14:13:53 2016] sd 7:0:0:0: [sdc] No Caching mode page found
[za aug 27 14:13:53 2016] sd 7:0:0:0: [sdc] Assuming drive cache: write through
[za aug 27 14:13:53 2016]  sdc:
[za aug 27 14:13:53 2016] sd 7:0:0:0: [sdc] Attached SCSI removable disk

Koppel de USB Sticks aan de mappen:

dany@laptop:~> sudo mount /dev/sdb /mnt/sdb
dany@laptop:~> sudo mount /dev/sdc /mnt/sdc

Bekijk welke opslagruimte beschikbaar is:

dany@laptop:~> df -h
Bestandssysteem Grootte Gebruikt Besch Geb% Aangekoppeld op
devtmpfs           3,9G        0  3,9G   0% /dev
tmpfs              3,9G     248K  3,9G   1% /dev/shm
tmpfs              3,9G     2,4M  3,9G   1% /run
tmpfs              3,9G        0  3,9G   0% /sys/fs/cgroup
/dev/sda4           79G      17G   61G  22% /
/dev/sda2          256M      57M  200M  22% /boot/efi
/dev/sda7          147G     113G   27G  81% /usr/home/Documents
/dev/sdb           3,8G     3,7G   38M 100% /mnt/sdb
/dev/sdc           3,7G     964K  3,7G   1% /mnt/sdc

Op /mnt/sdb is alle opslagruimte opgebruikt (100 % Gebruikt), terwijl /mnt/sdc leeg is (1% Gebruikt). Weer maken we een map aan om de samengevoegde opslagruimte aan te koppelen:

dany@laptop:~> sudo mkdir /mnt/virtual

De twee opslagruimtes voeg je samen met:

dany@laptop:~> sudo mhddfs /mnt/sdb,/mnt/sdc /mnt/virtual -o allow_other
mhddfs: directory '/mnt/sdb' added to list
mhddfs: directory '/mnt/sdc' added to list
mhddfs: mount to: /mnt/virtual
mhddfs: move size limit 4294967296 bytes

De optie -o allow_other zorgt dat alle gebruikers de nieuwe opslagruimte zien (en eventueel kunnen gebruiken) en niet alleen degene die ze aanmaakt. Wat het volgende resultaat oplevert:

dany@laptop:~> df -h
Bestandssysteem   Grootte Gebruikt Besch Geb% Aangekoppeld op
devtmpfs             3,9G        0  3,9G   0% /dev
tmpfs                3,9G     248K  3,9G   1% /dev/shm
tmpfs                3,9G     2,4M  3,9G   1% /run
tmpfs                3,9G        0  3,9G   0% /sys/fs/cgroup
/dev/sda4             79G      17G   61G  22% /
/dev/sda2            256M      57M  200M  22% /boot/efi
/dev/sda7            147G     113G   27G  81% /usr/home/Documents
/dev/sdb             3,8G     3,7G   38M 100% /mnt/sdb
/dev/sdc             3,7G     964K  3,7G   1% /mnt/sdc
/mnt/sdb;/mnt/sdc    7,4G     3,7G  3,7G  51% /mnt/virtual

Je merkt dat de gecombineerde opslagruimte de optelsom is beide opslagruimtes en in dit geval nog maar halfvol is (51% Gebruikt). Om het systeem te testen, maak je een bestand van 100 MByte op de gecombineerde opslagruimte aan:

dany@laptop:~> dd if=/dev/zero of=/mnt/virtual/toegevoegd.dat bs=1M count=100
100+0 records gelezen
100+0 records geschreven
104857600 bytes (105 MB) gekopieerd, 0,479066 s, 219 MB/s

Met de volgende drie opdrachten kan je nagaan hoe mhddfs werkt:

dany@laptop:~> ls -l /mnt/virtual/
totaal 102412
drwxr-xr-x  2 root root      4096 25 jul 15:46 Nieuwe map
-rwxr-xr-x  1 root root         0 25 jul 15:46 Nieuw tekstdocument.txt
drwxr-xr-x 17 root root      4096 27 jul 19:49 Sync
drwxr-xr-x  2 root root      4096  5 mrt 12:12 System Volume Information
-rwxr-xr-x  1 root root 104857600 27 aug 14:25 toegevoegd.dat
dany@laptop:~> ls -l /mnt/sdb
totaal 12
drwxr-xr-x  2 root root 4096 25 jul 15:46 Nieuwe map
-rwxr-xr-x  1 root root    0 25 jul 15:46 Nieuw tekstdocument.txt
drwxr-xr-x 17 root root 4096 27 jul 19:49 Sync
drwxr-xr-x  2 root root 4096  5 mrt 12:12 System Volume Information
dany@laptop:~> ls -l /mnt/sdc
totaal 102404
drwxr-xr-x 2 root root      4096  5 mrt 12:11 System Volume Information
-rwxr-xr-x 1 root root 104857600 27 aug 14:25 toegevoegd.dat

De eerste opdracht toont ons dat het bestand effectief naar de gecombineerde opslagruimte is weggeschreven. De tweede opdracht toont dat het bestand wegens plaatsgebrek niet naar de reeds volle opslagruimte werd geschreven. En de tweede opdracht toont dat het bestand naar de lege opslagruimte werd geschreven. Merk op dat de twee afzonderlijke opslagruimtes ook nog afzonderlijk te benaderen zijn.

Samengevoegde bestandssystemen

Wil je tijdens het opstarten van het systeem opslagruimtes samenvoegen, neem deze dan op in /etc/fstab. Zowel de samen te voegen bestandssystemen als de gecombineerde moet je in /etc/fstab opnemen. Met verwisselbare media zoals USB Sticks doe je dit beter niet en zorg je voor een ander oplossing zoals een script. Voor ons voorbeeld voeg je de volgende drie regels toe:

/dev/sdb                 /mnt/sdb             vfat       rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro              0 0
/dev/sdc                 /mnt/sdc             vfat       rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro              0 0
mhddfs#/mnt/sdb,/mnt/sdc /mnt/virtual         fuse       defaults,allow_other                                                                                              0 0

Voor je het systeem herstart, test je of alles werkt. Mocht dit om wat voor reden ook niet zo zijn dan start de volgende keer het systeem niet meer op:

dany@laptop:~> sudo umount /mnt/virtual/
root's password:
dany@laptop:~> sudo umount /mnt/sdb/
dany@laptop:~> sudo umount /mnt/sdc/
dany@laptop:~> sudo mount -a
mhddfs: directory '/mnt/sdb' added to list
mhddfs: directory '/mnt/sdc' added to list
mhddfs: mount to: /mnt/virtual
mhddfs: move size limit 4294967296 bytes

Samenvatting

Mhddfs is ideaal om met weinig moeite twee of meer bestandssystemen samen te voegen. Zelfs verschillende bestandssystemen. Mhddfs is dus ideaal om opslagruimten uit te breiden op het moment dat ze vol raken. Dit kan een harde schijf zijn die je uitbreidt met een tweede harde schijf, maar even goed een NAS met een tweede NAS, enz.

Mhddfs doet zijn werk zonder aan de werking van de oorspronkelijke opslagruimtes te raken. Dit heeft als voordeel dat je er steeds mee kunt stoppen, je verliest daarbij geen enkel bestand, ze staan nu enkel verspreid op twee verschillende opslagruimtes. Mhddfs doet wat het moet doen en doet dit goed (de echte Linux filosofie). Voor meer informatie raadpleeg je de man pagina's.