HOWTO use a SSD for the Raspbian OS rootfs ------------------------------------------ Hoe een SSD met USB-interface toe te passen voor het rootfs van Raspbian OS. KORT: de inhoud van de rootfs-partitie van de SD-card wordt gekloond naar de 1e ext4 geformatteerde partitie van de SSD en de locatie aanduiding van het rootfs in /boot/cmdline.txt op de SD-card wordt aangepast voor deze 1e partitie van de SSD. De bootpartitie voor het Raspbian OS blijft de 1e partitie op de SD-card. De procedure kan ook toegepast worden op een conventionele externe USB HD, al zal een powered USB-hub dan meestal nodig zijn. Auteur: louisl Update * 24-11-2014 (1e versie) * 12-05-2015: rsync opties -auvh veronderstelt wegens -u dat de lost+found op de SSD van recentere datum is dan die op de SD-card. * 20-05-2015: toegevoegd opmerkingen over stroomverbruik SSD en over swap. * 3-08-2015: bootpartitie toegevoegd aan text KORT + minor text wijziging. * 17-08-2015: fstrim probleem indien toegepast via USB-interface * 10-11-2015: rsync option: -H to preserve hardlinked files * 29-11-2015: rsync option: --delete-after (of: --delete-during) altijd, zie man rsync DISCLAIMER. Hoewel de procedure door de auteur met succes getest is: 0% garantie tot de hoek van de straat. De hier beschreven procedure is uitgevoerd met een Verbatim Store 'n' Go External SSD 64GB respectievelijk 128GB. Andere merken SSD's met USB-interface, zoals de Samsung Portable SSD T1 - 250GB, zullen het hier even goed doen. Een probleem is, dat het trim-commando fstrim niet ondersteund wordt via USB-interface. Een van de vele items hierover: http://w3facility.org/question/trim-and-ssd-with-usb-3-0-enclosure-does-not-work-uasp-not-supported/ Indien nodig is er wel een work-around mogelijk met bijv. de Samsung SSD 850 EVO 120 GB met installatiekit. Dit is een SATA SSD met een meegeleverde SATA USB 3.0 verloopkabel. Door de SSD op een SATA interface aan te sluiten kan fstrim wel toegepast worden (getest onder Ubuntu 14.04 LTS). Het commando is dan: sudo fstrim -v [mountpoint] Op de Raspberry Pi SD-card staan default 2 partities: 1) mmcblk0p1 (FAT32) ter grootte van circa 56 MB voor de directory /boot/ Dit blijft ongewijzigd. 2) mmcblk0p2 (ext4) voor het rootfs van Raspian OS. De inhoud van deze partitie wordt volgens onderstaand stappenplan gekloond naar de externe SSD. De file /boot/cmdline.txt wordt zodanig gemodificeerd dat voortaan het rootfs van de SSD gebruikt wordt in plaats het rootfs op de SD-card. De SD-card blijft gewoon dienstdoen, met dien verstande dat alleen /boot/ op de 1e partitie dan nog wordt gebruikt. Stap 1: Maak als u dat wilt een kloon aan van de Raspbian OS SD-card "voor de zekerheid". Zet met fdisk of gparted op de unmounted SSD met tenminste 1 partitie van bijv. 30 GB aan en breng op deze (1e) partitie het filesystem ext4 aan. Stap 2: Log in op de Rasberry Pi en wordt root (sudo su). File: /boot/cmdline.txt Copy (backup) deze file naar: /boot/cmdline.txt.orig Edit (met vi of nano) /boot/cmdline.txt: dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait Verander dit in: dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/sda1 rootfstype=ext4 elevator=deadline rootwait Dus: root=/dev/mmcblk0p2 wordt gewijzigd in root=/dev/sda1 Opmerking: deze modificatie van /boot/cmdline.txt op de SD-card kan ook off-line op een andere machine gedaan worden. Stap 3-a: Indien van toepassing: shutdown de Raspberry Pi. Sluit de SSD aan op een andere machine dan de Raspberry Pi. In dit voorbeeld nemen we aan, dat /dev/sdb1 staat voor de 1e partitie op de SSD. Mount (rw) met root-rechten de 1e partitie van de SSD (in dit voorbeeld) aan /tmp/sdb1 (maak dit mountpoint zonodig aan): # mkdir /tmp/sdb1 # mount /dev/sdb1 /tmp/sdb1 Deze 1e partitie op de SSD moet ext4 geformatteerd zijn en leeg zijn, op de file lost+found na. Stap 3-b: Sluit ook de Raspberry Pi SD-card aan op dezelfde andere machine. In dit voorbeeld nemen we aan, dat /dev/sdc2 staat voor de 2e partitie op de SD-card, waarop het rootfs staat. Mount deze partitie als root en ro (read-only) aan een zonodig aan te maken mountpoint /tmp/sdc2 , in dit voorbeeld (als root): # mount -o ro /dev/sdc2 /tmp/sdc2 Stap 4, Grande Truuc: Kloon, als root of met sudo, de inhoud van de Raspberry Pi rootfs-partitie naar de 1e partitie van de SSD. Dit kan met dd naar de ongemounte SSD, dan achteraf de 1e partitie op de SSD resizen (bijv. met fdisk, resize2fs). Hier wordt rsync toegepast, met als voordelen dat de rootfs-partitie op de SSD tevoren "op maat" gemaakt kan worden en de eventueel aanwezige overige partities (niet gemount!) op de SSD ongemoeid gelaten worden. Commando (als root), neem de syntax letterlijk over en let daarbij i.h.b. op de laatste / van /tmp/sdc2/ : ># rsync -auvhH --log-file=/tmp/rsync2ssd.log --delete-after /tmp/sdc2/ /tmp/sdb1/ ;echo ex=$? De rsync optie -H indien er op de source hard linked files zijn welke op de target ook hard linked dienen te zijn. De optie -u (update) kan handig zijn indien het rsync proces onderbroken wordt en later hervat dient te worden. In het 2e commando (op 1 regel) wordt de exit-value van het rscync commando uitgelezen. Als alles goed verlopen is is ex=0 en is in /tmp/ de logfile te vinden. Stap 5: Sluit de SSD op de stroomloze Raspberry Pi aan en doe de SD-card in het SD-slot van de Raspberry Pi. Start de Raspberry Pi (met de eerder beschreven gemodificeerde /boot/cmdline.txt). Als alles goed verlopen is wordt van de Raspbian OS SD-card voortaan alleen /boot/ gebruikt en wordt het rootfs inclusief /home/ etcera voortaan van de SSD gebruikt. De externe SSD moet uiteraard ALTIJD aangesloten blijven op een draaiende Raspberry Pi! Opmerkingen: 1) De in dit voorbeeld toegepaste Verbatim SSD met USB interface ondersteunt kennelijk niet het fstrim commando. Dit is na 2 jaar continu "intensief" gebruik geen bezwaar gebleken. 2) Door de auteur is op de SSD een 2e ext4-partitie met label aangebracht. Op deze partitie is een Samba fileshare gehuisvest. Mounten met LABEL=[het label van de partitie] middels regel in de /etc/fstab. Deze mount-regel dient NA de mount-regel voor de boot-partitie te staan. Toegepaste mount-regel voor de root-partitie in /etc/fstab : /dev/root / ext4 noatime,nodiratime,errors=remount-ro 0 1 Indien de SSD fstrim ondersteunt zou de mount-optie 'discard' toegepast kunnen worden. Zie voor optie "discard": man mount Andere optie voor toepassen fstrim is een scriptje aan te roepen via een symlink in /etc/cron.weekly/ . De opties noatime en eventueel nodiratime zijn er om het aantal schrijfacties naar de SSD ietwat te beperken. 3) Swap-partite of swap-file? Default heeft Rasbian-OS een swapfile van 100 MB met een swapiness waarde zodanig dat er weinig tot niets geswapped wordt. Er zou op de SSD i.p.v. de swapfile een swap-partitie van bijv. 512 MB gezet en gebruikt kunnen kunnen worden als dat van belang geacht wordt. 4) Let op stroomverbruik SSD, i.h.b. indien andere USB-devices aangesloten, zonodig powered USB-hub toepassen. Voedingsadapter dient bij 5V minstens 1500 mA of 2000 mA te kunnen leveren. 5) Analoge procedure getest voor Banana Pi M1+.