Raspberry: File system root su USB
La scheda SD di Raspberry non è troppo affidabile, specie in eventi come la caduta di tensione. Alcuni modelli di SD sono meglio di altri, ma è facile incorrere in corruzione di dati e malfunzionamenti del sistema.
La scheda SD non può essere eliminata, perché è l'unico dispositivo che Pi riconosce per alcune funzioni di inizializzazione. Limitandone l'uso per il semplice boot, e spostando il fs di root su altro dispositivo, si riduce le operazioni su SD e si prevengono molti problemi.
Le operazioni da fare per migrare la root du chiave USB sono relativamente semplici:
Si installa il sistema operativo, Raspbian nel mio caso, si configurano le parti essenziali come tastiera e accesso alla rete (raspi-config).
E' bene non non fare aggiornamenti (update/upgrade), ne estendere il file system per evitare di aggiungere datie ed usare ulteriormente la scheda SD.
Con il comando df -h è possibile visualizzare lo stato dei fs in essere.
root@my_pi:~# df -h
File system Dim. Usati Dispon. Uso% Montato su
rootfs 6,3G 2,6G 3,4G 43% /
/dev/root 6,3G 2,6G 3,4G 43% /
devtmpfs 460M 0 460M 0% /dev
tmpfs 93M 240K 93M 1% /run
tmpfs 5,0M 0 5,0M 0% /run/lock
tmpfs 186M 0 186M 0% /run/shm
/dev/mmcblk0p1 812M 740M 73M 92% /boot
/dev/root e rootfs sono lo stesso fs e dovrà essere mosso sulla chiavetta USB.
devtmpfs, e i vari tmpfs sono file system temporanei in RAM usati da Pi per il suo funzionamento.
/dev/mmcblk0p1 è la partizione di boot e dovrà rimanere sulla scheda SD.
Inserita la chiavetta USB occorre identificare il nome che gli viene assegnato da Linux.
Il comando lsusb elenca i dispositivi USB. Bus 001 Device 004: ID 0930:6545 ...... è la chiavetta utilizzata e i numeri ID identificano il costruttore e il modello (https://www.usb.org/kcompliance/view)
root@my_pi:~# lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 0930:6545 Toshiba Corp. Kingston DataTraveler 102 Flash Drive / HEMA Flash Drive 2 GB / PNY Attache 4GB StickBus 001 Device 006: ID 1941:8021 Dream Link WH1080 Weather Station / USB Missile Launcher
Il comando dmesg visualizza i messaggi di sistema, incluso il nome assegnato.
root@my_pi:~# dmesg
[ 4.812187] scsi 0:0:0:0: Direct-Access Kingston DataTraveler 2.0 PMAP PQ: 0 ANSI: 4
[ 4.981462] sd 0:0:0:0: Attached scsi generic sg0 type 0
[ 5.345576] random: nonblocking pool is initialized
[ 5.906373] sd 0:0:0:0: [sda] 15248832 512-byte logical blocks: (7.80 GB/7.27 GiB)
[ 5.920410] sd 0:0:0:0: [sda] Write Protect is off
[ 5.931456] sd 0:0:0:0: [sda] Mode Sense: 23 00 00 00
[ 5.931976] sd 0:0:0:0: [sda] No Caching mode page found
[ 5.943410] sd 0:0:0:0: [sda] Assuming drive cache: write through
[ 5.983107] sda: sda1
[ 5.996669] sd 0:0:0:0: [sda] Attached SCSI removable disk
[ 6.618511] EXT4-fs (mmcblk0p6): re-mounted. Opts: (null)
[ 6.849359] EXT4-fs (mmcblk0p6): re-mounted. Opts: (null)
In questo caso sda:sda1.
La chiavetta USB viene vista come in disco /dev/sda1. Quella utilizzata in questo esempio ha già una partizione, da eliminare con fs FAT32.
Il nome della chiavetta può essere individuato anche con il comando tail -f /var/log/messages.
Oct 22 18:39:58 my_pi kernel: [498619.796104] scsi 1:0:0:0: Direct-Access Kingston DataTraveler 2.0 PMAP PQ: 0 ANSI: 4
Oct 22 18:39:58 my_pi kernel: [498619.797916] sd 1:0:0:0: Attached scsi generic sg0 type 0
Oct 22 18:39:59 my_pi kernel: [498620.862116] sd 1:0:0:0: [sda] 15248832 512-byte logical blocks: (7.80 GB/7.27 GiB)
Oct 22 18:39:59 my_pi kernel: [498620.862377] sd 1:0:0:0: [sda] Write Protect is off
Oct 22 18:39:59 my_pi kernel: [498620.887951] sda: sda1
Oct 22 18:39:59 my_pi kernel: [498620.890273] sd 1:0:0:0: [sda] Attached SCSI removable disk
Per inizializzare il fs.
fdisk /dev/sda1
Si visualizzano le partizioni (comando p)
root@my_pi:~# fdisk /dev/sda1
Command (m for help): p
Disk /dev/sda1: 7803 MB, 7803273216 bytes
241 heads, 62 sectors/track, 1019 cylinders, total 15240768 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2c6b7369
This doesn't look like a partition table
Probably you selected the wrong device.
Device Boot Start End Blocks Id System
/dev/sda1p1 ? 1936028272 3787887330 925929529+ 68 Unknown
/dev/sda1p2 ? 1330184192 1869160479 269488144 79 Unknown
/dev/sda1p3 ? 538989391 1937352302 699181456 53 OnTrack DM6 Aux3
/dev/sda1p4 ? 1394627663 1394648999 10668+ 49 Unknown
Partition table entries are not in disk order
Command (m for help):
Si cancellano (comando d seguito dal numero di partizione) le partizioni che non interessano (tutte in questo caso) per crearne una nuova.
Si crea la nuova partizione (comando n)
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-15240767, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-15240767, default 15240767):
Using default value 15240767
e si salva le modifiche (comando w)
La nuova partizione non è immediatamente disponibile se non dopo un reboot o il comando partprobe.
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 22: Argomento non valido.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
root@my_pi:~# partprobe
non resta che creare il file system:
root@my_pi:~# mke2fs -t ext4 -L rootfs /dev/sda1
mke2fs 1.42.5 (29-Jul-2012)
Etichetta del filesystem=rootfs
OS type: Linux
Dimensione blocco=4096 (log=2)
Dimensione frammento=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
476720 inodes, 1905096 blocks
95254 blocks (5.00%) reserved for the super user
Primo blocco dati=0
Maximum filesystem blocks=1954545664
59 gruppi di blocchi
32768 blocchi per gruppo, 32768 frammenti per gruppo
8080 inode per gruppo
Backup del superblocco salvati nei blocchi:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: fatto
Scrittura delle tavole degli inode: fatto
Creating journal (32768 blocks): fatto
Scrittura delle informazioni dei superblocchi e dell'accounting del filesystem:
fatto
Ora si dispone di una file system di tipo ext4 e con una etichetta rootfs
che può essere montato per essere utilizzato.
root@my_pi:~# mount /dev/sda1 /mnt
root@my_pi:~# cd /mnt/
root@my_pi:/mnt# ls
lost+found
Il fs é vuoto.
Non resta che copiare il file syste presente su SD nella nuova partizione.
Si può usare il comando dd o altri comandi di copia. dd copia fisicamente la partizione, quindi anche gli spazi vuoti. E' utile per fare una immagine della partizione, ma lungo e sconsigliato in questo caso. Meglio usare rsync
Se non già fatto, si installa rsync:
root@my_pi:/mnt# apt-get install rsync
Lettura elenco dei pacchetti... Fatto
enerazione albero delle dipendenze
Lettura informazioni sullo stato... Fatto
rsync è già alla versione più recente.
È stato impostato rsync per l'installazione manuale.
0 aggiornati, 0 installati, 0 da rimuovere e 91 non aggiornati.
e si esegue la copia:
rsync -axv / /mnt
E' importante l'opzione -a (copia in modo ricorsivi mantenendo invariate informazioni di varie come owner, date dei file, ecc.
L'opzione -x, pure importante, evita di copiare (nel modo ricorsivo) altri file system coem ad esempio /run che è un fs temporaneo creato all'avvio di Pi.
Al termine...
var/spool/rsyslog/
var/tmp/
sent 2521361598 bytes received 1364504 bytes 1995038.44 bytes/sec
total size is 2515935639 speedup is 1.00
Terminata la copia della partizione su SD occorre "dire" al boot di trasferire il controllo alla partizione di root su chiavetta e non quella sulla scheda SD.
L'operazione richiede la modifica del file cmdboot.txt nella directory /boot cambianto l'opzione root=/dev/mmcblk0p2 in /dev/sda1
Attenzione: se è stato installato NOOBS, la modifica è leggermente diversa. NOOBS consente installare più versioni di Linux sulla SD, e fornisce l'opzione recovery al boot del sistema.
Molto brevemente e in modo non troppo preciso, ogni versione di OS installata produce su SD due partizioni, una con l'equivalente di /boot, l'alta con l'equivalente di / oltre alla prima che contiene NOOBS.
La prima partizione mmcblk0p1 è organizzata in modo da non essere mai modificata. Il boot di NOOBS passa il controllo, quanto prima, al SO desiderato.
In questa condizione /boot, nella partizione /dev/mmcblk0p1 non contiene il file cmdline.txt .
Il file, che interessa, è nella partizione che ho chiamato equivalente di /boot, partizione che nemmeno è montata.
In questo caso la soluzione più semplice è avviare il sistema in recovery mode (premendo il tasto shift durante il boot) e utilizzare la funzione di modifica config.txt e cmdline.txt
Reindirizzato il boot verso la corretta partizione modificando cmd.list.txt, occorre istruire il corretto mount della root nel file /etc/fstab
Commentando il mount di /dev/mmcblkop2 e sostituirlo con /dev/sda1 come in esempio
root@my_pi:/ppp# cat /etc/fstab
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
#/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
/dev/sda1 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, so no using swapon|off from here on, use dphys-swapfile swap[on|off] for that
Basta fare il reboot per caricare la nuova configurazione.
Per controllare di avere il corretto fs di root occorre vedere a cosa punta /dev/root che è in link simbolico e deve puntare a sda1
root@my_pi:~# ls -al /dev/root
lrwxrwxrwx 1 root root 4 ott 22 18:17 /dev/root -> sda1
Ora il SO su chiavetta USB. Si possono modificare altre configurazioni, come ad esempio la dimensione dell'area di swap o attivare l'upgrade che inizialmente era sconsigliato.
Ettore (non verificato)
Lun, 07/05/2018 - 08:04
Collegamento permanente
Come raspberry gestisce il file system?
Raspberry non un orologio come i PC o RTC come gestisce il file system e file tra vecchi e nuovi file se raspberry non ha una connessione a internet?