DISCLAIMER: This installation guide is essentially my own personal checklist and tips for installing Slackware on the Desktop. As such, it may not detail every step required nor necessarily reflect best practices (and of course your configuration tastes and software needs will differ).
It may be beneficial to read though this whole thing first before starting: there are a few spots where I describe alternatives to earlier steps that you may prefer.
This describes installation for Slackware64 but will be largely applicable to the 32 bit version.
The older versions of this checklist are available here:
md5sum -c CHECKSUMS.md5 | grep -E 'FAIL|WARN'fdisk -l to determine connected drives.cfdisk /dev/<drive> (usually sda) to partition the drives.fdisk /dev/<drive> as cfdisk will not align the partition correctly (hurts performance).mkswap -L SWAP /dev/<drive> for SWAP partition (usually best at the beginning of the drive for access speed, but on modern systems with gobs of RAM you may not want to bother - especially if using a pricey SSD).mkfs.ext3 -L BOOT /dev/<drive> for /boot partition. EXT2 is not a bad idea for SSD drives and you can use EXT4 with LILO.mkfs.ext4 -L ROOT /dev/<drive> for / partition.mkfs.ext4 -L HOME /dev/<drive> for /home partition.mkfs.xfs -L MEDIA /dev/<drive> for an XFS media partition.setup.grub-install /dev/sdagrub-mkconfig -o /boot/grub/grub.cfg (you will probably want to customize /etc/defaults/grub and the files in /etc/grub.d later and re-run this)./etc/hosts:127.0.0.1 localhost xxx.xxx.xxx.xxx local intranet servers and/or quick shortcuts
/etc/hosts.deny:ALL:ALL
/etc/hosts.allow:ALL:127.0.0.1 #configure below to match your local network - the below is probably the most common: ALL:192.168.1.
/etc/inetd.conf:time and comsat./etc/fstabdefaults to defaults,noatime for local drives.discard to SSD drive partition options to enable TRIM support. Reference Tuning Solid State Drives in Linux for more detail about using SSDs.<fs_path> tmpfs uid=<user_name>,gid=users,size=64M,mode=0777 0 0 )./tmp in ram makes for fast compile times).tmpfs /tmp tmpfs size=8G,mode=0777 0 0 tmpfs /var/tmp tmpfs size=4G,mode=0777 0 0
<server_ip>:/<export_path> /<mount_path> nfs rw,hard,intr,noatime/etc/exports/<exported_directory>/ <allowed_ips>(rw,sync,no_subtree_check)fsid=<small_int>./etc/rc.d/rc.inet1.conf (skip this if using networkmanager)/etc/rc.d/rc.inet2 around the NFS, CIFS, and SMB sections to allow skipping when booting with a CUSTOM kernel parameter.if grep -q CUSTOM /proc/cmdline ; then ... fi
/etc/rc.d/rc.M (rearrange sections to match) if using networkmanager to be earlier in the boot process:# Start networking daemons: if [ -x /etc/rc.d/rc.inet2 ]; then . /etc/rc.d/rc.inet2 fi # Start D-Bus: if [ -x /etc/rc.d/rc.messagebus ]; then sh /etc/rc.d/rc.messagebus 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 # Mount any additional filesystem types that haven't already been mounted: # mount -a -v 2> /dev/null | grep -v "already mounted"
# Start the MySQL database: if [ -x /etc/rc.d/rc.mysqld ]; then . /etc/rc.d/rc.mysqld start > /dev/null fi
if grep -q CUSTOM /proc/cmdline ; then /etc/rc.d/rc.mount & &> /dev/null fi clear # All done.
/etc/rc.d/rc.mount (to connect nfs drives once networkmanager has completed connections):#!/bin/sh while ! mount -a -t nfs && (($? == 32)); do sleep 2 done
/etc/rc.d/rc.local/etc/rc.d/rc.local_shutdown/etc/X11/xorg.conf (not usually required in modern Linux installations unless for the following):nvidia-xconfig to generate the required xorg.conf (nvidia-xconfig --twinview for multiple monitors).screen section for (some) big screen TVs using the nvidia binary drivers to solve extra small text issue:Option "UseEdidDpi" "False" Option "DPI" "96 x 96"
/etc/ssh/ssh_config:Port <custom port number> # ForwardAgent yes Host <trustedhost1> <trustedhost2> ForwardX11 yes ForwardX11Trusted yes
/etc/ssh/sshd_config:Port <custom port number> PermitRootLogin no AllowUsers <list of users here> X11Forwarding yes
/etc/ntp.conf:server <LAN server> prefer broadcastdelay 0.004
/etc/skel/.bash_logout: (also copy to /root)#!/bin/bash #clear screen on logout unless in X session or logged in remotely. if grep -q SSH_CONNECTION /proc/self/environ; then echo -en "\033[1;33mClosing SSH Session...\033[0m" elif grep -q DISPLAY /proc/self/environ; then echo -e "\033[1;33mGoodbye...\033[0m" else CUR_CONSOLE=`fgconsole` clear chvt 63 chvt "$CUR_CONSOLE" fi
/etc/defaults/grub/etc/grub.d/10_linux (of course tailer to your requirements/system):
if [ "x$is_first_entry" = xtrue ]; then
linux_entry "${OS} X" "${version}" simple \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}4 ipv6.disable=1"
linux_entry "${OS}" "${version}" simple \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} ipv6.disable=1"
linux_entry "${OS} X Home" "${version}" simple \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}4 ipv6.disable=1 CUSTOM"
linux_entry "${OS} Home" "${version}" simple \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}ipv6.disable=1 CUSTOM"
submenu_indentation="\t"
if [ -z "$boot_device_id" ]; then
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
fi
# TRANSLATORS: %s is replaced with an OS name
# echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
fi
# linux_entry "${OS}" "${version}" advanced \
# "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
# if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
# linux_entry "${OS}" "${version}" recovery \
# "single ${GRUB_CMDLINE_LINUX}"
# fi
list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
is_first_entry=false
done
# # If at least one kernel was found, then we need to
# # add a closing '}' for the submenu command.
# if [ x"$is_first_entry" != xtrue ]; then
# echo '}'
# fi
echo "$title_correction_code"/etc/grub.d/30_os-prober:
# if [ "x$is_first_entry" = xtrue ]; then
# cat << EOF
# menuentry '$(echo "$OS" | grub_quote)' --class gnu-linux --class gnu --class os \$menuentry_id_option 'osprober-gnulinux-simple-$boot_device_id' {
# EOF
# save_default_entry | sed -e "s/^/\t/"
# printf '%s\n' "${prepare_boot_cache}"
# cat << EOF
# linux ${LKERNEL} ${LPARAMS}
# EOF
# if [ -n "${LINITRD}" ] ; then
# cat << EOF
# initrd ${LINITRD}
# EOF
# fi
# cat << EOF
# }
# EOF
# echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'osprober-gnulinux-advanced-$boot_device_id' {"
# is_first_entry=false
# fi
# title="${LLABEL} $onstr"
# cat << EOF
# menuentry '$(echo "$title" | grub_quote)' --class gnu-linux --class gnu --class os \$menuentry_id_option 'osprober-gnulinux-$LKERNEL-${recovery_params}-$boot_device_id' {
# EOF
# save_default_entry | sed -e "s/^/\t\t/"
# printf '%s\n' "${prepare_boot_cache}" | sed -e "s/^/\t/"
# cat << EOF
# linux ${LKERNEL} ${LPARAMS}
# EOF
# if [ -n "${LINITRD}" ] ; then
# cat << EOF
# initrd ${LINITRD}
# EOF
# fi
# cat << EOF
# }
# EOF
# if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
# replacement_title="$(echo "Advanced options for ${OS}" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')"
# quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)"
# title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;"
# grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "gnulinux-advanced-$boot_device_id>gnulinux-$version-$type-$boot_device_id")"
# fimount /dev/sda1 /boot to point grub2 to the right drive.grub-install /dev/sdagrub-mkconfig -o /boot/grub/grub.cfg/etc/slackpkg/mirrors.slackpkg update gpg (only the first time you run slackpkg)slackpkg updateslackpkg install-new (optional, but recommended)slackpkg upgrade-alladduser.audio, video, cdrom, plugdev, power to Additional Groups.~/.bashrc to set up Konsole logins (of course tailer to your taste):
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
shopt -s autocd cdspell checkjobs shift_verbose
# set standard bash prompt //TODO: add colours for remote or local logins
PS1='\u@\h:\w\$ '
alias ll='ls -AlFh'
if [ -x /usr/games/fortune ]; then
/usr/games/fortune -s # print out short fortunes only
fi
#bash history archive
export HISTORYDATE=$(date)
trap 'archive_history' EXIT
archive_history() {
HISTORYOLD=${HISTFILE}.archive
HISTORYTEMP=/dev/shm/history
if [ x$HISTORYDUMPED = x ]; then
echo "**** ${HOSTNAME} ** ${HISTORYDATE} - $(date) ** $(tty) ****" >> "$HISTORYOLD"
history -a "$HISTORYTEMP"
cat "$HISTORYTEMP" >> "$HISTORYOLD"
export HISTORYDUMPED=1
fi
}startx: To use a different window manager than specified during setup, run xwmconfig.PS1=\u@\h:\w\$ to Konsole environment if konsole prompt is missing (or see alternative above).network.dns.disableIPv6 to true to speed up lookups when IPv6 is not available.network.proxy.socks_remote_dns to true to use remote DNS over socks proxies.browser.search.showOneOffButtons to false to disable 1 click search and restore classic behaviour (especially if you use keyboard naviation)./etc/adobe/mms.cfg:EnableLinuxHWVideoDecode=1 OverrideGPUValidation=true
mail.tabs.autoHide to true.
<hr style=color:#B5C4DF><small style='color:"black";'>
<b>From:</b> %from%
<b>Sent:</b> %datelocal%
<b>To:</b> %to%{
<b>CC:</b> %cc%}{
<b>Subject:</b> %subject%}
</small><br>
<hr style=color:#B5C4DF><small style='color:"black";'>
<b>From:</b> %from%
<b>Sent:</b> %datelocal%
<b>To:</b> %to%{
<b>CC:</b> %cc%}
</small><br><profile directory>/chrome/userContent.css:
body {color:#000000;background-color:#FFFFFF}
.moz-text-plain {color:#000000;background-color:#FFFFFF}
blockquote[type=cite] {color: navy !important;background-color: RGB(245,245,245) !important}
blockquote[type=cite] blockquote {color: maroon !important; background-color: RGB(235,235,235) !important;}
blockquote[type=cite] blockquote blockquote {color: green !important; background-color: RGB(225,225,225) !important;}
blockquote[type=cite] blockquote blockquote blockquote {color: purple !important; background-color: RGB(215,215,215) !important;}
blockquote[type=cite] blockquote blockquote blockquote blockquote {color: teal !important; background-color: RGB(205,205,205) !important;}Alternatively, the Quote Colors extension performs a similar task./etc/rc.d/rc.local:if [ -x /etc/rc.d/rc.apcupsd ]; then /etc/rc.d/rc.apcupsd start fi
/etc/rc.d/rc.6 (that begins with if [ -x /sbin/genpowerd ]; then) to:# This will cause the UPS to kill the power supply after a configurable number # of seconds (see the apcupsd.conf file). This is important for situations # where the mains power comes back before the UPS batteries are completely # dead. if [ -f /etc/apcupsd/powerfail ]; then echo echo "apcupsd will now power off the UPS" echo /etc/apcupsd/apccontrol killpower echo echo "Please ensure that the UPS has powered off before rebooting." echo "Otherwise, the UPS may cut the power during the reboot." echo halt -f -p # power down the system if the hardware is capable fi
/etc/apcupsd/apcupsd.conf to /dev/shm (this creates the lockfile in RAM as it sometimes is not deleted properly and prevents apcupsd from starting).ssh-keygen -t rsa -b 4096ssh-copy-id <username>@<host> -p <port>cpan App::cpanminuscpanm File::Find::Rulecpanm Date::Manipcpanm MIME::Base64::URLSafecpanm Text::Autoformatcpanm Spreadsheet::ParseExcelcpanm Spreadsheet::WriteExcelcpanm DateTime::Format::Excelcpanm Email::Sendercpanm Email::MIMEcpanm LWP::UserAgentcpanm Email::MIME::CreateHTMLcpanm MIME::Base64cpanm Authen::SASLcpanm DBD::ODBC/etc/odbc.ini:[NAME] Description = NAME FOR CONNECTION Driver = /usr/lib64/libtdsodbc.so Server = IP.ADDRESS Database = DB Port = 1433 TDS_Version = 7.2 try domain login = yes try server login = yes nt domain = DOMAIN
/usr/lib64/instantclient (only need the include directory from the sdk)cd /usr/lib64/instantclientln -s libclntsh.so.11.1 libc1ntsh.soln -s libocci.so.11.1 libocci.soln -s /usr/lib64/instantclient/sqlplus /usr/bin/sqlplus/etc/profile.d/oracle.sh:
#!/bin/sh
export ORACLE_BASE="/usr/lib64/instantclient"
export ORACLE_HOME="${ORACLE_BASE}"
export LD_LIBRARY_PATH="${ORACLE_BASE}"
export TNS_ADMIN=/etc/oracle/tnsnames.ora to /etc/oracle/export C_INCLUDE_PATH="/usr/lib64/instantclient/include"cpanm DBD::Oraclecpanm ExtUtils::Dependscpanm Chart::Clicker./configure --with-pdo-pgsql=shared,/usrmake (not make install)cp -p modules/pdo_pgsql.so /usr/lib64/php/extensions/extension=pdo_pgsql.so to php.iniinitdb -D /var/lib/pgsql/9.4/data --locale=en_CA.UTF-8 -A md5 -W" as postgres user./var/lib/pgsql/9.4/data/pg_hba.conf to set user permissions (and any settings in postgresql.conf as desired).createuser -P -U postgres -W <user>createdb <db> -O <user> -U postgres -Wmv <file> db.tar.xzunxz db.tar.xzpg_restore db.tar -U <user> -d <DB> (created earlier using pg_dump <db> >)