第 21.8 节 Linux 兼容层——基于 Rocky Linux
# fetch http://book.bsdcn.org/rocky.sh# sh rocky.sh
脚本内容如下:
#!/bin/sh
ROOT_DIR=/compatDIST=rockyDIST_FULLNAME="Rocky Linux"VER=9SUB_VER=2TIME_VER="latest"SORT=BaseFILE=Rocky-${VER}-Container-${SORT}.${TIME_VER}.x86_64.tar.xzSUBDIR=""URL=https://mirrors.ustc.edu.cn/${DIST}/${VER}.${SUB_VER}/images/x86_64UPDATE_CMD="dnf makecache"UPGRADE_CMD="dnf upgrade -y"INSTALL_CMD="dnf install -y"UPDATE=1UPGRADE=1INSTALL=1
echo "Starting to install ${DIST_FULLNAME}"sleep 0.5
# check.shecho "Checking relative modules"
if [ ! "$(sysrc -n linux_enable)" = "YES" ]; then echo "linux service is not enabled. Enable it now?(Y|n)" read ANSWER case ${ANSWER} in [Nn][Oo]|[Nn]) echo "Warning: You MUST start linux service with \"service linux start\" EACH TIME FREEBSD IS REBOOTED." echo "Sure to continue without enabling linux service?(y|N)" read ANSWER case ${ANSWER} in [Yy][Ee][Ss]|[Yy]) echo "WARNING: linux moudle not enabled" ;; [Nn][Oo]|[Nn]|"") echo "Enabling linux moudle" sysrc linux_enable=YES ;; *) echo "Aborting." exit 4 ;; esac ;; [Yy][Ee][Ss]|[Yy]|"") echo "Enabling linux moudle" sysrc linux_enable=YES ;; *) echo "Aborting." exit 4 ;; esacfi
echo "Starting linux service"service linux start
if ! which -s dbus-daemon; then echo "dbus-daemon not found. Install dbus now?(Y|n)" read ANSWER case ${ANSWER} in [Nn][Oo]|[Nn]) echo "Abort. dbus not installed" exit 2 ;; [Yy][Ee][Ss]|[Yy]|"") echo "Installing dbus" pkg install -y dbus ;; *) echo "Aborting." exit 4 ;; esacfi
if [ ! "$(sysrc -n dbus_enable)" = "YES" ]; then echo "dbus is not enabled. Enable it now?(Y|n)" read ANSWER case ${ANSWER} in [Nn][Oo]|[Nn]) echo "WARNING: You MUST start dbus with \"service dbus start\" EACH TIME FREEBSD IS REBOOTED." echo "Sure to continue without enabling dbus?(y|N)" read ANSWER case ${ANSWER} in [Yy][Ee][Ss]|[Yy]) echo "Warning: dbus service not enabled" ;; [Nn][Oo]|[Nn]|"") echo "Enabling dbus service" sysrc dbus_enable="YES" ;; *) echo "Aborting." exit 4 ;; esac ;; [Yy][Ee][Ss]|[Yy]|"") echo "Enabling dbus service" sysrc dbus_enable="YES" ;; *) echo "Aborting." exit 4 ;; esacfi
if [ -z "$(ps aux | grep -p dbus | grep -v grep)" ]; then echo "Starting dbus service" service dbus startfi
if [ ! "$(sysrc -f /boot/loader.conf -qn nullfs_load)" = "YES" ]; then echo "nullfs should be loaded when boot. Set nullfs_load to YES?(Y|n)" read ANSWER case ANSWER in [Nn][Oo]|[Nn]) echo "Warning: You MUST load nullfs with \"kldload -v nullfs\" EACH TIME FREEBSD IS REBOOTED." echo "Sure to continue without setting nullfs_load to YES?(y|N)" read ANSWER case ANSWER in [Yy][Ee][Ss]|[Yy]) echo "Warning: nullfs_load not set" ;; [Nn][Oo]|[Nn]|"") echo "Setting nullfs_load to YES" sysrc -f /boot/loader.conf nullfs_load="YES" ;; *) echo "Aborting." exit 4 ;; esac ;; [Yy][Ee][Ss]|[Yy]|"") echo "Setting nullfs_load to YES" sysrc -f /boot/loader.conf nullfs_load="YES" ;; *) echo "Aborting." exit 4 ;; esacfi
if ! kldstat -n nullfs >/dev/null 2>&1; then echo "Loading nullfs module" kldload -v nullfsfi
# pre_extract.sh
echo "${DIST_FULLNAME} will be installed in ${ROOT_DIR}/${DIST}"
echo "Downloading basic system"fetch ${URL}/${FILE}
echo "Exacting basic system"sleep 0.5mkdir -p ${ROOT_DIR}/${DIST}tar xvpf ${FILE} ${SUBDIR:-} -C ${ROOT_DIR}/${DIST} --numeric-owner
echo "Mounting recuired file system"sleep 0.5echo "devfs ${ROOT_DIR}/${DIST}/dev devfs rw,late 0 0" >> /etc/fstabecho "tmpfs ${ROOT_DIR}/${DIST}/dev/shm tmpfs rw,late,size=1g,mode=1777 0 0" >> /etc/fstabecho "fdescfs ${ROOT_DIR}/${DIST}/dev/fd fdescfs rw,late,linrdlnk 0 0" >> /etc/fstabecho "linprocfs ${ROOT_DIR}/${DIST}/proc linprocfs rw,late 0 0" >> /etc/fstabecho "linsysfs ${ROOT_DIR}/${DIST}/sys linsysfs rw,late 0 0" >> /etc/fstabecho "/tmp ${ROOT_DIR}/${DIST}/tmp nullfs rw,late 0 0" >> /etc/fstab#echo "/home ${ROOT_DIR}/${DIST}/home nullfs rw,late 0 0" >> /etc/fstabmount -al
# setup.shecho "Should ${DIST_FULLNAME} use Alibaba DNS or local resolv.conf?( (A)li | (l)ocal | (c)ancel )"read ANSWERcase ${ANSWER} in [Aa][Ll][Ii]|[Aa]|"") echo "Setting Alibaba DNS" echo "nameserver 223.5.5.5" >> ${ROOT_DIR}/${DIST}/etc/resolv.conf DNS_CONFIGURED=1 ;; [Ll][Oo][Cc][Aa][Ll]|[Ll]) echo "Using local reslov.conf" cp /etc/resolv.conf ${ROOT_DIR}/${DIST}/etc/resolv.conf DNS_CONFIGURED=1 ;; *) echo "Cancled." echo "You have to edit ${ROOT_DIR}/${DIST}/etc/resolv.conf by yourself!" DNS_CONFIGURED=0 ;;esac
echo "Do you want to use ustc source for ${DIST_FULLNAME}?(Y|n)"read ANSWERcase ${ANSWER} in [Yy][Ee][Ss]|[Yy]|"") echo "Setting ustc source" chroot ${ROOT_DIR}/${DIST} /bin/bash -c "sed \ -e 's|^mirrorlist=|#mirrorlist=|g' \ -e 's|^#baseurl=http://dl.rockylinux.org/\$contentdir|baseurl=https://mirrors.ustc.edu.cn/rocky|g' \ -i.bak \ /etc/yum.repos.d/rocky-extras.repo \ /etc/yum.repos.d/rocky.repo" ;; [Nn][Oo]|[Nn]) echo "Will not set ustc source. Skipping upgrade and software installation in case of unexpected time consumption." UPDATE=0 UPGRADE=0 INSTALL=0 ;; *) echo "Aborting." exit 4 ;;esac
if [ ${DNS_CONFIGURED} = 1 ]; then if [ ${UPDATE} = 1 ]; then echo "Updating ${DIST_FULLNAME}" chroot ${ROOT_DIR}/${DIST} /bin/bash -c "${UPDATE_CMD}" fi if [ ${UPGRADE} = 1 ]; then echo "Upgrading ${DIST_FULLNAME}" chroot ${ROOT_DIR}/${DIST} /bin/bash -c "${UPGRADE_CMD}" fielse echo "DNS is not set, skipping upgrade"fi
if [ ${DNS_CONFIGURED} = 1 ]; then if [ ${INSTALL} = 1 ]; then echo "Installing vim" chroot ${ROOT_DIR}/${DIST} /bin/bash -c "${INSTALL_CMD} vim" fielse echo "DNS is not set, skipping installation"fi
echo "Cleaning up"rm ${FILE}
echo "Done."echo "Now you can switch to ${DIST_FULLNAME} with \"chroot ${ROOT_DIR}/${DIST} /bin/bash\""