21.8 Rocky Linux 兼容层

目前 FreeBSD 官方已提供相关 Ports。

Shell 脚本

#!/bin/sh

ROOT_DIR=/compat
DIST=rocky
DIST_FULLNAME="Rocky Linux"
VER=9
SUB_VER=5
TIME_VER="latest"
SORT=Base
FILE=Rocky-${VER}-Container-${SORT}.${TIME_VER}.x86_64.tar.xz
SUBDIR=""
URL=https://mirrors.ustc.edu.cn/${DIST}/${VER}.${SUB_VER}/images/x86_64
UPDATE_CMD="dnf makecache"
UPGRADE_CMD="dnf upgrade -y"
INSTALL_CMD="dnf install -y"
UPDATE=1
UPGRADE=1
INSTALL=1

echo "Starting to install ${DIST_FULLNAME}"
sleep 0.5

# 检查 Linux 模块
echo "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 module not enabled"
                    ;;
                [Nn][Oo]|[Nn]|"")
                    echo "Enabling linux module"
                    sysrc linux_enable=YES
                    ;;
                *)
                    echo "Aborting."
                    exit 4
                    ;;
            esac
            ;;
        [Yy][Ee][Ss]|[Yy]|"")
            echo "Enabling linux module"
            sysrc linux_enable=YES
            ;;
        *)
            echo "Aborting."
            exit 4
            ;;
    esac
fi

echo "Starting linux service"
service linux start

# 检查 dbus
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
            ;;
    esac
fi

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"
                    service dbus enable
                    ;;
                *)
                    echo "Aborting."
                    exit 4
                    ;;
            esac
            ;;
        [Yy][Ee][Ss]|[Yy]|"")
            echo "Enabling dbus service"
            service dbus enable
            ;;
        *)
            echo "Aborting."
            exit 4
            ;;
    esac
fi

if [ -z "$(ps aux | grep -p dbus | grep -v grep)" ]; then
    echo "Starting dbus service"
    service dbus start
fi

# 检查 nullfs
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
            ;;
    esac
fi

if ! kldstat -n nullfs >/dev/null 2>&1; then
    echo "Loading nullfs module"
    kldload -v nullfs
fi

# 下载和解压基础系统
echo "${DIST_FULLNAME} will be installed in ${ROOT_DIR}/${DIST}"
echo "Downloading basic system"
fetch ${URL}/${FILE}

echo "Extracting basic system"
sleep 0.5
mkdir -p ${ROOT_DIR}/${DIST}
tar xvpf ${FILE} ${SUBDIR:-} -C ${ROOT_DIR}/${DIST} --numeric-owner

# 挂载必要文件系统
echo "Mounting required file system"
sleep 0.5
echo "devfs	${ROOT_DIR}/${DIST}/dev	devfs	rw,late	0	0" >> /etc/fstab
echo "tmpfs	${ROOT_DIR}/${DIST}/dev/shm	tmpfs	rw,late,size=1g,mode=1777	0	0" >> /etc/fstab
echo "fdescfs	${ROOT_DIR}/${DIST}/dev/fd	fdescfs	rw,late,linrdlnk	0	0" >> /etc/fstab
echo "linprocfs	${ROOT_DIR}/${DIST}/proc	linprocfs	rw,late	0	0" >> /etc/fstab
echo "linsysfs	${ROOT_DIR}/${DIST}/sys	linsysfs	rw,late	0	0" >> /etc/fstab
echo "/tmp	${ROOT_DIR}/${DIST}/tmp	nullfs	rw,late	0	0" >> /etc/fstab
mount -al

# 配置 DNS
echo "Should ${DIST_FULLNAME} use Alibaba DNS or local resolv.conf? ((A)li | (L)ocal | (C)ancel)"
read ANSWER
case $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 resolv.conf"
        cp /etc/resolv.conf ${ROOT_DIR}/${DIST}/etc/resolv.conf
        DNS_CONFIGURED=1
        ;;
    *)
        echo "Canceled."
        echo "You have to edit ${ROOT_DIR}/${DIST}/etc/resolv.conf by yourself!"
        DNS_CONFIGURED=0
        ;;
esac

# 设置 USTC 镜像源
echo "Do you want to use USTC source for ${DIST_FULLNAME}?(Y|n)"
read ANSWER
case $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 update, upgrade and installation."
        UPDATE=0
        UPGRADE=0
        INSTALL=0
        ;;
    *)
        echo "Aborting."
        exit 4
        ;;
esac

# 更新、升级和安装软件
if [ $DNS_CONFIGURED = 1 ]; then
    [ $UPDATE = 1 ] && chroot ${ROOT_DIR}/${DIST} /bin/bash -c "${UPDATE_CMD}"
    [ $UPGRADE = 1 ] && chroot ${ROOT_DIR}/${DIST} /bin/bash -c "${UPGRADE_CMD}"
    [ $INSTALL = 1 ] && chroot ${ROOT_DIR}/${DIST} /bin/bash -c "${INSTALL_CMD} vim"
else
    echo "DNS not configured, skipping update and installation."
fi

# 清理
echo "Cleaning up"
rm ${FILE}

echo "Done."
echo "You can switch to ${DIST_FULLNAME} with \"chroot ${ROOT_DIR}/${DIST} /bin/bash\""

最后更新于

这有帮助吗?