Gentoo Raspberry PI 4

这篇文章是记录如何在树莓派4上部署Gentoo,这篇文章是从老的笔记中拿出来的部分内容可能已经过期有空再来更新

最近买了个树莓派4b,使用2天原来的系统感觉还是不舒服,还是觉得gentoo比较舒服点,就打算在这个树莓派上安装gentoo,在此之前有在树莓派3b上安装过gentoo,但是主要是当作桌面的性能表现确实不好,这次打算安装好之后作为一个 arm64的binhost server来用的对于这个桌面性能要求不是很高了,有空的话我尝试测试一下桌面性能如何。

我手边没有其他的arm机器了,也没有显示器什么的可以适配这个树莓派,两眼一抹黑的决定还是用工作站当作交叉编译主机给这个树莓派安排一下。 工作站的系统是Gentoo非常适合做这个工作,首先安装crossdev工具:

emerge crossdev

确保你的/etc/portage/package.env是一个目录而非一个文件 创建交叉编译环境

crossdev -t aarch64-unknown-linux-gnu

安装完成之后可以用gcc-config -l检查,输出如下:

 [1] aarch64-unknown-linux-gnu-10.2.0 *

 [2] x86_64-pc-linux-gnu-8.4.0
 [3] x86_64-pc-linux-gnu-10.2.0 *

这样就是安装好了

除了crossdev之外还需要配置一下qemu用于之后的交叉编译和chroot 添加target

echo 'QEMU_SOFTMMU_TARGETS="alpha aarch64 arm i386 mips mips64 mips64el mipsel ppc ppc64 s390x sh4 sh4eb sparc sparc64 x86_64"' >> /etc/portage/make.conf
echo 'QEMU_USER_TARGETS="alpha aarch64 arm armeb i386 mips mipsel ppc ppc64 ppc64abi32 s390x sh4 sh4eb sparc sparc32plus sparc64"' >> /etc/portage/make.conf

确保你的qemu开启了static-userUSE

USE=static-user emerge app-emulation/qemu

或者是添加到文件再安装:

echo app-emulation/qemu static-user >> /etc/portage/package.use
emerge -av app-emulation/qemu

制作binray的qemu包(后续chroot需要)

quickpkg app-emulation/qemu

确保你的内核配置了CONFIG_BINFMT_MISC选项(模块或者是build-in) 加载binfmt_misc

[ -d /proc/sys/fs/binfmt_misc ] || modprobe binfmt_misc
[ -f /proc/sys/fs/binfmt_misc/register ] || mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc   

注册(我们这里用到的只有aarch64)

echo ':aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7:\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-aarch64:' > /proc/sys/fs/binfmt_misc/register

启动binfmt

/etc/init.d/qemu-binfmt start

如果你经常使用也可以加到开机启动当中

rc-update add qemu-binfmt

现在我们可以准备磁盘了,将存储卡放到读卡器然后插入电脑,进行分区 这里我分为2个分区一个 /boot 一个 / 250M给 /boot 分区 其余都给 / 格式化分区 格式化 /boot

mkfs -t vfat -F 32 /dev/sdd1

格式化 / (看wiki说这个选项比较重要,因为创建好之后就没办法改inode计数了gentoo本身的存储占用的inode比较大还是用这个选项比较好)

mkfs -i 8192 -t ext4 /dev/sdd2

创建挂载点:

mkdir -pv /mnt/gentoo

挂载/ :

mount /dev/sdd2 /mnt/gentoo

创建boot分区:

mkdir -pv /mnt/gentoo/boot

挂载boot分区:

mount /dev/sdd1 /mnt/gentoo/boot

创建一个工作目录

mkdir $HOME/raspberrypi && cd $HOME/raspberrypi

克隆固件

git clone -b stable --depth=1 https://github.com/raspberrypi/firmware

和linux源码

git clone --depth=1 https://github.com/raspberrypi/linux

配置linux内核(首先进入linux内核的目录)

cd linux

切换到最新的内核分支(查看所有的分支)

git branch -a
* rpi-5.4.y
  remotes/origin/HEAD -> origin/rpi-5.4.y
  remotes/origin/rpi-5.4.y    

这里看到只有一个:

git checkout rpi-5.4.y 

生成默认的配置文件

ARCH=arm64 CROSS_COMPILE=aarch64-unknown-linux-gnu-  make bcm2711_defconfig

配置(这里比较建议默认的cpu的调速改为 performance 不然这个弱鸡cpu可真的有慢的)

ARCH=arm64 CROSS_COMPILE=aarch64-unknown-linux-gnu- make menuconfig

构建内核

ARCH=arm64 CROSS_COMPILE=aarch64-unknown-linux-gnu- make -j12

到这里就可以下载stage3文件了,可以从官网下载最新的stage3 arm64文件 e.g.:

MIRRORS='https://bouncer.gentoo.org/fetch/root/all/releases/arm64/autobuilds'
ZIPFILENAME=`curl -L $MIRRORS/latest-stage3.txt |grep ^[0-9] |awk -F '[/ ]'  '{if (NR==1) {print $2}}'`
FILENAME=`curl -L $MIRRORS/latest-stage3.txt  2>/dev/null |grep ^[0-9]|awk '{if (NR==1) {print $1}}'`
FILEURL="$MIRRORS/$FILENAME"
wget -O /mnt/gentoo/$ZIPFILENAME $FILEURL > /tmp/download.log

安装stage3 文件:

cd /mnt/gentoo && tar vxpf stage3-* --xattrs-include='*.*' --numeric-owner .

复制固件到 boot:

