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://pastebin.com/4Jp1WPTb

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://ffmpeg.org/trac/ffmpeg/wiki/How%20to%20compile%20FFmpeg%20for%20Raspberry%20Pi%20%28Raspbian%29

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:

http://nutcom.hu/?page_id=138

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:

https://extremeshok.com/1081/raspberry-pi-raspbian-tuning-optimising-optimizing-for-reduced-memory-usage/

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/

http://raspberrypi.stackexchange.com/questions/13866/pi-gpio-momentary-open-switch-for-shutdown-python-help-needed-for-time-delay

 

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
root=/dev/mmcblk0p2 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:
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