Difference between revisions of "Installation on Slackware 14"
From Linux-VServer
(→Make the guest) |
(→Contact) |
||
Line 482: | Line 482: | ||
== Contact == | == Contact == | ||
− | Comments and criticism can be addressed to roberto dot puzzanghera at sagredo dot eu ( | + | Comments and criticism can be addressed to roberto dot puzzanghera at sagredo dot eu (https://notes.sagredo.eu/other-contents-186/slackware-guest-on-linux-vserver-7.html) |
Latest revision as of 13:59, 21 July 2019
The purpose of this note is to setup a guest based on Slackware. What follows was tested on Slackware 14.2 to 13.1 (both 32b and 64b). I will assume that you have a Linux-Vserver box working.
Contents |
[edit] Download
wget https://notes.sagredo.eu/sites/notes.sagredo.eu/files/linux-vserver/slack_vserver.tar.gz tar xzf slack_vserver.tar.gz cd slack_vserver ls
You have downloaded the following files:
- PKG_LIST is the package list to be installed in the guest
- download_slack_pkg.sh is a script that you can use to download all the PKG_LIST. If you use this scriptlet all the package will be stored in the slackware[64]-version_pkg sub-folder.
- make_slack_vserver.sh is the shell script that you have to adjust. It installs the guest.
- rc is the startup script for the virtual server. It will be automatically copied in /etc/rc.d* /init.d/rc
- linux-vserver_slackware-14.2.patch is the patch which modify rc.0, rc.6 rc.M, rc.S, rc.inet2 and rc.syslog. It must be applyed after the creation of the vserver process. In the patch I switched off all the mounts and executable that are related to the hardware.
[edit] Download the packages
First of all select a minimal set of packages to be installed on the virtual server. This list of 123 packages is based on the Minimal System reported at http://slackwiki.org/Minimal_System without all hardware, kernel and multimedia related packages. The install leads to a guest of about 460M of size. This set fits with the installation of a complete virtual web server including apache, apache-tomcat, php, mysql, postgresql, qmail and related, ftp, named.
I assume that the packages to be installed are stored in the slackware{$ARCH}-{$VERSION}_pkg folder. If not, adjust its location editing the make_slack_vserver.sh script.
You can download my minimal set of packages running the shell script download_slack_pkg.sh. It can create a folder like slackware{$ARCH}-{$VERSION}_pkg for you, where $ARCH has to be "64" if you want to download 64b packages or empty otherwise, while $VERSION is the Slackware version, so it's something like "14.2".
#!/bin/bash # # v. 2016.06.08 # Now the script parses comments in the package list (thanks to Mark Colclough) VERSION="14.2" # Slackware version ARCH="64" # you can put 64 for 64b cpu just to separate 64/32 download folders # Put here your favourite Slackware repository SRC="ftp://ftp.slackware.no/slackware/slackware${ARCH}-${VERSION}/" # put here your pkg list LIST="${PWD}/PKG_LIST" # the directory where you unpacked slack_vserver.tar.gz # $PWD should work, otherwise put /path/to/slack_vserver SETUP=$PWD # the directory where you want to download the slackware packages PACKAGES="${SETUP}/slackware${ARCH}-${VERSION}_pkg" # create the folder where the pkg will be downloaded if [ ! -d "$PACKAGES" ]; then mkdir -p $PACKAGES fi # create the "patches" sub-folder if [ ! -d "${PACKAGES}/patches" ]; then mkdir -p "${PACKAGES}/patches" fi # download cd $PACKAGES if [ -f $LIST ]; then while read LINE do [ "$LINE" ] || continue [ "${LINE#\#}" = "$LINE" ] || continue wget "${SRC}slackware${ARCH}/${LINE}*.t?z" done < $LIST else echo "Can't find $LIST file." exit 1 fi # download packages from the patches folder cd ${PACKAGES}/patches if [ -f ${LIST} ]; then while read LINE do IFS='/' read -ra PKG <<< "$LINE" [ "${PKG#\#}" = "${PKG}" ] || continue PKG_LEN=${#PKG[@]} if [ $PKG_LEN == 2 ]; then wget "${SRC}patches/packages/${PKG[1]}*.t?z" fi done < $LIST else echo "Can't find $LIST file." exit 1 fi
NB: this script tries also to overwrite the packages downloaded from the /slackware folder with the updates belonging to the /patches dir.
[edit] Make the guest
Now let's create the guest and install the packages. As you know you must choose at least a "name", a "context" and an ip. In addition you have to modify most of the rc.* startup scripts removing all the hardware related daemons, and finally replace the /dev dir.
This is done adjusting and running the script make_slack_vserver.sh:
#!/bin/bash # # v. 2016.07.05 # Author: Roberto Puzzanghera # Thanks to Mark Colclough for corrections # # This script installs a Slackware guest into a linux-vserver host (http://linux-vserver.org) # # Comments are welcome :-) # More info here: https://notes.sagredo.eu/other-contents-186/slackware-guest-on-linux-vserver-7.html # adjust this to where your things live NAME=test HOSTNAME=$NAME.YOURDOMAIN.XY IP=10.0.0.182 INTERFACE=eth0:$IP/24 CONTEXT=5182 VERSION=14.2 # Slackware version ARCH="64" # you can put 64 for 64b cpu just to separate 64/32 download folders # where is the vservers dir? default is /vservers VDIR="/usr/local/vservers" # the directory where you unpacked slack_vserver.tar.gz # $PWD should work, otherwise put /path/to/slack_vserver SETUP=$PWD # the directory where you downloaded the slackware packages PACKAGES="${SETUP}/slackware${ARCH}-${VERSION}_pkg" # the path to rc script file (leave as is) RC="${SETUP}/rc" ################### end configuration # sanity check if [ ! -d "$VDIR" ]; then echo echo "Can't find VDIR dir: $VDIR" echo "Exiting" echo exit 1 fi if [ ! -d "$SETUP" ]; then echo echo "Can't find SETUP dir: $SETUP" echo "Exiting" echo exit 1 fi if [ ! -d "$PACKAGES" ]; then echo echo "Can't find PACKAGES dir: $PACKAGES" echo "Exiting" echo exit 1 fi if [ ! -f "$RC" ]; then echo echo "Can't find RC path: $RC" echo "Exiting" echo exit 1 fi # if everything is ok start the install echo read -p "press any key to make skeleton..." vserver ${NAME} build -m skeleton \ --hostname ${HOSTNAME} \ --interface ${INTERFACE} \ --context $CONTEXT \ --flags lock,virt_mem,virt_uptime,virt_cpu,virt_load,sched_hard,hide_netif \ --initstyle sysv echo "...done" echo read -p "press any key to move the /dev folder to a temp dir the /dev folder..." mv $VDIR/$NAME/dev $VDIR/$NAME/dev2 echo read -p "press any key to install packages..." cd $PACKAGES installpkg --root $VDIR/$NAME *.t?z; ROOT=$VDIR/$NAME upgradepkg patches/*.t?z; echo "...done" echo echo read -p "press any key to copy the rc script to /etc/rc.d/init.d..." echo echo "copying rc to /etc/rc.d/init.d/rc" cp -p $RC $VDIR/$NAME/etc/rc.d/init.d/ echo "...done" echo echo "removing x flag to rc.sshd and rc.inetd, removing not needed rc scripts" chmod -x $VDIR/$NAME/etc/rc.d/rc.sshd $VDIR/$NAME/etc/rc.d/rc.inetd rm $VDIR/$NAME/etc/rc.d/rc.cpufreq $VDIR/$NAME/etc/rc.d/rc.modules* $VDIR/$NAME/etc/rc.d/rc.inet1* $VDIR/$NAME/etc/rc.d/rc.loop echo "...done" echo echo "trying to adjust HOSTNAME, hosts, resolv.conf, profile. Check them later..." cp /etc/resolv.conf $VDIR/$NAME/etc/ cp /etc/localtime $VDIR/$NAME/etc/ rm $VDIR/$NAME/etc/profile cp /etc/profile $VDIR/$NAME/etc/ echo $HOSTNAME > $VDIR/$NAME/etc/HOSTNAME echo "127.0.0.1 localhost" > $VDIR/$NAME/etc/hosts echo "$IP $HOSTNAME $NAME" >> $VDIR/$NAME/etc/hosts touch $VDIR/$NAME/etc/mtab touch $VDIR/$NAME/etc/fstab echo "...done" echo read -p "press any key to restore /dev2 to /dev" rm -r $VDIR/$NAME/dev mv $VDIR/$NAME/dev2 $VDIR/$NAME/dev echo echo -n "Do you want that I apply the patch for you y/n? [y] " read VAR_PATCH if [ "$VAR_PATCH" = 'y' ] || [ "$VAR_PATCH" = '' ]; then if [ ! -f "${SETUP}/linux-vserver_slackware-${VERSION}.patch" ]; then echo echo "Can't find any PATCH here: ${SETUP}/linux-vserver_slackware-${VERSION}.patch" echo "Exiting" echo exit 1 fi cd ${VDIR}/${NAME}/etc/rc.d patch -p1 < ${SETUP}/linux-vserver_slackware-${VERSION}.patch echo "patch applyed." echo echo "You can start and enter the virtual server typing: " echo echo "vserver $NAME start" echo "vserver $NAME enter" else echo echo "DON'T FORGET to patch /etc/rc.d as follows: " echo echo "cd $VDIR/$NAME/etc/rc.d" echo "patch -p1 < $SETUP/linux-vserver_slackware-$VERSION.patch" fi echo echo "More info on http://notes.sagredo.eu/node/7" echo
[edit] Apply the patch
The script itsself can install the patch for you. Anyway this is how to apply the patch by yourself:
cd /vservers/vserver_name/etc/rc.d patch -p1 < /path/to/slack_vserver/slackware-14.2.patch
Inside the tarball you can find the old patch for Slackware 14.1, 14.0, 13.37 and 13.1, if you like.
[edit] Post installation tasks
Put this inside your rc.local:
/usr/local/etc/rc.d/init.d/vprocunhide start
[edit] Start the new server
vserver <vserver_name> start vserver <vserver_name> enter
[edit] Patch applayed
diff -ruN rc.d-original/rc.6 rc.d/rc.6 --- rc.d-original/rc.6 2016-03-26 17:48:37.000000000 +0100 +++ rc.d/rc.6 2016-07-09 14:08:48.470713168 +0200 @@ -37,36 +37,6 @@ ;; esac -# Save the system time to the hardware clock using hwclock --systohc. -# This will also create or update the timestamps in /etc/adjtime. -if [ -x /sbin/hwclock ]; then - # Check for a broken motherboard RTC clock (where ioports for rtc are - # unknown) to prevent hwclock causing a hang: - if ! grep -q " : rtc" /proc/ioports ; then - CLOCK_OPT="--directisa" - fi - if [ /etc/adjtime -nt /etc/hardwareclock ]; then - if grep -q "^LOCAL" /etc/adjtime ; then - echo "Saving system time to the hardware clock (localtime)." - else - echo "Saving system time to the hardware clock (UTC)." - fi - /sbin/hwclock $CLOCK_OPT --systohc - elif grep -q "^UTC" /etc/hardwareclock 2> /dev/null ; then - echo "Saving system time to the hardware clock (UTC)." - if [ ! -r /etc/adjtime ]; then - echo "Creating system time correction file /etc/adjtime." - fi - /sbin/hwclock $CLOCK_OPT --utc --systohc - else - echo "Saving system time to the hardware clock (localtime)." - if [ ! -r /etc/adjtime ]; then - echo "Creating system time correction file /etc/adjtime." - fi - /sbin/hwclock $CLOCK_OPT --localtime --systohc - fi -fi - # Run any local shutdown scripts: if [ -x /etc/rc.d/rc.local_shutdown ]; then /etc/rc.d/rc.local_shutdown stop @@ -126,10 +96,6 @@ sleep $FUSER_DELAY fi -# Unmount any NFS, SMB, or CIFS filesystems: -echo "Unmounting remote filesystems:" -/bin/umount -v -a -l -f -r -t nfs,smbfs,cifs | tr -d ' ' | grep successfully | sed "s/:successfullyunmounted/ has been successfully unmounted./g" - # Try to shut down pppd: PS="$(ps ax)" if echo "$PS" | /bin/grep -q -w pppd ; then @@ -215,22 +181,11 @@ # Before unmounting file systems write a reboot or halt record to wtmp. $shutdown_command -w -# Turn off swap: -echo "Turning off swap." -/sbin/swapoff -a -/bin/sync - # Stop cgmanager and cgproxy: if [ -x /etc/rc.d/rc.cgmanager ]; then sh /etc/rc.d/rc.cgmanager stop fi -echo "Unmounting local file systems:" -/bin/umount -v -a -t no,proc,sysfs | tr -d ' ' | grep successfully | sed "s/:successfullyunmounted/ has been successfully unmounted./g" 2> /dev/null - -echo "Remounting root filesystem read-only:" -/bin/mount -v -n -o remount,ro / - # This never hurts: /bin/sync @@ -288,12 +243,3 @@ fi fi fi - -# Now halt (poweroff with APM or ACPI enabled kernels) or reboot. -if [ "$shutdown_command" = "reboot" ]; then - echo "Rebooting." - /sbin/reboot -else - /sbin/poweroff -fi - diff -ruN rc.d-original/rc.M rc.d/rc.M --- rc.d-original/rc.M 2016-05-05 06:27:00.000000000 +0200 +++ rc.d/rc.M 2016-07-09 14:14:20.090096570 +0200 @@ -20,10 +20,6 @@ /sbin/ldconfig & fi -# Screen blanks after 15 minutes idle time, and powers down in one hour -# if the kernel supports APM or ACPI power management: -/bin/setterm -blank 15 -powersave powerdown -powerdown 60 - # Set the hostname. if [ -r /etc/HOSTNAME ]; then /bin/hostname $(cat /etc/HOSTNAME | cut -f1 -d .) @@ -109,13 +105,6 @@ sh /etc/rc.d/rc.bluetooth start fi -# Start wicd or networkmanager: -if [ -x /etc/rc.d/rc.wicd -a -x /usr/sbin/wicd ]; then - sh /etc/rc.d/rc.wicd start -elif [ -x /etc/rc.d/rc.networkmanager ]; then - sh /etc/rc.d/rc.networkmanager start -fi - # Start networking daemons: if [ -x /etc/rc.d/rc.inet2 ]; then . /etc/rc.d/rc.inet2 @@ -126,14 +115,6 @@ . /etc/rc.d/rc.scanluns fi -# Mount any additional filesystem types that haven't already been mounted: -mount -a -v 2> /dev/null | grep -v -e "already mounted" -e "ignored" | cut -f 1 -d : | tr -d ' ' | while read dev ; do mount | grep "${dev} " ; done - -# Start the Control Script for automounter: -if [ -x /etc/rc.d/rc.autofs ]; then - sh /etc/rc.d/rc.autofs start -fi - # Start the Network Time Protocol daemon: if [ -x /etc/rc.d/rc.ntpd ]; then sh /etc/rc.d/rc.ntpd start @@ -153,16 +134,6 @@ chmod 755 / 2> /dev/null chmod 1777 /tmp /var/tmp -# Start ACPI daemon. -if [ -x /etc/rc.d/rc.acpid ]; then - . /etc/rc.d/rc.acpid start -fi - -# Enable CPU frequency scaling: -if [ -x /etc/rc.d/rc.cpufreq ]; then - . /etc/rc.d/rc.cpufreq start -fi - # Update any existing icon cache files: if find /usr/share/icons -maxdepth 2 2> /dev/null | grep -q icon-theme.cache ; then for theme_dir in /usr/share/icons/* ; do diff -ruN rc.d-original/rc.inet2 rc.d/rc.inet2 --- rc.d-original/rc.inet2 2012-08-15 00:53:35.000000000 +0200 +++ rc.d/rc.inet2 2016-07-09 14:10:49.388841574 +0200 @@ -16,51 +16,6 @@ # At this point, we are ready to talk to The World... -# Mount remote (NFS) filesystems: -if cat /etc/fstab | grep -v '^#' | grep -w nfs 1> /dev/null 2> /dev/null ; then - # Start rpc.portmap, /sbin/rpc.lockd, and /sbin/rpc.statd if we find NFS - # volumes defined in /etc/fstab since these will need to be running in order - # to mount them. If they are not running, attempting to mount an NFS - # partition will cause mount to hang, or at least result in unreliable - # operation. Keep this in mind if you plan to mount unlisted NFS - # partitions... - # If you have uncommented NFS partitions in your /etc/fstab, rc.rpc is run - # whether it is set as executable or not. If you don't want to run it, - # comment the NFS partitions out in /etc/fstab or erase/rename rc.rpc. - if [ -r /etc/rc.d/rc.rpc ]; then - sh /etc/rc.d/rc.rpc start - fi - echo "Mounting remote (NFS) file systems: /sbin/mount -a -t nfs" - /sbin/mount -a -t nfs # This may be our /usr runtime! - # Show the mounted volumes: - /sbin/mount -v -t nfs -fi - -# If /etc/rc.d/rc.rpc is executable, run it to load rpc.portmap, rpc.lockd, -# and rpc.statd. This might be needed to mount NFS partitions that are not -# listed in /etc/fstab. Starting this twice won't hurt as the script will -# check if things are already running before trying to start them. -if [ -x /etc/rc.d/rc.rpc ]; then - sh /etc/rc.d/rc.rpc start -fi - -# Mount remote CIFS filesystems. Note that where possible, using CIFS is -# preferred over SMBFS. SMBFS is no longer actively maintained. -if cat /etc/fstab | grep -v '^#' | grep -w cifs 1> /dev/null 2> /dev/null ; then - echo "Mounting remote CIFS file systems: /sbin/mount -a -t cifs" - /sbin/mount -a -t cifs - # Show the mounted volumes: - /sbin/mount -v -t cifs -fi - -# Mount remote SMB filesystems: -if cat /etc/fstab | grep -v '^#' | grep -w smbfs 1> /dev/null 2> /dev/null ; then - echo "Mounting remote SMBFS file systems: /sbin/mount -a -t smbfs" - /sbin/mount -a -t smbfs - # Show the mounted volumes: - /sbin/mount -v -t smbfs -fi
[edit] Contact
Comments and criticism can be addressed to roberto dot puzzanghera at sagredo dot eu (https://notes.sagredo.eu/other-contents-186/slackware-guest-on-linux-vserver-7.html)