21.8 Rocky Linux 兼容层

21.8 Rocky Linux 兼容层

本节将系统地介绍在 FreeBSD 操作系统上构建 Rocky Linux 兼容层的技术方法与实践步骤。

值得注意的是,目前 FreeBSD 官方 Ports 中已提供 Rocky Linux 兼容层相关的 Port。

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 ${DIST_FULLNAME} installation"
sleep 0.5

# 检查 Linux 模块
echo "Checking required 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 on 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

```sh
/compat/rocky/
├── dev/                  # 设备文件系统
   ├── fd/               # 文件描述符文件系统
   └── shm/              # 内存文件系统
├── etc/
   ├── resolv.conf       # DNS 配置
   └── yum.repos.d/
       ├── rocky-extras.repo
       └── rocky.repo    # YUM 软件源配置
├── proc/                 # Linux 进程文件系统
├── sys/                  # Linux 内核对象文件系统
└── tmp/                  # 临时目录

配置 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""

最后更新于