隨手亂記 (基於官方 raspbian 32bit image)

啟用 Serial Console

啟用 UART. 編輯 /boot/config.txt, 在最前面加上一行

enable_uart=1

這樣 kernel 就會有 log 輸出到 /dev/ttyS0 上. 接著讓 systemd 啟動的過程也輸出 log 到 /dev/ttyS0 上, 編輯 /boot/cmdline.txt, 加上

console=ttyS0,115200

開機後, systemd 會自動找到 /dev/ttyS0 並在上面啟動 getty, 所以我們不用特意去啟動 [email protected] 這個服務.

UART 的 pin 基本只需要 3 根 - RX, TX, GND, 可參考這張圖. 要注意的是, USB to TTL 的 RX 要接在板子的 TX, TX 要接在 RX, GND 接 GND.

/dev/ttyS0 在 Raspberry Pi 上被稱為 mini UART, 另外還有 /dev/ttyAMA0 被稱為 PL011 UART, 細節可參考這裡

Mini UART 在版子上 default 是被 disabled, 原因上面這個 link 有提到

The baud rate of the mini UART is linked to the core frequency of the VPU on the VC4 GPU. This means that, as the VPU frequency governor varies the core frequency, the baud rate of the UART also changes. This makes the UART of limited use in the default state.

啟用 initramfs

首先裝上一個 package

apt install initramfs-tools

產生 initramfs

$ sudo update-initramfs -c -k 4.19.66-v7l+
update-initramfs: Generating /boot/initrd.img-4.19.66-v7l+

/boot/config.txt 中加上一行

initramfs initrd.img-4.19.66-v7l+ followkernel

initramfs 必須要放在 /boot 中. followkernel 告訴 bootloader 把 initramfs 直接放在 kernel 之後, 這樣我們就不需要直接指定一個 address 給它.

順帶一提, 如果要在 config.txt 中指定 kernel image 的檔案名稱, 可加上這行

kernel=my-kernel.img

將 rootfs 放在 btrfs 上

Raspbian 的 kernel image 中沒有 built-in btrfs 的支援, 而是以 kernel module 的方式存在, 所以如果要以 btrfs 做為 rootfs, 需要配合 initramfs 才能在開機時 mount 上 btrfs rootfs.

首先裝上一個 package

apt install btrfs-progs

接著啟用 initramfs 的方式請參考 "啟用 initramfs" 這小段.

假設我們的 btrfs 要放在 USB stick 上 (/dev/sda1), 先 format 它

mkfs.btrfs /dev/sda1

Mount 到 /mnt, 建立一個叫 @ 的 subvol 用做放置 rootfs

mount /dev/sda1 /mnt
cd /mnt
btrfs subvol create @

在複製 rootfs 之前, 先關了 swap

systemctl disable dphys-swapfile

把目前的 rootfs 複製到 @

rsync -av --one-file-system --acls --xattrs / @

查詢 /dev/sda1 的 PARTUUID

# blkid 
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="F661-303B" TYPE="vfat" PARTUUID="fe102fc5-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="8d008fde-f12a-47f7-8519-197ea707d3d4" TYPE="ext4" PARTUUID="fe102fc5-02"
/dev/mmcblk0: PTUUID="fe102fc5" PTTYPE="dos"
/dev/sda1: UUID="1aa53676-7cf3-45d7-9183-446170486ce2" UUID_SUB="b6903991-b561-4aab-b22f-5605f23db805" TYPE="btrfs" PARTLABEL="primary" PARTUUID="e79f683b-1bac-48d8-9d62-dd4027524b73"

編輯 @/etc/fstab, 更新 rootfs 的 PARTUUID

proc                                            /proc           proc    defaults                        0       0
PARTUUID=fe102fc5-01                            /boot           vfat    defaults                        0       2
PARTUUID=e79f683b-1bac-48d8-9d62-dd4027524b73   /               btrfs   defaults,noatime,[email protected]       0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

編輯 /boot/cmdline.txt, 三個參數新增/變更如下

root=PARTUUID=e79f683b-1bac-48d8-9d62-dd4027524b73 rootfstype=btrfs [email protected]

/boot 同步到 @/boot

rsync -av --delete /boot/ @/boot

