Gentoo Linux是一个万能的,基于源代码的Linux发行版——可以变成任何你需要的系统——甚至更强大。他的官网是https://www.gentoo.org/,文档位于https://wiki.gentoo.org/。Portage是他的强大的包管理器,是用python和bash写成的。
https://www.linux-mips.org/上有两篇文章,《MIPS ABI History》、《WhatsWrongWithO32N32N64》。简单的说o32相当于MIPS32的IA-32,n32相当于MIPS64的x32,n64相当于MIPS64的AMD64。这里我选择安装n64系统。
安装Gentoo需要准备三样工具:
在《走进龙芯3A3000(一)安装Loongnix 》中我已经安装了一个Loongnix。Loongnix的软件都不是最新的版本,这也是我为什么要安装Gentoo的原因。不过Loongnix可以提供一个可以启动的Linux环境,正好拿来用。
安装手册位于https://wiki.gentoo.org/有中文的,和英文的(当然还有其他语言的版本)。我的整个安装过程将和手册对照。过程中的注释指示这对应手册的标题。
我没有使用官方的stage3 tarball,官方对于MIPS的支持很陈旧了。我也曾尝试过自己制作一个stage1、2、3的tarball,无奈没有成功。不过我在这里:n64 stages for mipsel… any interest?找到了一个MIPS64el n64的stage3 tarball。经过测试可用。
#** Choosing the media **
# Choosing the right installation medium
http://www.longlandclan.id.au/~stuartl/gentoo/mips/n64/stage3-mipsel3_n64-20170509.tar.bz2
#** Configuring the network **
#** Preparing the disks **
lvcreate -L 30G -nslash-gentoo-n64 vg
lvcreate -L 30G -nhome-gentoo-n64 vg
mkfs.ext4 /dev/vg/slash-gentoo-n64
mkfs.ext4 /dev/vg/home-gentoo-n64
mkdir /media/gentoo-n64
mount /dev/vg/slash-gentoo-n64 /media/gentoo-n64
mkdir -p /media/gentoo-n64/{home,boot}
mount /dev/vg/home-gentoo-n64 /media/gentoo-n64/home
mount /dev/sda1 /media/gentoo-n64/boot
#** Installing stage3 **
# Installing a stage tarball
date
tar xpf stage3-mipsel3_n64-20170509.tar.bz2 --xattrs-include='*.*' --numeric-owner -C /media/gentoo-n64/
vi /media/gentoo-n64/etc/portage/make.conf
MAKEOPT="-j5"
GENTOO_MIRRORS="https://mirrors.aliyun.com/gentoo/"
# Loongnix have not mirrorselect, so add GENTOO_MIRRORS manually
#** Installing base system **
# Chrooting
mkdir --parents /media/gentoo-n64/etc/portage/repos.conf
cp /media/gentoo-n64/usr/share/portage/config/repos.conf /media/gentoo-n64/etc/portage/repos.conf/gentoo.conf
cp --dereference /etc/resolv.conf /media/gentoo-n64/etc/
mount --types proc /proc /media/gentoo-n64/proc
mount --rbind /sys /media/gentoo-n64/sys
mount --make-rslave /media/gentoo-n64/sys
mount --rbind /dev /media/gentoo-n64/dev
mount --make-rslave /media/gentoo-n64/dev
chroot /media/gentoo-n64/ /bin/bash
Loongson-3A3000 / # source /etc/profile
Loongson-3A3000 / # export PS1="(chroot) $PS1"
(chroot) Loongson-3A3000 / #
# Configuring Portage
emerge-webrsync
eselect news read
eselect profile list
# make sure profile point to n64
# --force must be between "set" word and "12"
eselect profile set --force 12
[12] default/linux/mips/13.0/mipsel/multilib/n64 (exp)
vi /etc/nsswitch.conf
...
passwd: compat files
shadow: compat files
group: compat files
...
emerge -e system
# End
exit
cd
umount -l /media/gentoo-n64/dev{/shm,/pts,}
umount -R /media/gentoo-n64
#========== [插曲] make a stage3-N64 tarball =========#
mount /dev/vg/slash-gentoo-n64 /media/gentoo-n64
mount /dev/vg/home-gentoo-n64 /media/gentoo-n64/home
mount /dev/sda1 /media/gentoo-n64/boot
mount --types proc /proc /media/gentoo-n64/proc
mount --rbind /sys /media/gentoo-n64/sys
mount --make-rslave /media/gentoo-n64/sys
mount --rbind /dev /media/gentoo-n64/dev
mount --make-rslave /media/gentoo-n64/dev
chroot /media/gentoo-n64/ /bin/bash
source /etc/profile
export PS1="(chroot) $PS1"
exit
cd
umount -l /media/gentoo-n64/dev{/shm,/pts,}
umount -R /media/gentoo-n64
#reboot
mount /dev/vg/slash-gentoo-n64 /media/gentoo-n64
#
c
cd usr/portage
rm * -rf
cd /media/gentoo-n64/
vi etc/portage/make.conf
delete all except CHOST
cd etc/portage/
rm repos.conf -rf
rm /media/gentoo-n64/etc/resolv.conf -f
# make a stage3 tarball
tar cjvpf /home/lophyxp/下载/stage3-mips64r2el-n64-20180509.tar.bz2 .
#============== End make =============#
# to be continue...
mount /dev/vg/slash-gentoo-n64 /media/gentoo-n64
mount /dev/vg/home-gentoo-n64 /media/gentoo-n64/home
vi /media/gentoo-n64/etc/portage/make.conf
USE="networkmanager bash-completion"
MAKEOPT="-j5"
LINGUAS="zh zh_CN"
L10N="zh-CH"
INPUT_DEVICES="libinput"
VIDEO_CARDS="radeon radeonsi amdgpu"
GENTOO_MIRRORS="https://mirrors.aliyun.com/gentoo/"
#** Installing base system **
# Chrooting
mkdir --parents /media/gentoo-n64/etc/portage/repos.conf
cp /media/gentoo-n64/usr/share/portage/config/repos.conf /media/gentoo-n64/etc/portage/repos.conf/gentoo.conf
cp --dereference /etc/resolv.conf /media/gentoo-n64/etc/
mount --types proc /proc /media/gentoo-n64/proc
mount --rbind /sys /media/gentoo-n64/sys
mount --make-rslave /media/gentoo-n64/sys
mount --rbind /dev /media/gentoo-n64/dev
mount --make-rslave /media/gentoo-n64/dev
chroot /media/gentoo-n64/ /bin/bash
source /etc/profile
export PS1="(chroot) $PS1"
# Configuring Portage
emerge-webrsync
eselect news read
eselect profile list
# Updating the @world set
emerge -uDN world
#Timezone
ls /usr/share/zoneinfo
echo "Asia/Shanghai" > /etc/timezone
emerge --config sys-libs/timezone-data
# Configure locales
nano -w /etc/locale.gen
zh_CN.UTF-8 UTF-8
locale-gen
eselect locale list
eselect locale set 3
env-update && source /etc/profile && export PS1="(chroot) $PS1"
# diff -u mkspecs/features/functions.prf.orig mkspecs/features/functions.prf > /etc/portage/qmake-enable-arch-mips64el-20180609.patch
#
mkdir -p /etc/portage/patches/sys-kernel/genkernel/
cd /etc/portage/patches/sys-kernel/genkernel/
vi genkernel-default-ld-arch-mips64el-20180809.patch
--- a/arch/mips/config.sh 2018-08-09 12:04:20.835098252 +0800
+++ b/arch/mips/config.sh 2018-08-09 12:05:05.835311954 +0800
@@ -16,4 +16,5 @@
# genkernel on mips is only used for LiveCDs && netboots. Catalyst
# will know where to get the kernels at.
-CMD_INSTALL=0
+CMD_INSTALL=1
+DEFAULT_UTILS_LD=gcc
vi /etc/portage/bashrc
pre_src_prepare() {
[[ ${EAPI:-0} == [012345] ]] || return
if ! type estack_push > /dev/null 2>&1; then
local estack_names="eshopts_push eshopts_pop evar_push evar_push_set evar_pop estack_push estack_pop"
source <(awk "/^# @(FUNCTION|VARIABLE): / { p = 0 } /^# @(FUNCTION|VARIABLE): (${estack_names// /|})\$/ { p = 1 } p { print }" ${PORTDIR}/eclass/estack.eclass)
fi
if ! type epatch_user > /dev/null 2>&1; then
local epatch_names="EPATCH_SOURCE EPATCH_USER_SOURCE epatch_user_death_notice epatch_user epatch"
source <(awk "/^# @(FUNCTION|VARIABLE): / { p = 0 } /^# @(FUNCTION|VARIABLE): (${epatch_names// /|})\$/ { p = 1 } p { print }" ${PORTDIR}/eclass/epatch.eclass)
fi
epatch_user
for name in $epatch_names; do
unset $name
done
for name in $estack_names; do
unset $name
done
}
#** Configuring the kernel **
# Installing the sources
# Alternative: Using genkernel
cd /etc/portage
mkdir package.use
touch package.use/default.use
mkdir package.mask
touch package.mask/default.mask
emerge -a gentoo-sources genkernel
eselect kernel list
eselect kernel set 1
nano -w /etc/fstab
/dev/sda1 /boot ext2 noauto,noatime 1 2
/dev/vg/slash-gentoo-n64 / ext4 noatime 0 1
/dev/vg/home-gentoo-n64 /home ext4 noatime 0 1
/dev/vg/swap none swap sw 0 0
# need --firmware Enable copying of firmware
# into initramfs to init AMD gfx card
genkernel --kernel-config=/usr/src/linux/arch/mips/configs/loongson3_defconfig --menuconfig --lvm --install --firmware all
Machine selection
[*] RS780/SBX00 HPET Timer
General setup
(-n64) Local version - append to kernel release
<*> Kernel .config
[*] Enable access to .config through /proc/config.gz
......
[ ] Enable deprecated sysfs features to support old userspace too
genkernel --kernel-config=/usr/src/def-3a.conf --no-clean --no-mrproper --install --lvm --firmware all
# compiling done,但是genkernel居然不自动install
cd /var/tmp/genkernel
mount /dev/sda1 /boot
# cp *gentoo-n64* /boot
#** Configuring the system **
# Filesystem information
# nano -w /etc/fstab
# bypass!
# Networking information
nano -w /etc/conf.d/hostname
# Set to the hostname of this machine
hostname="loongson-3A3000"
nano -w /etc/conf.d/net
# Set the dns_domain_lo variable to the selected domain name
dns_domain_lo="localdomain"
# Set the nis_domain_lo variable to the selected NIS domain name
nis_domain_lo="local-nisdomain"
# Configuring the network
emerge --ask --noreplace net-misc/netifrc
nano -w /etc/conf.d/net
config_enp6s0="dhcp"
# Automatically start networking at boot
cd /etc/init.d/
ln -s net.lo net.enp6s0
rc-update add net.enp6s0 default
# The hosts file
nano -w /etc/hosts
127.0.0.1 loongson-3A3000.localdomain loongson-3A3000
::1 localhost
# System information
# Root password
passwd
# a user login informat
groupadd -g 1000 lophyxp
useradd -g lophyxp -m lophyxp
gpasswd -a lophyxp wheel
passwd lophyxp
# Init and boot configuration
nano -w /etc/rc.conf
nano -w /etc/conf.d/keymaps
nano -w /etc/conf.d/hwclock
clock="local"
#** Installing Tools**
# System logger
emerge --ask app-admin/sysklogd
rc-update add sysklogd default
mkdir -p /var/log/news
cd /var/log/news
touch news.{crit,err,notice}
# Optional: Cron daemon
emerge --ask sys-process/cronie
rc-update add cronie default
crontab /etc/crontab
# Optional: File indexing
emerge --ask sys-apps/mlocate
#updatedb
# Optional: Remote access
rc-update add sshd default
nano -w /etc/inittab
# SERIAL CONSOLES
s0:12345:respawn:/sbin/agetty 9600 ttyS0 vt100
s1:12345:respawn:/sbin/agetty 9600 ttyS1 vt100
# Filesystem tools
emerge --ask sys-fs/e2fsprogs
# lvm
emerge --ask lvm2
rc-update add lvm boot
# vim
emerge --ask vim
# Networking tools
# Installing a DHCP client
emerge --ask net-misc/dhcpcd
# cookie: HIDPI font for tty
emerge --ask media-fonts/terminus-font
vi /etc/conf.d/consolefont
consolefont="ter-132b"
rc-update add consolefont boot
#** Configuring the bootloader **
# PMON没有Intel架构上的MBR的概念,
# PMON本身就是bootloader。
# 任何存在boot.cfg文件的可识别文件系统
# (vfat,ext2)都可以启动。
# boot.cfg的语法如下:
mount /dev/sda1 /boot
vi /boot/boot.cfg
timeout 5
default 0
showmenu 1
title 'Gentoo Linux N64'
kernel (wd0,0)/kernel-genkernel-mips-4.16.13-gentoo-n64
initrd (wd0,0)/initramfs-genkernel-mips-4.16.13-gentoo-n64
args root=/dev/mapper/vg-slash--gentoo--n64 ro dolvm
# Rebooting the system
exit
cd
umount -l /media/gentoo-n64/dev{/shm,/pts,}
umount -R /media/gentoo-n64
reboot