cp -rv $HOME/raspberrypi/firmware/boot/* /mnt/gentoo/boot

里面有一些我们用不到的可以手动删除 安装内核

cp -v $HOME/raspberrypi/linux/arch/arm64/boot/Image /mnt/gentoo/boot/kernel8.img

安装内核模块

cd /path/to/raspberrypi/linux
ARCH=arm64 CROSS_COMPILE=aarch64-unknown-linux-gnu- make modules_install INSTALL_MOD_PATH=/mnt/gentoo

进入chroot

修改/etc/fstab文件追加以下内容

/dev/mmcblk0p1          /boot           vfat            noauto,noatime  1 2
/dev/mmcblk0p2          /               ext4            noatime         0 1

修改/boot/config.txt

# have a properly sized image
disable_overscan=1
arm_64bit=1
enable_gic=1
# lets have the VC4 hardware accelerated video
dtoverlay=vc4-fkms-v3d
# for sound over HDMI
hdmi_drive=2
# Enable audio (loads snd_bcm2835)
dtparam=audioon
# gpu_mem is for closed-source driver only; since we are only using the
# open-source driver here, set low
gpu_mem=16

创建并编辑/boot/cmdline.txt内容如下

root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

编辑/etc/portage/make.conf内容如下

# detailed example.
COMMON_FLAGS="-march=armv8-a+crc+simd -mtune=cortex-a72 -ftree-vectorize -O2 -pipe -fomit-frame-pointer"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"
MAKEOPTS="-j6"

# per https://wiki.gentoo.org/wiki/Raspberry_Pi_VC4
VIDEO_CARDS="fbdev vc4"
INPUT_DEVICES="evdev synaptics wacom"


PORTAGE_BUILDDIR="/var/tmp/portage"
GENTOO_MIRRORS="https://mirrors.tuna.tsinghua.edu.cn/gentoo"

L10N="en-US zh-CN en zh"
LINGUAS="en_US zh_CN en zh"
#FEATURES="-pid-sandbox"

ACCEPT_LICENSE="*"

ACCEPT_KEYWORDS="~arm64"
# 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"

# NOTE: This stage was built with the bindist Use flag enabled
PORTDIR="/var/db/repos/gentoo"
DISTDIR="/var/cache/distfiles"
PKGDIR="/var/cache/binpkgs"

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

配置root密码

passwd

配置gentoo上游的源 首先创建repos.conf文件夹

mkdir -pv /etc/portage/repos.conf/

创建并编辑 /etc/portage/repos.conf/gentoo.conf文件,内容如下:

[DEFAULT]
main-repo = gentoo

[gentoo]
location = /var/db/repos/gentoo
sync-type = git
sync-uri = https://github.com/gentoo-mirror/gentoo.git
auto-sync = yes

首先我们需要选择一下profile 列出所有的profile

eselect profile list
Available profile symlink targets:
  [1]   default/linux/arm64/17.0 (stable) *
  [2]   default/linux/arm64/17.0/desktop (stable)
  [3]   default/linux/arm64/17.0/desktop/gnome (stable)
  [4]   default/linux/arm64/17.0/desktop/gnome/systemd (stable)
  [5]   default/linux/arm64/17.0/desktop/plasma (stable)
  [6]   default/linux/arm64/17.0/desktop/plasma/systemd (stable)
  [7]   default/linux/arm64/17.0/desktop/systemd (stable)
  [8]   default/linux/arm64/17.0/developer (stable)
  [9]   default/linux/arm64/17.0/systemd (stable)
  [10]  default/linux/arm64/17.0/big-endian (exp)
  [11]  default/linux/arm64/17.0/musl (exp)
  [12]  default/linux/arm64/17.0/musl/hardened (exp)

选择第一个(我不是systemd用户)

eselect profile set 1

更新系统

emerge -auvDN @world

但是在这里会爆一个qemu的错误(因为qemu不支持pid-sandbox和netwokr-sandbox)这里要更新系统还是要添加env

env FEATURES="-pid-sandbox -network-sandbox" emerge -auvDN @world 

或者你可以选择给make.conf里面添加然后不加env运行

我这里没有很复杂的网络情况,直接就是一个网线接交换机的,用不到Wi-Fi之类的所以我这里就直接安装一个dhcp客户端就ok

env FEATURES="-pid-sandbox -network-sandbox" emerge -av dhcpcd

加入开机启动

rc-update add dhcpcd default

为了方便管理这里我们还需要创建一个管理用户

useradd --create-home --groups "wheel,portage" --shell /bin/bash --comment "chris" chris

设置密码

passwd chris

如果你需要root登陆你可以编辑/etc/ssh/sshd_config修改PermitRootLogin选项

PermitRootLogin yes

开机启动ssh服务

rc-update add sshd default

想要管理用户生效我们还需要安装sudo这个包

env FEATURES="-pid-sandbox -network-sandbox" emerge -av sudo

修改/etc/sudoers文件

sed -i 's/\# \%wheel ALL=(ALL) ALL/\%wheel ALL=(ALL) ALL/g' /etc/sudoers

设置为亚洲上海时区

echo "Asia/Shanghai"  > /etc/timezone
emerge --ask sys-libs/timezone-data

为了后续方便找到这个树莓派可以给它设置一个主机名,编辑/etc/conf.d/hostname内容如下:

hostname="rpi4"
echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
locale-gen

现在基本的gentoo系统已经安装完成了我们现在就可以卸载掉sd卡插入树莓派然后boooom了!

exit

卸载

umount -R /mnt/gentoo && sync

记得同步一下,现在就可以把存储卡查到树莓派里面开机了,然后查找一下dhcp池子里面有没有你的设备