成功重新啟動之後, 可以對目前的 rootfs 做個 snapshot

apt clean
mount -o subvol=/ /dev/sda1 /mnt
cd /mnt
[[ -d "snapshots" ]] || btrfs subvol create snapshots
btrfs subvol snap -r @ snapshots/@v1

Bootloader And Boot ROM

官方 document

Pre-built Kernel, Firmware, Bootloader, ...

Boot 流程

Boot 問題處理

Bare Metal Development

板子設定資訊

官方 document

顯示輸出方面的設定

Build Your Own Kernel

官方 document

啟用 Watchdog

關閉週邊

Disable WiFi

SoC Manual

Device Tree 使用資訊

Github 上的 Documents

電力耗用

Benchmarking

Build System

主動散熱

板子上有提供 5V 的 PIN, 有 5V 小風扇的話可以直接接上 5V 跟 GNU 的 PIN, 參考此圖
https://elinux.org/File:Pi-GPIO-header-26-sm.png

簡易的自動開/關風扇控制
http://www.sensorsiot.org/variable-speed-cooling-fan-for-raspberry-pi-using-pwm-video138/

其他
https://www.allaboutcircuits.com/projects/raspberry-pi-project-control-a-dc-fan/

電源指示 LED

https://howchoo.com/g/ytzjyzy4m2e/build-a-simple-raspberry-pi-led-power-status-indicator

Shutdown/Power Button

參考這裡

問題處理

出現以下訊息: ERROR: ld.so: object '/usr/lib/arm-linux-gnueabihf/libarmmem-${PLATFORM}.so' from /etc/ld.so.preload cannot be preloaded (cannot open shared object file): ignored

原因可參考

可能的解決方案

看起來應該是修復了, 碰到這個問題的原因是我用了 snapd 安裝 docker, 在執行 docker 命令時產生的訊息, 應該是 snap 運行環境沒有 libarmmem-${PLATFORM}.so 造成的

add-apt-repository 時出錯: could not find a distribution template for Raspbian/buster

完整錯誤訊息如下

# add-apt-repository \
>    "deb [arch=armhf] https://download.docker.com/linux/debian \
>    $(lsb_release -cs) \
>    stable"
Traceback (most recent call last):
  File "/usr/bin/add-apt-repository", line 95, in <module>
    sp = SoftwareProperties(options=options)
  File "/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py", line 109, in __init__
    self.reload_sourceslist()
  File "/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py", line 599, in reload_sourceslist
    self.distro.get_sources(self.sourceslist)
  File "/usr/lib/python3/dist-packages/aptsources/distro.py", line 93, in get_sources
    (self.id, self.codename))
aptsources.distro.NoDistroTemplateException: Error: could not find a distribution template for Raspbian/buster

討論串

週邊

USB 多口網卡

效能

網卡

$ iperf3 -c 10.9.1.106 
Connecting to host 10.9.1.106, port 5201
[  4] local 10.9.1.123 port 43656 connected to 10.9.1.106 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec   113 MBytes   944 Mbits/sec    0    400 KBytes       
[  4]   1.00-2.00   sec   112 MBytes   941 Mbits/sec    0    400 KBytes       
[  4]   2.00-3.00   sec   113 MBytes   945 Mbits/sec    0    475 KBytes       
[  4]   3.00-4.00   sec   112 MBytes   942 Mbits/sec    0    475 KBytes       
[  4]   4.00-5.00   sec   112 MBytes   941 Mbits/sec    0    475 KBytes       
[  4]   5.00-6.00   sec   112 MBytes   941 Mbits/sec    0    475 KBytes       
[  4]   6.00-7.00   sec   112 MBytes   942 Mbits/sec    0    475 KBytes       
[  4]   7.00-8.00   sec   112 MBytes   941 Mbits/sec    2    345 KBytes       
[  4]   8.00-9.00   sec   112 MBytes   941 Mbits/sec    0    345 KBytes       
[  4]   9.00-10.00  sec   112 MBytes   941 Mbits/sec    0    345 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  1.10 GBytes   942 Mbits/sec    2             sender
[  4]   0.00-10.00  sec  1.09 GBytes   940 Mbits/sec                  receiver

iperf Done.

看起來沒什麼問題

Kernel 加/解密效能