Links

第 21.9 节 Linux 兼容层——基于 Slackware Linux

注意
slackware 并未提供基本系统的下载,需要自己在 slackware 或 FreeBSD 下(FreeBSD 需要安装 bash 以及 gmake)使用脚本生成,原版脚本地址为 https://github.com/nnnewb/slackware-WSL,为了方便.我们制作了一个基本系统,基于 15.0,在 FreeBSD 下使用了我们修改过的脚本即使用了此系统。如果不放心可以自己生成。
# fetch http://book.bsdcn.org/slackware.sh
# sh slackware.sh
脚本内容如下:
#!/bin/sh
export ROOT_DIR=/compat
export DIST=slackware
export DIST_FULLNAME=Slackware
VER=15.0
FILE=${DIST}64-${VER}.tar.xz
SUBDIR=""
URL=https://book.bsdcn.org
UPDATE_CMD="slackpkg update"
UPGRADE_CMD="slackpkg upgrade-all"
INSTALL_CMD="slackpkg install"
UPDATE=1
UPGRADE=1
INSTALL=1
echo "Starting to install ${DIST_FULLNAME}"
sleep 0.5
# check.sh
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 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
;;
esac
fi
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
;;
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 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
;;
esac
fi
if [ -z "$(ps aux | grep -p dbus | grep -v grep)" ]; then
echo "Starting dbus service"
service dbus start
fi
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
# 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.5
mkdir -p ${ROOT_DIR}/${DIST}
tar xvpf ${FILE} ${SUBDIR:-} -C ${ROOT_DIR}/${DIST} --numeric-owner
echo "Mounting recuired 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
#echo "/home ${ROOT_DIR}/${DIST}/home nullfs rw,late 0 0" >> /etc/fstab
mount -al
# setup.sh
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}/etc/resolv.conf
DNS_CONFIGURED=1
;;
[Ll][Oo][Cc][Aa][Ll]|[Ll])
echo "Using local reslov.conf"
cp /etc/resolv.conf ${ROOT_DIR}/etc/resolv.conf
DNS_CONFIGURED=1
;;
*)
echo "Cancled."
echo "You have to edit ${ROOT_DIR}/etc/resolv.conf by yourself!"
DNS_CONFIGURED=0
;;
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}"
fi
else
echo "DNS is not set, skipping upgrade"
fi
echo "Setting default bash theme"
cp ${ROOT_DIR}/${DIST}/etc/profile ${ROOT_DIR}/${DIST}/root/.bashrc
echo "Cleaning up"
rm ${FILE}
echo "Done."
echo "Now you can switch to ${DIST_FULLNAME} with \"chroot ${ROOT_DIR}/${DIST} /bin/bash\""