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
;;
esacOpenSUSE 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 无法解决。
最后更新于
这有帮助吗?