Featured image of post RaspberryPi 5 and Gentoo

RaspberryPi 5 and Gentoo

树莓派5安装Gentoo

目录

Gentoo On RaspberryPi

该部分主要参考Gentoo Wiki,部分内容仅做简要描述。

SD分区

  1. 对SD进行分区
1
fdisk /dev/mmcblk0
  1. 创建DOS标签

  2. 创建启动分区

  3. 创建交换分区

  4. 创建跟分区

  5. 设置文件系统

  6. 最终检查

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Command (m for help): p
Disk /dev/sda: 59.48 GiB, 63864569856 bytes, 124735488 sectors
Disk model: Storage Device  
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x4fe0c75b

Device     Boot    Start       End   Sectors  Size Id Type
/dev/mmcblk0p1           2048    526335    524288  256M  b W95 FAT32
/dev/mmcblk0p2        526336  17303551  16777216    8G 82 Linux swap / Solaris
/dev/mmcblk0p3      17303552 124735487 107431936 51.2G 83 Linux
  1. 写入并格式化
1
2
3
mkfs -t vfat /dev/mmcblk0p1
mkswap --pagesize 16384 /dev/mmcblk0p2
mkfs -t ext4 /dev/mmcblk0p3

Gentoo基本系统

1. 挂载跟分区

1
2
mount /dev/mmcblk0p3 /mnt/gentoo
cd /mnt/gentoo/

2. 安装基本系统和portage快照

下载最新的stage文件,解压到跟分区

1
tar xpf /path/to/stage3-arm64-desktop-openrc-20240317T232028Z.tar.xz --xattrs-include='*.*' --numeric-owner

如果一切顺利,那么/mnt/gentoo/目录下应该是如下的文件系统层次结构

1
2
3
Johnson /mnt/gentoo # ls
bin   dev  home  lib64       media  opt   root  sbin  tmp  var
boot  etc  lib   lost+found  mnt    proc  run   sys   usr

下载最新的portage快照,解压到软件仓库目录

1
2
mkdir -p /mnt/gentoo/var/db/repos/gentoo
tar xpf /path/to/portage-latest.tar.bz2 --strip-components=1 -C /mnt/gentoo/var/db/repos/gentoo

3. 安装内核、模块和固件

克隆树莓派官方固件存储仓库git clone --depth=1 https://github.com/raspberrypi/firmware.git

将固件放入boot

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mount /dev/mmcblk0p1 /mnt/gentoo/boot

cp /path/to/firmware/boot/bcm2712-rpi-5-b.dtb /mnt/gentoo/boot/
cp /path/to/firmware/boot/fixup_cd.dat /mnt/gentoo/boot/
cp /path/to/firmware/boot/fixup.dat /mnt/gentoo/boot/
cp /path/to/firmware/boot/start_cd.elf /mnt/gentoo/boot/
cp /path/to/firmware/boot/start.elf /mnt/gentoo/boot/
cp /path/to/firmware/boot/bootcode.bin /mnt/gentoo/boot/
cp /path/to/firmware/boot/kernel8.img /mnt/gentoo/boot/
cp -r /path/to/firmware/boot/overlays/ /mnt/gentoo/boot/

另一种方法是利用交叉编译的方法从源码开始裁剪编译内核,详见树莓派内核指南

引导配置文件(编写/mnt/gentoo/boot/cmdline.txt 和 /mnt/gentoo/boot/config.txt)

4. 安装无线网络Module

从github上将二进制固件复制到/mnt/gentoo/lib/firmware/brcm/目录中并作软连接

克隆固件库git clone --depth=1 https://github.com/RPi-Distro/firmware-nonfree.git

然后创建存放固件的目录mkdir -p /mnt/gentoo/lib/firmware/brcm

树莓派5的wifi模式是brcmfmc43455,所以我们只需要复制brcmfmc43455的文件即可。

1
2
3
cp /path/to/raspberrypi/firmware-nonfree/debian/config/brcm80211/cypress/cyfmac43455-sdio-standard.bin /mnt/gentoo/lib/firmware/brcm/brcmfmac43455-sdio.bin
root #cp /path/to/raspberrypi/firmware-nonfree/debian/config/brcm80211/cypress/cyfmac43455-sdio.clm_blob /mnt/gentoo/lib/firmware/brcm/brcmfmac43455-sdio.clm_blob
cp /path/to/raspberrypi/firmware-nonfree/debian/config/brcm80211/brcm/brcmfmac43455-sdio.txt /mnt/gentoo/lib/firmware/brcm/

然后再对他们做软连接,最后连接完的目录如下:

