Gentoo Raspberry PI 4
这篇文章是记录如何在树莓派4上部署Gentoo,这篇文章是从老的笔记中拿出来的部分内容可能已经过期有空再来更新
最近买了个树莓派4b,使用2天原来的系统感觉还是不舒服,还是觉得gentoo比较舒服点,就打算在这个树莓派上安装gentoo,在此之前有在树莓派3b上安装过gentoo,但是主要是当作桌面的性能表现确实不好,这次打算安装好之后作为一个 arm64的binhost server来用的对于这个桌面性能要求不是很高了,有空的话我尝试测试一下桌面性能如何。
Crossdev
我手边没有其他的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 *
这样就是安装好了
QEMU-USER
除了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-user
USE
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文件了,可以从官网下载最新的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
fstab
修改/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池子里面有没有你的设备