Notatki praktyczne z użytkowania Raspberry PI
The MagPI: http://www.themagpi.com/
1. Jak zdobyć IP Raspberry PI w sieci przyznane przez DHCP w przypadku obecności wielu komputerów?
Np. w Debianie zainstalować arp-scan i wykonać:
sudo arp-scan -l
albo:
sudo arp-scan --interface=eth0 192.168.1.0/24
albo zainstalować fping i wykonąć:
fping -c 1 -g 192.168.0.0/24
gdzie zamiast 192.168.0.0/24 wpisać adres sieci i maskę, w której poszukiwany jest układ, a potem
arp -ne | grep f8:1a:67:0b:1b:3b
gdzie f8:1a:67:0b:1b:3b - to mac address malinki
2. Jak skonfigurować szynę i2c (Raspbian):
Usunąć albo zakomentować przez # na początku linię
w /etc/modprobe.d:
# blacklist i2c-bcm2708
oraz w /etc/modules dodać linijkę:
i2c-dev
Zainstalować ic2-tools:
jest w nim m.in. i2cdetect, który w wersji malinki v2 trzeba wywoływać przez: i2cdetect -y 1
oraz python-smbus
Biblioteka alternatywna do i2c-tools: http://quick2wire.com/
3. Kamera, złe kolory
apt-get install mplayer
apt-get install v4l-utils
Logitech C310
Oprogramowanie ustawia złe kolory:
mplayer tv:// -tv driver=v4l2:device=/dev/video0
v4l2-ctl -c brightness=127,contrast=32,saturation=32 -d /dev/video0
4. Raspberry firmware update
apt-get install rpi-update
sudo rpi-update
5. Kernel cross compile
http://elinux.org/RPi_Kernel_Compilation
6. Cross compile:
Scratchbox2
http://russelldavis.org/2011/09/07/setting-up-scratchbox2-from-scratch-for-the-raspberry-pi/
http://teebeenator.blogspot.com/2012/12/cross-compilation-with-scratchbox2.html
http://www.bootc.net/archives/2012/05/26/how-to-build-a-cross-compiler-for-your-raspberry-pi/
http://www.unixrus.eu/cross-compile-tor-for-raspbianarmv6/
https://github.com/raspberrypi/tools
Informacje dot. cross compile
http://datko.net/2013/05/10/cross-compiling-python-3-3-1-for-beaglebone-arm-angstrom/
7. Naprawa systemu plików.
Ext4:
fsck.ext4 -cDfty -C 0 /dev/mmcblk1p2
Reiser:
fsck.reiserfs --fix-fixable -y /dev/mmcblk1p2
Inne:
dumpe2fs /dev/sdb1
mke2fs -n /dev/sdb1
e2fsck -b 71663616 /dev/sdb1
mke2fs -S (ostateczność)
http://unix.stackexchange.com/questions/33284/recovering-ext4-superblocks
http://www.recantha.co.uk/blog/?p=1208
8. Ochrona karty SD przed szybkim zużyciem:
http://raspberrypi.stackexchange.com/questions/169/how-can-i-extend-the-life-of-my-sd-card
http://darmawan-salihun.blogspot.com/2013/01/moving-raspberry-pi-logs-and-temp-files.html
Readonly system:
http://www.raspberrypi.org/forums/viewtopic.php?f=29&t=22596
Root unionfs:
http://www.raspberrypi.org/forums/viewtopic.php?f=29&t=23154
IPE R-2:
9. Emulacja Raspberry PI
http://xecdesign.com/qemu-emulating-raspberry-pi-the-easy-way/
http://www.cnx-software.com/2011/10/18/raspberry-pi-emulator-in-ubuntu-with-qemu/
http://www.soslug.org/wiki/raspberry_pi_emulation
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=29&t=37386
10. Watchdog Raspberry PI
http://binerry.de/post/28263824530/raspberry-pi-watchdog-timer
Rozwiązanie: Zainstalować pakiet: watchdog
apt-get install watchdog
Skonfigurować pliki:
/etc/default/watchdog
Ustawić w nim zmienną: watchdog_module="bcm2708_wdog"
W pliku /etc/watchdog.conf
usunąć komentarz # przed watchdog-device = /dev/watchdog
Utworzyć plik:
/etc/modprobe.d/watchdog.conf
i umieścić w nim:
options bcm2708_wdog nowayout=1 heartbeat=15
(W ten sposób nie ma możliwości wyłączenia watchdog'a)
11. RPI Tutorials
http://elinux.org/RPi_Tutorials
12. RPI GPIO
http://elinux.org/RPi_Low-level_peripherals#Power_pins
13. Połączenie przez UART
Uwaga: jeśli przełączasz się na innego użytkownika przez "su",
to trzeba wykonać: script /dev/null
aby działał screen!
Połączenie przez UART:
screen /dev/ttyUSB0 115200
konfiguracja screen'a: .screenrc
term xterm-256color
#term screen-256color
backtick 1 5 5 true
termcapinfo rxvt* 'hs:ts=\E]2;:fs=\007:ds=\E]2;\007'
hardstatus string "screen (%n: %t)"
caption string "%{= kw}%Y-%m-%d;%c:%s %{= kw}%-Lw%{= kG}%{+b}[%n %t]%{-b}%{= kw}%+Lw%1`"
caption always
#caption always '%c:%s'
termcapinfo xterm* ti@:te@
Zmiany rozmiaru ekranu:
stty size
stty rows 40
stty columns 140
Skrypt: http://shallowsky.com/blog/tags/embedded/
https://github.com/akkana/scripts/blob/master/termsize
screen - zabicie bierzącej sesji: Ctrl+a k
screen - Odłączenie od sesji: Ctrl+a d
screen - Odłączenie od sesji screen w screen: Ctrl+a a d
screen - Przywrócenie sesji screen -r <nazwa sesji>
screen - wylistowanie sesji screen -ls
zabicie zdalnej sesji: screen -X -S {session # you want to kill} kill
14. Rasbian rootFs read-only , blackout-proof:
http://wiki.debian.org/ReadonlyRoot
Usuń swap-a:
sudo dphys-swap uninstall
sudo apt-get remove dphys-swap
Ustaw w /etc/fstab:
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
tmpfs /var/log tmpfs defaults,noatime,size=5M 0 0
tmpfs /var/tmp tmpfs defaults,noatime 0 0
W /etc/default/tmpfs ustaw:
RAMLOCK=yes
RAMSHM=yes
RAMTMP=yes
TMPFS_SIZE=70%VM
RUN_SIZE=10M
LOCK_SIZE=5M
SHM_SIZE=10M
W /etc/init.d/hwclock.sh, linia 60, zamień:
if [ -w /etc ] && [ ! -f /etc/adjtime ] && [ ! -e /etc/adjtime ]; then
na:
if [ -w /etc ] && [ ! -L /etc/adjtime ] && [ ! -e /etc/adjtime ]; then
Dodaj do /etc/environment:
BLKID_FILE="/var/local/blkid.tab"
Zrób symlink do /etc/mtab:
sudo rm /etc/mtab
sudo ln -s /proc/self/mounts /etc/mtab
Zrób symlink do /var/lib/dhcp
sudo rm /var/lib/dhcp
sudo ln -s /tmp /var/lib/dhcp
Przygotuj skrypt rootReadOnly do zmiany statusu ro/rw i umieść go w /etc/init.d:
#!/bin/bash
### BEGIN INIT INFO
# Provides: rootReadOnly
# Required-Start: $all
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Make root fs read only
# Description: Raspberry PI root fs read only for sd card protection
# SILF TEAM (2014)
# Written by Dariusz Tefelski <tefelski@if.pw.edu.pl> (SQ5NBG)
# 06/05/2014
### END INIT INFO
case "$1" in
start|"")
echo @ Making RootFS and /boot readonly.
mount -o remount,ro /dev/mmcblk0p1
mount -o remount,ro /dev/mmcblk0p2
exit 0
;;
restart|reload|force-reload)
echo @ Making RootFs and /boot writable then making them readonly.
mount -o remount,rw /dev/mmcblk0p1
mount -o remount,rw /dev/mmcblk0p2
mount -o remount,ro /dev/mmcblk0p1
mount -o remount,ro /dev/mmcblk0p2
exit 0
;;
stop)
echo @ Making RootFS and /boot writable.
mount -o remount,rw /dev/mmcblk0p1
mount -o remount,rw /dev/mmcblk0p2
exit 0
;;
esac
Dodaj uprawnienia uruchamiania: sudo chmod +x /etc/init.d/rootReadOnly
Można go dodać, do skryptów startowych, poprzez: sudo update-rc.d rootReadOnly defaults
Sprawdzenie, co ewentualnie ma otwarte pliki do zapisu na zamontowanym systemie plików (flagi f):
sudo fuser -v -m /
Obecnie zainstalowany jest kernel zalecany przez RPI Foundation: 3.10.25+ w którym nie ma usbtmc (pakiet: linux-image-rpi-rpfv)
Możemy albo spróbować skompilować moduł usbtmc, albo zainstalować jądro z pakietów Raspbian.org 3.10.3 (pakiet: linux-image-3.10-3-rpi)
Instalacja jądra Raspabian'a: apt-get install linux-image-3.10-3-rpi
sudo cp /boot/kernel.img /boot/kernel.img.old - kopia starego jądra
sudo cp /boot/vmlinuz-3.10-3-rpi /boot/kernel.img
i restart
Lepiej - czytaj pkt. 18.
15. Raspbian i AUFS
http://www.raspberrypi.org/forums/viewtopic.php?p=228099
16. Raspberry PI Tuning:
17. Raspberry PI kernel compile
http://mitchtech.net/raspberry-pi-kernel-compile/
18. Raspberry Pi B+
Stary obraz należało zupdate'ować przez rpi-update - zainstalowało to wersję 3.14 jądra. Jednak brak w nim usbtmc, więc
potrzeba zainstalować wersję: linux-image-3.12-1-rpi
Po instalacji ustawić w /boot/config.txt 2 linie nowego kernel'a:
kernel=vmlinuz-3.12-1-rpi
initramfs initrd.img-3.12-1-rpi
Po restarcie, zamiast default'owego kernel.img uruchomione zostanie powyższe jądro wraz z właściwym plikiem initramfs.
19. Zmiana rozmiaru partycji ext4.
Niekiedy rozmiary pamięci SD różnią się i obraz utworzony z jednej nie chce wejść na drugą.
Kopiowanie obrazu wykonujemy przez: dd if=plik_obrazu.img of=/dev/sdc bs=32M
gdzie /dev/sdc - należy upewnić się jakie urządzenie przyporządkował system do karty sd, np. patrząc na to, co wyśwetla na końcu polecenie: dmesg
Następnie wykonujemy
fdisk /dev/sdc
Wyświetlmy tablicę partycji (opcja p) i zanotujmy początek drugiej partycji.
Kasujemy partycję Raspbiana /dev/sdc2 (opcja d ), wybieramy 2 i tworzymy nową (n) - partycja podstawowa. Tutaj początek należy ustawić na taki jak był poprzednio.
Domyślny jest zły. Koniec ustawiamy domyślny - jest to faktyczny koniec karty.
Następnie sprawdzamy system plików:
e2fsck /dev/sdc2
Tutaj omijamy komunikat mówiący o błędnym rozmiarze i kontynuujemy sprawdzanie.
Zmianę rozmiaru systemu plików finalizujemy przez polecenie:
resize2fs /dev/sdc2
System jest gotowy do działania.
20. Crash test:
echo c > /proc/sysrq-trigger
http://stackoverflow.com/questions/10547494/how-to-panic-kernel-from-user-land
http://www.opensourceforu.com/2011/02/debug-kernel-panics-with-crash/
21. Raspberry PI - shutdown button:
http://embeddedcode.wordpress.com/2013/10/18/adding-a-shutdown-button-to-the-raspberry-pi/
http://www.raspberrypi.org/forums/viewtopic.php?p=355975#p355975
http://spaceblogs.org/2013/06/03/shut-down-your-raspberry-pi-on-button-press-and-add-reset-function/
22. Emulacja Raspberry PI
http://antyweb.pl/zabawy-z-raspbianem-czyli-jak-to-zrobic-bez-malinki-uzupelnienie/
http://www.darrinhodges.com/chroot-voodoo/
http://xecdesign.com/qemu-emulating-raspberry-pi-the-easy-way/
Uwaga!!! w obrazie Rasbian należy zahaszować linię w /etc/ld.so.preload
Inaczej będzie pojawiał się błąd:
qemu: uncaught target signal 4 (Illegal instruction) - core dumped
Uwaga: Aby uruchomić sshd, trzeba wygenerować klucze:
ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa
ssh-keygen -f /etc/ssh/ssh_host_dsa_key -N '' -t dsa
potem: su pi
ssh-keygen
exit
/etc/init.d/ssh start
23. Obsługa GPIO - uwaga potrzebna grupa GPIO
Ustawienie GPIO4 jako wyjscie i ustawienie stanu wysokiego:
echo 4 > /sys/class/gpio/export
sleep 1
echo out > /sys/class/gpio/gpio4/direction
echo 1 > /sys/class/gpio/gpio4/value
Wystawienie 0:
echo 0 > /sys/class/gpio/gpio4/value
Wystawienie 1
echo 1 > /sys/class/gpio/gpio4/value
W Pythonie:
export = open("/sys/class/gpio/export","w")
export.write("4")
export.close()
direction = open("/sys/class/gpio/gpio4/direction","w")
direction.write("out")
direction.close()
relay = open("/sys/class/gpio/gpio4/value", "w")
relay.write("1")
relay.flush() #zapisanie bufora (potrzebne jeśli nie zamykasz pliku przez close()
# Wlacz przekaźnik
relay.write('1'); relay.flush();
# Wylacz przekaźnik
relay.write('0'); relay.flush();
#Zamknij plik
relay.close();
Na koniec warto odeksportować gpio4:
unexport = open("/sys/class/gpio/unexport","w")
unexport.write(4)
unexport.close()
24. Problem z systemem plików - zatrzymanie się malinki, gdy nastąpił zapis "w przyszłości" - związane jest to z brakiem
wewnętrznego zegara RTC. Rozwiązaniem jest ignorowanie błędów dotyczących czasu montowania i zapisu:
Należy w pliku /etc/e2fsck.conf wpisać:
[problems]
# Superblock last mount time is in the future (PR_0_FUTURE_SB_LAST_MOUNT).
0x000031 = {
preen_ok = true
preen_nomessage = true
}
# Superblock last write time is in the future (PR_0_FUTURE_SB_LAST_WRITE).
0x000032 = {
preen_ok = true
preen_nomessage = true
}
Patrz także:
https://unix.stackexchange.com/questions/8409/how-can-i-avoid-run-fsck-manually-messages-while-allowing-experimenting-with-s
http://stillstup.blogspot.com/2010/02/superblock-last-mount-time-is-in-future.html
25. USB ethernet na chipsecie: DM9601
http://jumpstation.co.uk/flog/Jan2015.html#p190120151932
26. Raspberry PI 3 i bootowanie z USB
Opis dostępny z: https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/msd.md
1. Należy posługiwać się nowym systemem Raspbian (najlepiej zrobić aktualizację: sudo apt-get update...)
2. W pliku boot/config.txt wstawić: program_usb_boot_mode=1
np.
echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
3. Zrestartować RPI (reboot). 4. Zweryfikować ustawienie boot-owania, poprzez polecenie:vcgencmd otp_dump | grep 17: powinno zwrócić: 17:3020000a Ważne aby w pliku: config.txt nie było na końcu nowej linii!!! 5. Przygotować obraz Raspbiana na pendrive (należy zamienić na partycji FAT z /boot/cmdline.txt
na root=/dev/sda2 oraz na partycji EXT4 w /etc/fstab wszystkie wystąpienia /dev/mmcblk* na /dev/sda*. Po uruchomieniu systemu, warto ustawić nowe klucze ssh:root=/dev/mmcblk0p2
rm /etc/ssh/ssh_host* dpkg-reconfigure openssh-server
27. Montowanie partycji z obrazu dysku img: http://madduck.net/blog/2006.10.20:loop-mounting-partitions-from-a-disk-image/ fdisk -l Raspbian.img sudo losetup /dev/loop0 Raspbian.img -o $((sektor_pocz_partycji_FAT * 512)) sudo losetup /dev/loop1 Raspbian.img -o $((sektor_pocz_parycji_EXT4 * 512)) sudo mkdir /mnt/loop0 sudo mkdir /mnt/loop1 sudo mount /dev/loop0 /mnt/loop0 sudo mount /dev/loop1 /mnt/loop1 Potem odmontowanie: sudo umount /mnt/loop0 sudo umount /mnt/loop1 sudo losetup -d /dev/loop0 sudo losetup -d /dev/loop1 Można także jednolinijkowo, ale wtedy jednocześnie może być tylko jedna partycja z tego samego pliku: mount -o loop,offset=$((sektor_pocz_partycji*512)) Raspbian.img /mnt/loop0 28. Oficjalny wyświetlacz Raspberry Pi Touchscreen 7". http://forums.pimoroni.com/t/official-7-raspberry-pi-touch-screen-faq/959 Obrót ekranu o 180st. -> należy dodać do /boot/config.txt linijkę: lcd_rotate=2 29. Konfiguracja zewnętrznej karty dźwiękowej USB Domyślna karta dźwiękowa to wewnętrzna snd_bcm2835 - dostaje index 0! (W pliku: /lib/modprobe.d/aliases.conf jest konfiguracja zpewniająca, że karta usb nie dostanie indeksu 0). aby przestawić domyślną na usb, która dostanie indeks 1 konieczna jest edycja pliku: /etc/asound.conf Należy umieścić w nim zawartość: pcm.!default { type hw card 1 } ctl.!default { type hw card 1 } Niestety nie wszystkie programy współpracują dobrze w takiej konfiguracji. Dlatego najbezpieczniej jest utworzyć plik /etc/modprobe.d/blacklist-sound.conf w którym należy wpisać: blacklist snd-bcm2835 oraz w pliku /lib/modprobe.d/aliases.conf dodać hash na początku linii: options snd-usb-audio index=-2 Czyli ma ona wyglądać następująco: #options snd-usb-audio index=-2 Wtedy po restarcie standardowy moduł dźwięku wbudowanego nie będzie ładowany, a karta usb dostanie indeks 0