1
2
3
4
5
6
7
8
root #ls -l /mnt/gentoo/lib/firmware/brcm/

-rw-r--r-- 1 root root 643651 Jan 21 12:20 brcmfmac43455-sdio.bin
 -rw-r--r-- 1 root root 2676 Jan 21 12:18 brcmfmac43455-sdio.clm_blob
 lrwxrwxrwx 1 root root 22 Jan 21 12:23 brcmfmac43455-sdio.raspberrypi,5-model-b.bin -> brcmfmac43455-sdio.bin
 lrwxrwxrwx 1 root root 27 Jan 21 12:23 brcmfmac43455-sdio.raspberrypi,5-model-b.clm_blob -> brcmfmac43455-sdio.clm_blob
 lrwxrwxrwx 1 root root 22 Jan 21 12:24 brcmfmac43455-sdio.raspberrypi,5-model-b.txt -> brcmfmac43455-sdio.txt
 -rw-r--r-- 1 root root 2074121 日 12:19 brcmfmac43455-sdio.txt

5. 安装蓝牙Module

克隆固件库git clone --depth=1 https://github.com/RPi-Distro/bluez-firmware.git

树莓派5的蓝牙只需要BCM4345C0.hcd,把他复制到目录然后做软连接。

1
2
3
cp /home/darthjoker/raspberrypi/bluez-firmware/debian/firmware/broadcom/BCM4345C0.hcd /mnt/gentoo/lib/firmware/brcm/

ln -s /mnt/gentoo/lib/firmware/brcm/BCM4345C0.hcd /mnt/gentoo/lib/firmware/brcm/BCM4345C0.raspberrypi,5-model-b.hcd

6. 编辑系统挂载表文件

/mnt/gentoo/etc/fstab

1
2
3
/dev/mmcblk0p1          /boot           vfat            noatime,noauto,nodev,nosuid,noexec	1 2
/dev/mmcblk0p2          swap            swap            defaults                                0 0
/dev/mmcblk0p3          /               ext4            noatime                                 0 0

至此,基本上所有的固件都装完了。如果您迫不及待的话,现在就可以卸载SD卡然后在RaspberryPi 5上启动自己的Gentoo了,但是您知道的,Gentoo这个系统需要配置的地方特别多,接下来请耐心看完。

7. 启动前的设置

如果你有以太网的话,直接就可以写在SD卡并启动树莓派,通过有线网络完成基本的配置了。

如果没有,那就只能先设置好无线网络了,先将Networkmanager软件所需要的文件下载到软件缓存库/var/cache/distfiles,然后启动树莓派再本地安装Networkmanager。

在登录树莓派之前,我们需要更改root用户的密码。直接简单粗暴的将/mnt/gentoo/etc/shadowroot这一行改为如下

1
root::::::::

如此一来,首次登录时直接使用root用户登录,不需要密码就可以直接登录,进入系统之后再passwd自己设置密码。

启动之后的配置

刚启动的树莓派系统时间肯定是对不上的,建议使用date -s "2024-03-20 16:13"手动设置一下,不然portage密钥对不上,根本安装不了软件包。

另外注意国内环境下可能需要换源,建议参考清华大学开源镜像站

该部分涉及到了/etc/portage/make.conf文件,以下是我的树莓派5的make.conf文件,可以参考一下。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ sudo cat /etc/portage/make.conf

# These settings were set by the catalyst build script that automatically
# built this stage.
# Please consult /usr/share/portage/config/make.conf.example for a more
# detailed example.
COMMON_FLAGS="-mcpu=cortex-a76+crc+crypto -mtune=cortex-a76 -O2 -pipe"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"

# This sets the language of build output to English.
# Please keep this setting intact when reporting bugs.
LC_MESSAGES=C.utf8

# WARNING: Changing your CHOST is not something that should be done lightly.
# Please consult https://wiki.gentoo.org/wiki/Changing_the_CHOST_variable before changing.
CHOST="aarch64-unknown-linux-gnu"


GENTOO_MIRRORS="https://mirrors.tuna.tsinghua.edu.cn/gentoo"
# NOTE: This stage was built with the bindist Use flag enabled
USE="X zsh-completion elogind -systemd"

VIDEO_CARDS="fbdev vc4 v3d"

1. iwd

对比Networkmanager,我个人更喜欢iwd,因此直接emerge安装iwd进行配置。

1
2
3
emerge --ask iwd
rc-update add iwd default
rc-update add dhcpcd default

sshd

1
rc-update add sshd default

注意使用kitty进行ssh时,要先kitty +kitten ssh root@192.168.8.88,不然会出现难以忍受的问题(试试就知道了)

2. 时区与时间同步

