Door het vele schrijven op de SD-kaart kan het voor komen dat op een gegeven moment de Raspberry Pi niet meer wil starten.
De SD-kaart is dan corrupt (of bevat corrupte data). Ik heb dit zelf al een aantal keren meegemaakt en dan kan je de Raspberry Pi weer opnieuw installeren.
Gelukkig is het mogelijk om de Raspberry Pi te laten draaien vanaf een USB-stick, wat vele malen stabieler is. De SD-kaart is dan alleen nog maar nodig om op te starten, maar er vinden geen schrijfacties meer op plaats.
Hieronder zal ik beschrijven hoe simpel de data van de huidige SD-kaart kan kopiëren naar een USB-stick en de Raspberry Pi ook hiervan te laten draaien.
Er zijn wel een aantal voorwaarden (waarmee ik het in ieder geval voor elkaar heb gekregen):
- Een USB-stick (ik gebruik er één van 8Gb)
- Een (verse) installatie van Wheezy Raspbian image
Als eerste sluiten we de USB-stick aan op de Raspberry Pi.
Met lsusb kunnen we zien of de USB-stick wordt herkend.
pi@raspberrypi ~ $ lsusb Bus 001 Device 002: ID 0424:9512 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 13fe:1f23 Kingston Technology Company Inc.
Voer daarna het commando tail /var/log/messages uit, om te zien of het device wordt herkend (kan ook met het commando dmesg).
pi@raspberrypi ~ $ tail /var/log/messages Mar 28 22:03:23 raspberrypi kernel: [2815912.144457] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 Mar 28 22:03:23 raspberrypi kernel: [2815912.144473] usb 1-1.3: Product: -power Mar 28 22:03:23 raspberrypi kernel: [2815912.144486] usb 1-1.3: Manufacturer: silicon Mar 28 22:03:23 raspberrypi kernel: [2815912.144499] usb 1-1.3: SerialNumber: E692060043C1 Mar 28 22:03:23 raspberrypi kernel: [2815912.147662] scsi0 : usb-storage 1-1.3:1.0 Mar 28 22:03:24 raspberrypi kernel: [2815913.145563] scsi 0:0:0:0: Direct-Access silicon -power 0.00 PQ: 0 ANSI: 0 CCS Mar 28 22:03:24 raspberrypi kernel: [2815913.425642] sd 0:0:0:0: [sda] 15654912 512-byte logical blocks: (8.01 GB/7.46 GiB) Mar 28 22:03:24 raspberrypi kernel: [2815913.426497] sd 0:0:0:0: [sda] Write Protect is off Mar 28 22:03:24 raspberrypi kernel: [2815913.433293] sda: sda1 Mar 28 22:03:24 raspberrypi kernel: [2815913.438412] sd 0:0:0:0: [sda] Attached SCSI removable disk
Zoals je kan zien wordt de USB-stick herkend als /dev/sda
Nu gaan de USB-stick partitioneren.
Voer het commando sudo fdisk /dev/sda uit.
Gebruikt “p” om te kijken of er al een partitie aanwezig is.
pi@raspberrypi ~ $ sudo fdisk /dev/sda Command (m for help): p Disk /dev/sda: 8015 MB, 8015314944 bytes 43 heads, 42 sectors/track, 8668 cylinders, total 15654912 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: 0x9729041c Device Boot Start End Blocks Id System /dev/sda1 * 8064 15654911 7823424 b W95 FAT32
Zoals je kan zien is er een Windows partitie aanwezig (W95 FAT32)
Deze gaan we verwijderen met “d”.
Command (m for help): d Selected partition 1
LET OP: Alle data van de USB-stick zal nu verwijderd worden.
Met “n” kan er vervolgens een nieuwe partitie aangemaakt worden.
Kies voor een primary partitie (met “p” of Enter).
Druk daarna nog een aantal keer op Enter om de standaard instellingen toe te passen.
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-15654911, default 2048): Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-15654911, default 15654911): Using default value 15654911
Met “w” wordt de partitie weggeschreven op de USB-stick.
Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
Nu de partitie formatteren met het commando sudo mke2fs -t ext4 -L rootfs /dev/sda1.
pi@raspberrypi ~ $ sudo mke2fs -t ext4 -L rootfs /dev/sda1 mke2fs 1.42.5 (29-Jul-2012) Filesystem label=rootfs OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 489600 inodes, 1956608 blocks 97830 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2004877312 60 block groups 32768 blocks per group, 32768 fragments per group 8160 inodes per group Superblock backups stored on blocks: 1605632 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
We gaan de USB-stick mounten, zodat we de data er naar toe kunnen gaan kopiëren.
Dit doen we met het commando sudo mount /dev/sda1 /mnt.
pi@raspberrypi ~ $ sudo mount /dev/sda1 /mnt
Met df -h kunnen we zien wat we hebben gedaan.
pi@raspberrypi ~ $ df -h Filesystem Size Used Avail Use% Mounted on rootfs 7.4G 1.7G 5.5G 23% / /dev/root 7.4G 1.7G 5.5G 23% / devtmpfs 85M 0 85M 0% /dev tmpfs 19M 232K 19M 2% /run tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 37M 0 37M 0% /run/shm /dev/mmcblk0p1 56M 19M 38M 33% /boot /dev/sda1 7.4G 145M 6.9G 3% /mnt
In veel handleidingen op internet wordt gebruik gemaakt van het commando dd om de data te kopiëren, maar dat duurt erg lang.
We kunnen ook rsync gebruiken.
Standaard is rsync niet geïnstalleerd, maar dat kan heel simpel geïnstalleerd worden met sudo apt-get install rsync
pi@raspberrypi ~ $ sudo apt-get install rsync
Vervolgens kopiëren we alles van “/” naar “/mnt” (de USB-stick).
sudo rsync -axv / /mnt
pi@raspberrypi ~ $ sudo rsync -axv / /mnt sending incremental file list ...
Dit duurt ongeveer 15 minuten.
Normaal start de Raspberry Pi op van de SD-kaart, dus zullen we dit moeten aanpassen naar de USB-stick. Hiervoor dienen we het bestand /boot/cmdline.txt aan te passen.
Voor de zekerheid maken we hier een kopie van:
sudo cp /boot/cmdline.txt /boot/cmdline.orig
sudo cp /boot/cmdline.txt /boot/cmdline.orig
We kunnen het bestand nu gaan aanpassen sudo nano /boot/cmdline.txt.
We veranderen root=/dev/mmcblk0p2 in root=/dev/sda1.
Tevens voegen we aan het eind van de regel rootdelay=5 toe. Dit doen we omdat de USB-stick soms nog niet klaar is, wanneer het OS al wil gaan starten. Door deze pauze van 5 secondes is dit probleem niet. Je kan hier mee experimenteren door het weg te laten of minder tijd in te stellen.
pi@raspberrypi ~ $ cat /boot/cmdline.txt dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/sda1 rootfstype=ext4 elevator=deadline rootwait rootdelay=5 pi@raspberrypi ~ $
Ook moeten we nog iets aanpassen in de filesystem tabel op de USB-stick.
sudo nano /mnt/etc/fstab
Voeg de volgende regel toe:
/dev/sda1 / ext4 defaults,noatime 0 1
Zet een # voor de regel van de SD-kaart:
#/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
Het zal er nu als volgt uit moeten zien:
proc /proc proc defaults 0 0 /dev/sda1 / ext4 defaults,noatime 0 1 /dev/mmcblk0p1 /boot vfat defaults 0 2 #/dev/mmcblk0p2 / 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
Nu kan de Raspberry Pi herstart worden
sudo reboot
Met df -h kan je nu zien hoe het filesystem eruit ziet.
pi@raspberrypi ~ $ df -h Filesystem Size Used Avail Use% Mounted on rootfs 7.4G 1.8G 5.3G 25% / /dev/root 7.4G 1.8G 5.3G 25% / devtmpfs 85M 0 85M 0% /dev tmpfs 19M 232K 19M 2% /run tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 37M 0 37M 0% /run/shm /dev/mmcblk0p1 56M 19M 38M 33% /boot
Wanneer je eventueel terug wil, kan je dat doen aan de hand van de handleiding die bij de bron staan.