21.6 OpenSUSE 兼容层

OpenSUSE 15.5-shell 脚本

该脚本虽然使用的镜像基于 dnf 包管理器构建,但 opi 会自动安装 zypper,实现双包管理器共存。不过,用户仍需 自行导入 zypper 源

脚本内容如下:

#!/bin/sh                                              # 指定脚本使用的 shell

rootdir=/compat/suse                                   # 定义 openSUSE 兼容层根目录
url="https://download.opensuse.org/repositories/Virtualization:/containers:/images:/openSUSE-Tumbleweed/container/opensuse-tumbleweed-dnf-image.x86_64-lxc-dnf.tar.xz"  # openSUSE bootstrap 下载地址

echo "begin to install latest Opensuse Leap ..."       # 输出安装开始信息
echo "check modules ..."                                # 输出模块检查信息

# check linux module
if [ "$(sysrc -n linux_enable)" = "NO" ]; then         # 检查 Linux 内核模块是否启用
        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         # 启用 Linux 内核模块
                        ;;
        esac
fi
echo "start linux"                                       # 输出启动 Linux 信息
service linux start                                      # 启动 Linux 内核模块

# check dbus
if ! /usr/bin/which -s dbus-daemon;then                # 检查 dbus-daemon 是否存在
        echo "dbus-daemon not found. install it [Y|n]" # 提示安装 dbus
        read  answer                                    # 读取用户输入
        case $answer in
            [Nn][Oo]|[Nn])
                echo "dbus not installed"               # 提示未安装 dbus
                exit 2                                  # 退出脚本
                ;;
            [Yy][Ee][Ss]|[Yy]|"")
                pkg install -y dbus                     # 安装 dbus
                ;;
        esac
    fi

if [ "$(sysrc -n dbus_enable)" != "YES" ]; then        # 检查 dbus 服务是否启用
        echo "dbus should be enable. Continue?(Y|n)"   # 提示是否继续
        read answer                                     # 读取用户输入
        case $answer in
            [Nn][Oo]|[Nn])
                        echo "dbus not running"       # 提示 dbus 未运行
                        exit 2                          # 退出脚本
                        ;;
            [Yy][Ee][Ss]|[Yy]|"")
                        service dbus enable            # 启用 dbus 服务开机自启
                        ;;
        esac
fi
echo "start dbus"                                       # 输出启动 dbus 信息
service dbus start                                      # 启动 dbus 服务

echo "now we will bootstrap opensuse"                  # 输出 bootstrap 开始信息

fetch ${url}                                            # 下载 openSUSE bootstrap 压缩包
mkdir -p ${rootdir}                                    # 创建目标目录
tar xvf opensuse-leap-dnf-image*.tar.xz -C ${rootdir} --numeric-owner  # 解压压缩包
rm opensuse-leap-dnf-image.x86_64-lxc-dnf.tar.xz       # 删除压缩包

if [ ! "$(sysrc -f /boot/loader.conf -qn nullfs_load)" = "YES" ]; then  # 检查 nullfs 是否加载
        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  # 设置 nullfs 开机自启
                ;;
        esac
fi

if ! kldstat -n nullfs >/dev/null 2>&1;then            # 检查 nullfs 模块是否已加载
        echo "load nullfs module"                      # 输出加载信息
        kldload -v nullfs                               # 加载 nullfs 模块
fi

echo "mount some fs for linux"                         # 输出挂载文件系统信息
echo "devfs ${rootdir}/dev devfs rw,late 0 0" >> /etc/fstab        # devfs 挂载
echo "tmpfs ${rootdir}/dev/shm tmpfs rw,late,size=1g,mode=1777 0 0" >> /etc/fstab  # tmpfs 挂载
echo "fdescfs ${rootdir}/dev/fd fdescfs rw,late,linrdlnk 0 0" >> /etc/fstab        # fdescfs 挂载
echo "linprocfs ${rootdir}/proc linprocfs rw,late 0 0" >> /etc/fstab               # linprocfs 挂载
echo "linsysfs ${rootdir}/sys linsysfs rw,late 0 0" >> /etc/fstab                  # linsysfs 挂载
echo "/tmp ${rootdir}/tmp nullfs rw,late 0 0" >> /etc/fstab                         # /tmp 挂载
#echo "/home ${rootdir}/home nullfs rw,late 0 0" >> /etc/fstab                     # /home 挂载,可选
mount -al                                               # 挂载 fstab 中所有文件系统

echo "for opensuse,we should change 'compat.linux.osrelease'. continue? (Y|n)"  # 提示修改 Linux 内核版本
read answer                                             # 读取用户输入
case $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  # 持久化设置 Linux 内核版本
		sysctl compat.linux.osrelease=6.2.10                     # 立即生效
                ;;
esac
echo "complete!"                                        # 输出完成信息
echo "to use: chroot ${rootdir} /bin/bash"             # 提示使用 chroot 进入 openSUSE 兼容层
echo ""
echo " I will set resolv.conf to ali dns"              # 提示将 DNS 设置为阿里 DNS
echo "continue?[Y|n]"                                   # 提示是否继续
read answer                                             # 读取用户输入
case $answer in
	[Nn][Oo]|[Nn])
		echo "set your opensuse by yourself.bye!"  # 提示用户自行配置
		exit 0
		;;
	[Yy][Ee][Ss]|[Yy]|"")
		echo "nameserver 223.5.5.5" >> ${rootdir}/etc/resolv.conf   # 设置 DNS

    echo " I will install opi nano tar and vim"           # 输出安装软件信息
    chroot ${rootdir} /bin/bash -c "dnf update && dnf install -y  opi nano tar vim"  # 安装常用软件
    
    echo "all done."                                      # 输出完成信息
    echo "Now you can run '#chroot /compat/suse/ /bin/bash' Into Opensuse "  # 提示用户进入 openSUSE
		
                ;;
esac

OpenSUSE Tumbleweed-shell 脚本

本节有点问题,暂不可用。

Tumbleweed 即风滚草,是 OpenSUSE 的滚动更新版本。

脚本内容如下:

故障排除与未竟事宜

当使用 LXC Leap 镜像时,zypper 不可用

同样地,当使用 openSUSE Tumbleweed 时,dnf 和 zypper 都不可用。该问题不影响我们的 leap 脚本,但是影响第二个风滚草的脚本,导致无法正常使用。已经报告 Bug

例如,当试图安装 Vim 时,你会遇到一个错误信息。

在 LXC Leap 中,用 rpm 替换 rpm-ndb 可以解决该问题,dnf 不会出现类似问题。该问题仅存在于 zypper。然而,在 OpenSUSE Tumbleweed LXC 中,dnf 和 zypper 都存在该问题,替换 rpm-ndb 无法解决。

最后更新于

这有帮助吗?