Openrc中时区的设置是通过/etc/timezone文件设置的

以中国为例,时区的设置如下:

1
2
3
echo "Asia/Shanghai" > /etc/timezone

emerge --config sys-libs/timezone-data

时间自动更新可以使用Chrony

3. add user

1
2
3
useradd -m -G users,wheel,video -s /bin/bash haoleng

passwd haoleng

4. 安装sudo

安装sudo emerge --ask sudo,然后编辑文件/etc/sudoers# %wheel ALL=(ALL:ALL) ALL的注释取消掉。就可以在普通用户环境下使用sudo提权了。

5. zsh

个人比较喜欢用zsh,可以通过emerge --ask zsh app-shells/gentoo-zsh-completions安装,下面是我在gentoo系统下的.zshrc文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# history
HISTSIZE=1000
SAVEHIST=1000
HISTFILE=~/.histfile
setopt INC_APPEND_HISTORY
setopt HIST_IGNORE_DUPS

setopt AUTO_PUSHD
setopt PUSHD_IGNORE_DUPS

setopt HIST_IGNORE_SPACE
setopt SHARE_HISTORY

# gentoo-zsh-completions
autoload -U compinit promptinit
compinit
promptinit; prompt gentoo

# alias
alias ra='yazi'
alias ne='neofetch'

# plugins
eval "$(starship init zsh)"
source /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh

# ssh
if [ -n "$SSH_CONNECTION" ]; then
    echo " "
    echo $( shuf ~/.local/share/dwm/script/messages.txt -n 1 | awk '{ print("󰕃 " $0) }' )
fi

记得安装git sudo emerge --ask dev-vcs/git,然后将zsh-autosuggestions插件clone到/usr/share/目录下。

另外推荐俩工具starshipyazi,用过都说好👍!

6. 安装桌面环境

Xorg桌面环境
安装dwm窗口管理器

本人使用的dwm源码:链接地址,如果要使用的话,记得安装依赖xorg-server, x11-libs/libXinerama,还有hack-nerd-font,然后直接进目录sudo make clean install就好了。

再在家目录添加xinitrc文件。echo "exec dwm" > ~/.xinitrc

开机自启需要编辑以下配置文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 开机自动登录
# Openrc /etc/inittab
......
#x1:12345:respawn:/sbin/agetty 38400 console linux
c1:12345:respawn:/sbin/agetty --autologin haoleng --noclear 38400 tty1 linux
c2:2345:respawn:/sbin/agetty 38400 tty2 linux
......

# 登录后执行startx
# zsh ~/.zprofile
if [ -z "${DISPLAY}" ] && [ "${XDG_VTNR}" -eq 1 ]; then
    exec startx
fi

另外需要注意的是,在树莓派5中使用xorg需要手动创建配置文件/etc/X11/xorg.conf.d/99-vc4.confg

1
2
3
4
5
6
7
8
# Shamelessly copied from PiOS

Section "OutputClass"
  Identifier "vc4"
  MatchDriver "vc4"
  Driver "modesetting"
  Option "PrimaryGPU" "true"
EndSection
配置VNC远程桌面

介于RealVNC收费的缘故,本人选择了TigerVNC作为VNC工具,详细可以参考WIKI,本人在此只做简要介绍。

本人并没有使用TigerVNC的服务器软件包,只是以最简单的方式实现了VNC功能,下面是本人认为关键的步骤:

1
2
3
4
5
6
7
sudo emerge --ask net-misc/tigervnc

vnc passwd ~/.vnc/passwd
# 最后一个选n
# 然后再在dwm启动脚本中加入
x0vncserver -PasswordFile ~/.vnc/passwd &
# 就可以在dwm启动后执行VNC服务
Wayland桌面环境

本人选择稳定的SwayWM,直接emerge --ask gui-wm/sway安装即可,需要注意的就是记得以drmUSE标志安装wlroots,如下:

1
2
3
4
emerge --info wlroots
↓↓↓↓↓↓
gui-libs/wlroots-0.17.2::gentoo was built with the following:
USE="X drm libinput session vulkan -liftoff -tinywl -x11-backend -xcb-errors"

然后可能才能启动Wayland,另外Wayland下的VNC需要安装wayvnc,然后再以headless模式启动Sway,我的配置文件在这里

GPIO
树莓派的备份

暂时先记这条: sudo dd if=/dev/mmcblk0 |gzip>/home/haoleng/raspberrypi.gz status=progress sudo gzip -dc raspberrypi.gz | sudo dd of=/dev/mmcblk0 status=progress

待续未完……

Licensed under CC BY-NC-SA 4.0
最后更新于 2024-08-04 11:23 CST