Gentoo On RaspberryPi
该部分主要参考Gentoo Wiki,部分内容仅做简要描述。
SD分区
- 对SD进行分区
-
创建DOS标签
-
创建启动分区
-
创建交换分区
-
创建跟分区
-
设置文件系统
-
最终检查
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
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 2074 年 1 月 21 日 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/shadow中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/目录下。
另外推荐俩工具starship和yazi,用过都说好👍!
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
待续未完……