Root su chiavetta USB per Raspberry

Raspberry Pi  usa una scheda SD per avviare il sistema e come file system (fs) di root. Purtroppo la scheda SD  non è fatta per numerosi cicli di lettura e scrittura, quindi é probabile incorrere in malfunzionamenti dovuti alla corruzione dei dati.Una soluzione è utilizzare un diverso dispositivi di memorizzazione per il fs. L'uso di una chiavetta USB può fare allo scopo.
Purtroppo la scheda SD non può essere eliminata, perché è l'unico dispositivo che Pi riconosce per alcune funzioni di inizializzazione (boot).  Ma limitandone l'uso per il semplice boot riduce le operazioni su SD  al solo momento di accensione e prime fasi di avvio riducendo se non eliminando i 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.


 

Categoria: 

Tags: 

Mi piace: 

0
No votes yet