第 30.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\""