第 21.7 节 Linux 兼容层——基于 Gentoo Linux
构建基本系统
# sysrc linux_enable="YES"# sysrc kld_list+="linux linux64"# kldload linux64# service linux start# sysrc dbus_enable="YES" #一般桌面已经配置# service dbus start #一般桌面已经配置
# wget https://mirrors.ustc.edu.cn/gentoo/releases/amd64/autobuilds/20230101T164658Z/stage3-amd64-systemd-20230101T164658Z.tar.xz #该链接不固定!自己找。# mkdir -p /compat/gentoo# tar xpvf stage3-amd64-systemd-20230101T164658Z.tar.xz -C /compat/gentoo --numeric-owner
编辑 ee /etc/fstab
,加入:
# Device Mountpoint FStype Options Dump Pass#devfs /compat/gentoo/dev devfs rw,late 0 0tmpfs /compat/gentoo/dev/shm tmpfs rw,late,size=1g,mode=1777 0 0fdescfs /compat/gentoo/dev/fd fdescfs rw,late,linrdlnk 0 0linprocfs /compat/gentoo/proc linprocfs rw,late 0 0linsysfs /compat/gentoo/sys linsysfs rw,late 0 0/tmp /compat/gentoo/tmp nullfs rw,late 0 0#/home /compat/gentoo/home nullfs rw,late 0 0
# mount -al # 检查有无编写错误
编辑:
ee /compat/gentoo/etc/portage/make.conf
加入:
MAKEOPTS="-j2"GENTOO_MIRRORS="https://mirrors.ustc.edu.cn/gentoo"FEATURES="-ipc-sandbox -mount-sandbox -network-sandbox -pid-sandbox -xattr -sandbox -usersandbox"
进行常见配置:
# mkdir -p /compat/gentoo/etc/portage/repos.conf # 此时位于 FreeBSD!# cp /compat/gentoo/usr/share/portage/config/repos.conf /compat/gentoo/etc/portage/repos.conf/gentoo.conf # 此时位于 FreeBSD!# cp /etc/resolv.conf /compat/gentoo/etc/ # 此时位于 FreeBSD!复制 DNS 解析。
换源
# ee /compat/gentoo/etc/portage/repos.conf/gentoo.conf # 此处位于 FreeBSD!
把sync-uri = rsync://rsync.gentoo.org/gentoo-portage
修改为 sync-uri = rsync://mirrors.tuna.tsinghua.edu.cn/gentoo-portage
# chroot /compat/gentoo /bin/bash # 此处位于 Gentoo!
获取 Gentoo ebuild 数据库快照
# emerge-webrsync
换源后操作
测试安装 screenfetch:
ykla / # emerge -v screenfetch
* IMPORTANT: 10 news items need reading for repository 'gentoo'. * Use eselect news read to view new items.
These are the packages that would be merged, in order:
Calculating dependencies... done!Dependency resolution took 2.51 s.
[ebuild N ] app-misc/screenfetch-3.9.1::gentoo USE="-X -curl" 76 KiB
Total: 1 package (1 new), Size of downloads: 76 KiB
>>> Verifying ebuild manifests
>>> Emerging (1 of 1) app-misc/screenfetch-3.9.1::gentoo>>> Downloading 'https://mirrors.ustc.edu.cn/gentoo/distfiles/cc/screenfetch-3.9.1.tar.gz'--2023-07-11 16:38:16-- https://mirrors.ustc.edu.cn/gentoo/distfiles/cc/screenfetch-3.9.1.tar.gzResolving mirrors.ustc.edu.cn... 2001:da8:d800:95::110, 202.141.160.110Connecting to mirrors.ustc.edu.cn|2001:da8:d800:95::110|:443... failed: No route to host.Connecting to mirrors.ustc.edu.cn|202.141.160.110|:443... connected.HTTP request sent, awaiting response... 200 OKLength: 77350 (76K) [application/octet-stream]Saving to: ‘/var/cache/distfiles/screenfetch-3.9.1.tar.gz.__download__’
/var/cache/distfile 100%[===================>] 75.54K --.-KB/s in 0.05s
2023-07-11 16:38:17 (1.48 MB/s) - ‘/var/cache/distfiles/screenfetch-3.9.1.tar.gz.__download__’ saved [77350/77350]
* screenfetch-3.9.1.tar.gz BLAKE2B SHA512 size ;-) ... [ ok ]>>> Unpacking source...>>> Unpacking screenfetch-3.9.1.tar.gz to /var/tmp/portage/app-misc/screenfetch-3.9.1/work>>> Source unpacked in /var/tmp/portage/app-misc/screenfetch-3.9.1/work>>> Preparing source in /var/tmp/portage/app-misc/screenfetch-3.9.1/work/screenFetch-3.9.1 ...>>> Source prepared.>>> Configuring source in /var/tmp/portage/app-misc/screenfetch-3.9.1/work/screenFetch-3.9.1 ...>>> Source configured.>>> Compiling source in /var/tmp/portage/app-misc/screenfetch-3.9.1/work/screenFetch-3.9.1 ...>>> Source compiled.>>> Test phase [not enabled]: app-misc/screenfetch-3.9.1
>>> Install app-misc/screenfetch-3.9.1 into /var/tmp/portage/app-misc/screenfetch-3.9.1/image>>> Completed installing app-misc/screenfetch-3.9.1 into /var/tmp/portage/app-misc/screenfetch-3.9.1/image
* Final size of build directory: 166 KiB * Final size of installed tree: 5 KiB
>>> Installing (1 of 1) app-misc/screenfetch-3.9.1::gentoo * checking 4 files for package collisions>>> Merging app-misc/screenfetch-3.9.1 to /--- /usr/--- /usr/share/--- /usr/share/doc/>>> /usr/share/doc/screenfetch-3.9.1/>>> /usr/share/doc/screenfetch-3.9.1/CHANGELOG.bz2>>> /usr/share/doc/screenfetch-3.9.1/README.mkdn.bz2>>> /usr/share/doc/screenfetch-3.9.1/TODO.bz2--- /usr/bin/>>> /usr/bin/screenfetch>>> app-misc/screenfetch-3.9.1 merged.
>>> Recording app-misc/screenfetch in "world" favorites file...
>>> Completed (1 of 1) app-misc/screenfetch-3.9.1::gentoo
* GNU info directory index is up-to-date.
* IMPORTANT: 10 news items need reading for repository 'gentoo'. * Use eselect news read to view new items.
可以正常安装软件。
ykla / # screenfetchgrep: warning: stray \ before "grep: warning: stray \ before " -/oyddmdhs+:. ykla@ykla -odNMMMMMMMMNNmhy+-` OS: Gentoo -yNMMMMMMMMMMMNNNmmdhy+- Kernel: x86_64 Linux 6.2.10 `omMMMMMMMMMMMMNmdmmmmddhhy/` Uptime: 1h 26m omMMMMMMMMMMMNhhyyyohmdddhhhdo` Packages: 295.ydMMMMMMMMMMdhs++so/smdddhhhhdm+` Shell: bash 5.1.16 oyhdmNMMMMMMMNdyooydmddddhhhhyhNd. Resolution: No X Server :oyhhdNNMMMMMMMNNNmmdddhhhhhyymMh WM: Not Found .:+sydNMMMMMNNNmmmdddhhhhhhmMmy Disk: 8.9G / 45G (20%) /mMMMMMMNNNmmmdddhhhhhmMNhs: CPU: Intel Core i5-3230M @ 2x 2.594GHz `oNMMMMMMMNNNmmmddddhhdmMNhs+` RAM: 3209MiB / 4038MiB `sNMMMMMMMMNNNmmmdddddmNMmhs/. /NMMMMMMMMNNNNmmmdddmNMNdso:`+MMMMMMMNNNNNmmmmdmNMNdso/-yMMNNNNNNNmmmmmNNMmhs+/-`/hMMNNNNNNNNMNdhs++/-``/ohdmmddhys+++/:.` `-//////:--.ykla / #
shell 脚本
# fetch http://book.bsdcn.org/gentoo.sh# sh gentoo.sh
脚本内容:
rootdir=/compat/gentoofetch https://mirrors.ustc.edu.cn/gentoo/releases/amd64/autobuilds/latest-stage3-amd64-systemd.txtgentoodownload=$(echo |sed -n '3p' latest-stage3-amd64-systemd.txt|awk -F ' ' '{print $1}')rm latest-stage3-amd64-systemd.txt
url="https://mirrors.ustc.edu.cn/gentoo/releases/amd64/autobuilds/"
echo "Begin to install latest Gentoo Linux ..."echo "check modules ..."
# check linux moduleif [ "$(sysrc -n linux_enable)" = "NO" ]; then echo "linux module should be loaded. Continue?(Y|n)" read answer case $answer in [Nn][Oo]|[Nn]) echo "linux module not loaded" exit 1 ;; [Yy][Ee][Ss]|[Yy]|"") sysrc linux_enable=YES ;; esacfiecho "start linux"service linux start
# check dbusif ! /usr/bin/which -s dbus-daemon;then echo "dbus-daemon not found. install it [Y|n]" read answer case $answer in [Nn][Oo]|[Nn]) echo "dbus not installed" exit 2 ;; [Yy][Ee][Ss]|[Yy]|"") pkg install -y dbus ;; esac fi
if [ "$(sysrc -n dbus_enable)" != "YES" ]; then echo "dbus should be enable. Continue?(Y|n)" read answer case $answer in [Nn][Oo]|[Nn]) echo "dbus not running" exit 2 ;; [Yy][Ee][Ss]|[Yy]|"") sysrc dbus_enable=YES ;; esacfiecho "start dbus"service dbus start
echo "now we will bootstrap gentoo"
fetch ${url}/$gentoodownloadmkdir -p ${rootdir}tar zxvf stage3-amd64-systemd*.tar.xz -C ${rootdir} --numeric-ownerrm stage3-amd64-systemd*.tar.xz
if [ ! "$(sysrc -f /boot/loader.conf -qn nullfs_load)" = "YES" ]; then echo "nullfs_load should load. continue? (Y|n)" read answer case $answer in [Nn][Oo]|[Nn]) echo "nullfs not load" exit 3 ;; [Yy][Ee][Ss]|[Yy]|"") sysrc -f /boot/loader.conf nullfs_load=yes ;; esacfi
if ! kldstat -n nullfs >/dev/null 2>&1;then echo "load nullfs module" kldload -v nullfsfi
echo "mount some fs for linux"echo "devfs ${rootdir}/dev devfs rw,late 0 0" >> /etc/fstabecho "tmpfs ${rootdir}/dev/shm tmpfs rw,late,size=1g,mode=1777 0 0" >> /etc/fstabecho "fdescfs ${rootdir}/dev/fd fdescfs rw,late,linrdlnk 0 0" >> /etc/fstabecho "linprocfs ${rootdir}/proc linprocfs rw,late 0 0" >> /etc/fstabecho "linsysfs ${rootdir}/sys linsysfs rw,late 0 0" >> /etc/fstabecho "/tmp ${rootdir}/tmp nullfs rw,late 0 0" >> /etc/fstab#echo "/home ${rootdir}/home nullfs rw,late 0 0" >> /etc/fstabmount -al
echo "for Gentoo Linux, we should change 'compat.linux.osrelease' to upgrade Linux kernel version, continue? (Y|n)"read answercase $answer in [Nn][Oo]|[Nn]) echo "close to success" exit 4 ;; [Yy][Ee][Ss]|[Yy]|"") echo "compat.linux.osrelease=6.2.10" >> /etc/sysctl.conf sysctl compat.linux.osrelease=6.2.10 ;;esacecho "complete!"echo "to use: chroot ${rootdir} /bin/bash"echo ""echo " I will set resolv.conf to ali dns"echo "continue?[Y|n]"read answercase $answer in [Nn][Oo]|[Nn]) echo "set your gentoo by yourself.bye!" exit 0 ;; [Yy][Ee][Ss]|[Yy]|"") echo "nameserver 223.5.5.5" >> ${rootdir}/etc/resolv.conf
echo "Now write MAKEOPTS FEATURES in /compat/gentoo/etc/portage/make.conf -- using USTC mirrors for GENTOO_MIRRORS"echo "MAKEOPTS=\"-j2\"" >> /${rootdir}/etc/portage/make.confecho "GENTOO_MIRRORS=\"https://mirrors.ustc.edu.cn/gentoo\"" >> ${rootdir}/etc/portage/make.confecho "FEATURES=\"-ipc-sandbox -mount-sandbox -network-sandbox -pid-sandbox -xattr -sandbox -usersandbox\"" >> ${rootdir}/etc/portage/make.conf
echo "Now setting soft sources --Using TUNA mirror for emerge-webrsync"mkdir -p ${rootdir}/etc/portage/repos.confcp ${rootdir}/usr/share/portage/config/repos.conf ${rootdir}/etc/portage/repos.conf/gentoo.confsed -i "" 's/rsync.gentoo.org/mirrors.tuna.tsinghua.edu.cn/' ${rootdir}/etc/portage/repos.conf/gentoo.conf
echo " I will run emerge-webrsync"chroot ${rootdir} /bin/bash -c "emerge-webrsync"
echo "all done." echo "Now you can run '#chroot /compat/gentoo/ /bin/bash' Into gentoo"
;;esac