First I find the device with SDHC card mounted:
pi@raspberrypi ~ $ sudo fdisk -l Disk /dev/mmcblk0: 7969 MB, 7969177600 bytes 4 heads, 16 sectors/track, 243200 cylinders, total 15564800 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: 0x000108cb Device Boot Start End Blocks Id System /dev/mmcblk0p1 8192 122879 57344 c W95 FAT32 (LBA) /dev/mmcblk0p2 122880 15564799 7720960 83 Linux
Now I mount a USB stick for storing a copy of the system:
pi@raspberrypi ~ $ mkdir /media/sda1 ## Assume USB stick is /dev/sda1 pi@raspberrypi ~ $ mount /dev/sda1 /media/sda1
Raw copy with dd
pi@raspberrypi ~ $ sudo dd if=/dev/mmcblk0 | gzip -1 > /media/sda1/sd_backup.img.gz ## w/o compression: pi@raspberrypi ~ $ sudo dd if=/dev/mmcblk0 of=/media/sda1/sd_backup.img ## over ssh in case there is no USB stick at hand: user@othercomputer ~ $ sudo ssh root@raspberrystar dd if=/dev/mmcblk0 | gzip -1 | dd of=sd_backup.img.gz
Note: raspberrystar
is the name of my
system---change it to appropriate IP address or name.
Restoring system image:
pi@raspberrypi ~ $ zcat sd_backup.img.gz > /dev/sdX
Where /dev/sdX
denotes the device with blank SDHC card mounted.
More details can be found here.
Copying over sshfs
:
pi@raspberrypi ~ $ sudo apt-get install sshfs fuse-utils pi@raspberrypi ~ $ mkdir -p ~/Dist/jupiter ## mounting (as user tomek) remote directory /public/raspberry at jupiter; ## mounting point is: ~/Dist/jupiter pi@raspberrypi ~ $ sshfs tomek@jupiter:/public/raspberry/ ~/Dist/jupiter failed to open /dev/fuse: Permission denied
On first try failure (as usual). Only fuse group members can read/write from/to /dev/fuse
.
User pi should be added to group "fuse":
pi@raspberrypi ~ $ sudo usermod -a -G fuse pi
To activate the modifications made in /etc/group
one should log out/log in now.
pi@raspberrypi ~ $ sshfs tomek@jupiter:/public/raspberry/ ~/Dist/jupiter pi@raspberrypi ~ $ ls -l /home/pi/Dist/jupiter total 0 ## Raw copy with dd (with compression): sudo dd if=/dev/mmcblk0 | gzip -1 > /home/pi/Dist/jupiter/raspberrystar.iso
Added 3 Oct 2012:
15564800+0 przeczytanych recordów 15564800+0 zapisanych recordów skopiowane 7969177600 bajtów (8,0 GB), 3504,04 s, 2,3 MB/s
Raw copying of 8Gb SDHC card with compression over sshfs took about 1 hr. The resulting image size is about 1,6 Gb.
It is said to overclock Raspberry Pi one has to upgrade the system:
sudo apt-get update && sudo apt-get install raspberrypi* raspi-config
Then configure it with raspi-config
utility:
sudo raspi-config
It is good anyhow to check the system version first:
uname -a Linux raspberrystar.pinkaccordions.org 3.2.27+ #174 PREEMPT Wed Sep 26 14:09:47 BST 2012 armv6l GNU/Linux
The kernel is up to date. Inspecting raspi-config
I have discovered
it is not updated, but I prefer to configure the system via CLI (command line or console) interface
rather than GUI one (no need to connect the RPi to a TV set which is in another room:-).
So I decided not to upgrade the system but rather manually configure it.
To achieve overclocking one has to add the following lines to
/boot/config.txt
file:
pi@raspberrystar ~ $ sudo vim /boot/config.txt ## add the following: temp_limit=80 arm_freq=900 sdram_freq=500
Now reboot:
pi@raspberrystar ~ $ sudo reboot
Check the dmesg
:
pi@raspberrystar ~ $ dmesg | grep 7000 [ 1.956412] bcm2835-cpufreq: min=700000 max=900000 cur=700000
CPU frequency is still 700Mhz. To increase it one has to
edit scaling_governor
file:
pi@raspberrystar ~ $ sudo bash root@raspberrystar:/home/pi# echo "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor ## check if the above works:-) pi@raspberrystar ~ $ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor performance # display available options: pi@raspberrystar ~ $ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors conservative ondemand userspace powersave performance
The ondemand
option
allows for adjusting CPU frequency depending
on CPU utilization.
Without any further reboot the new settings work:
# check current CPU frequency pi@raspberrystar ~ $ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq 900000
There is even a temperature sensor available so one can check if the CPU is not overheated:
# check processor temperature: pi@raspberrystar ~ $ /opt/vc/bin/vcgencmd measure_temp temp=46.5'C
To boot the system with scaling_governor
set to appropriate
value one has to edit /etc/rc.local
:
pi@raspberrystar ~ $ sudo vim /etc/rc.local # Add the following line # echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
I have performed a simple test:
#!/bin/bash # N=5 START=$(date +%s) for ((i=1;i<=$N;i++ )) ; do echo "**** Iteration $i ****" STARTI=$(date +%s) perl -e 'for ($i=0;$i<=10000000;$i++) { $s .= "xx"; }' ENDI=$(date +%s) ; TOTALI=$(( $ENDI - $STARTI )) echo "*** $TOTALI s." done END=$(date +%s) TOTAL=$(( $END - $START )) MEAN=`awk -v m=$TOTAL -v n=$N 'BEGIN { print m/n }'` echo "total: " $TOTAL "mean: " $MEAN ##
The test uses the following perl program:
perl -e 'for ($i=0;$i<=10000000;$i++) { $s .= "xx"; }'
Because computing time can vary, the program has to be run N
times
and the mean time is reported.
My Rpi runs 28--29s at 700 Mhz, 25,8s at 800 Mhz and 21s at 900 Mhz.
So running at 900 Mhz results in almost 30% reduction of computing time.
W temacie kopii zapasowej na stronach poświęconych Raspberry Pi znaleźć można wyłącznie(?)
opisy jak to zrobić za pomocą dd
. Ten sposób nie podoba mi się
na dłużą metę z uwagi na czas -- kopiowanie karty 8Gb z kompresją przez sshfs zajęło
około 1 godziny. Tworzenie kopii przyrostowych (za pomocą rsync
) wydaje się lepszym pomysłem...
Załóżmy, że do /etc/fstab
wpisano:
/dev/disk/by-id/usb-WD_5000AAV_External_57442D574341535535303634313031-0:0-part1 \ /mnt/external-disk ext4 noauto,user,rw 0 0
Utworzenie kopii systemu sprowadza się wykonania:
rsync -av --exclude=/proc/ --exclude=/sys/ --exclude=/tmp/ \ --exclude=/mnt/ --exclude=/home/pi/Dist/ --delete / /mnt/external-disk/backup/rpi
Opcja --exclude
pomija wymienione pliki/katalogi. W szczególności należy
koniecznie umieścić tam katalogi, w których są/mogą być montowane inne systemy plików,
np. /mnt/
(uniknięcie pętli, bo przecież /mnt/
zawiera zamontowany dysk USB)
oraz /home/pi/Dist/
(moje zwyczajowe miejsce montowania systemów plików przez sshfs
)
Kopia systemu z raspberry będzie tworzona na innym komputerze dostępnym poprzez sieć.
Konfigurowanie rsynca
należy rozpocząć od jego zainstalowania na obu
komputerach (źródłowym i odbiorcy):
apt-get install rsync
Zawartość pliku /etc/rsyncd.conf
po stronie źródła (czyli raspberry):
uid = 0 gid = 0 hosts allow = 192.168.1.*** transfer logging = no read only = yes [wholefs] path = / comment whole root fs
W pliku /etc/default/rsync
(także po stronie źródła,
tj. raspberry) należy wpisać lub ,,odhaszować'':
RSYNC_ENABLE=true
Teraz trzeba wystartować rsync
(po ustawnieniu RSYNC_ENABLE
, rsync
będzie już uruchamiany
w momencie startu systemu -- nie potrzeba
do tego żadnych dodatkowych zabiegów w konfiguracji)
# /etc/init.d/rsync restart
Można sprawdzić czy działa
podając polecenie (moje raspberry nazywa się raspberrystar)
na komputerze odbiorcy (jako root
):
rsync raspberrystar::wholefs/
Jeżeli wszystko jest OK to wyświetlona zostanie zawartość katalogu /
na raspberrystar (czyli źródle).
Utworzenie kopii systemu sprowadza się wykonania:
rsync -av --exclude=/proc/ --exclude=/sys/ --exclude=/tmp/ \ --exclude=/mnt/ --exclude=/home/pi/Dist/ --delete \ raspberrystar::wholefs/ /public/sheeva/backup/raspberrystar/rootfs
W razie potrzeby kopia może być szybko przeniesiona na inną kartę SDHC.
# uwaga: nazwy katalogów odpowiadają wariantowi #2 tworzenia kopii: rsync -av --log-file=rsync_`date +%Y%m%d%H`.log --delete \ /public/sheeva/backup/raspberrystar/rootfs/ /public/sdX
Gdzie /public/sdX
oznacza miejsce zamontowania karty SDHC.
Karta musi być wcześniej sklonowana z ,,pierwszej'' kopii systemu wykonanej za pomocą dd
, tj.:
zcat sd_backup.img.gz > /dev/sdX
Teraz można gdybać czy użycie samego dd
nie będzie prostsze. Być może -- ja wolę korzystać
na co dzień z rsynca
.
Zauważyłem, że przy intensywnych operacjach I/O są problemy z odczytem
danych przez GPIO (temperatura/wilgotność).
Problem nie jest duży, ponieważ tworzenie pierwszej kopii systemu zajęło mi jakieś 20 min
(można się spodziewać, że kolejne będą tworzone w ciągu kilku minut),
ale dla większej pewności dodałem ionice
i --bwlimit
(specjalnie tego nie testując, oprócz sprawdzenia, że działa)
ionice -c3 rsync -av --bwlimit=500 --exclude=/proc/ --exclude=/sys/ --exclude=/tmp/ \ --exclude=/mnt/ --exclude=/home/pi/Dist/ --delete \ raspberrystar::wholefs/ /public/sheeva/backup/raspberrystar/rootfs
Jeżeli powyższe zapisane zostanie do skryptu, np. o nazwie backup_raspberry.sh
,
to teraz aby ten skrypt był uruchamiany raz na tydzień, np. w niedzielę o 4:00
należy wpisac do pliku crontab (na komputerze odbiorcy) coś takiego:
0 4 * * 7 /root/bin/backup_raspberry.sh >> /root/logs/RSync/RSync.log 2>&1