1. Slackware Linux简介与编译原理

Slackware Linux是由Patrick Volkerding于1993年创建的最古老的Linux发行版之一,以其简洁、稳定和接近Unix的设计理念而闻名。Slackware开发版(通常称为-current)是Slackware的测试版本,包含最新的软件包和功能,最终会稳定下来成为下一个正式版本。

1.1 为什么选择从源代码构建Slackware

从源代码构建Slackware系统具有以下显著优势:

  • 完全控制系统组件:可以自定义每个软件包的编译选项,启用或禁用特定功能
  • 硬件优化:针对特定CPU架构优化编译,提高系统性能
  • 精简系统:只安装需要的组件,避免冗余软件占用资源
  • 学习价值:深入了解Linux系统内部工作原理
  • 安全增强:可以应用最新的安全补丁和加固选项

1.2 编译基本原理

从源代码构建Linux系统的基本流程遵循以下步骤:

  1. 获取源代码
  2. 配置编译选项
  3. 编译源代码
  4. 安装编译好的程序
  5. 配置系统

这个过程需要遵循依赖关系,通常从基础工具链(binutils、gcc、glibc)开始,然后是核心系统组件,最后是应用程序和用户工具。

2. 编译环境准备

在开始编译Slackware之前,需要准备一个合适的编译环境。这包括一个现有的Linux系统(可以是任何发行版),以及必要的编译工具。

2.1 硬件要求

  • 磁盘空间:至少20GB的可用空间(建议50GB以上)
  • 内存:至少2GB RAM(建议4GB以上)
  • 处理器:多核CPU会显著加快编译速度

2.2 软件要求

需要安装基本的开发工具和依赖库:

在基于Debian的系统上:

sudo apt-get update sudo apt-get install build-essential ncurses-dev zlib1g-dev openssl libssl-dev wget curl git bc libelf-dev bison flex xz-utils 

在基于RHEL的系统上:

sudo yum groupinstall "Development Tools" sudo yum install ncurses-devel zlib-devel openssl-devel wget curl git bc elfutils-libelf-devel bison flex xz 

2.3 创建工作目录

# 创建工作目录 mkdir -p ~/slackware-build/{source,packages} cd ~/slackware-build 

3. 获取Slackware源代码

Slackware的源代码可以从官方镜像站获取。首先,需要选择一个合适的镜像站,可以在Slackware官网找到镜像列表。

3.1 下载完整源代码树

# 下载Slackware-current源代码 cd ~/slackware-build/source wget -r -l1 --no-parent -A.tar.gz,txz,txt http://slackware.osuosl.org/slackware64-current/source/ 

3.2 选择性下载源代码

如果只需要编译特定软件包,可以单独下载:

# 例如,下载gcc源代码 wget http://slackware.osuosl.org/slackware64-current/source/d/gcc/gcc-*.tar.xz # 下载内核源代码 wget http://slackware.osuosl.org/slackware64-current/source/k/linux/linux-*.tar.xz 

3.3 使用Git跟踪开发版

# 克隆Slackware-current的Git仓库 git clone git://git.slackware.nl/slackware.git slackware-current cd slackware-current 

4. 构建基础工具链

编译Slackware系统通常从基础工具链开始,包括binutils、gcc和glibc。这些是构建其他所有软件包的基础。

4.1 编译binutils

# 解压binutils源代码 cd ~/slackware-build/source tar -xvf d/binutils/binutils-*.tar.xz cd binutils-* # 创建构建目录 mkdir build cd build # 配置 ../configure --prefix=/usr --enable-gold --enable-ld=default --enable-plugins --enable-shared --disable-werror --with-system-zlib # 编译并安装 make -j$(nproc) sudo make install cd ../.. 

4.2 编译GCC

# 解压GCC源代码 tar -xvf d/gcc/gcc-*.tar.xz cd gcc-* # 下载所需的依赖 ./contrib/download_prerequisites # 创建构建目录 mkdir build cd build # 配置 ../configure --prefix=/usr --enable-languages=c,c++,fortran,objc,obj-c++ --disable-multilib --disable-bootstrap --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos --enable-multiarch # 编译并安装 make -j$(nproc) sudo make install cd ../.. 

4.3 编译Glibc

# 解压Glibc源代码 tar -xvf l/glibc/glibc-*.tar.xz cd glibc-* # 创建构建目录 mkdir build cd build # 配置 ../configure --prefix=/usr --disable-werror --enable-kernel=3.2 --enable-stack-protector=strong --enable-add-ons --with-headers=/usr/include # 编译并安装 make -j$(nproc) sudo make install cd ../.. 

5. 编译Linux内核

Linux内核是系统的核心,需要根据硬件配置进行定制编译。

5.1 解压和准备内核源代码

# 解压内核源代码 cd ~/slackware-build/source tar -xvf k/linux/linux-*.tar.xz cd linux-* # 清理源代码 make mrproper 

5.2 配置内核

# 复制现有配置或使用默认配置 cp /boot/config-$(uname -r) .config # 或 make defconfig # 自定义内核配置 make menuconfig 

在menuconfig中,可以根据需要调整以下选项:

Processor type and features ---> Processor family (Core 2/newer Xeon) ---> # 选择适合的CPU类型 [*] Enable the idle loop (NO_HZ) to save power # 节能选项 Power management and ACPI options ---> [*] Suspend to RAM and standby # 如果需要休眠功能 [*] Hibernation (aka 'suspend to disk') # 如果需要休眠到磁盘 File systems ---> <*> Second extended fs support # ext2文件系统支持 <*> Ext3 journalling file system support # ext3文件系统支持 <*> The Extended 4 (ext4) filesystem # ext4文件系统支持 

5.3 编译和安装内核

# 编译内核和模块 make -j$(nproc) sudo make modules_install sudo make install # 安装内核头文件 sudo make headers_install INSTALL_HDR_PATH=/usr cd .. 

6. 构建基础系统

在基础工具链和内核编译完成后,可以开始编译和配置其他系统组件。

6.1 编译系统基础工具

6.1.1 编译util-linux

# 解压util-linux源代码 tar -xvf a/util-linux/util-linux-*.tar.xz cd util-linux-* mkdir build cd build # 配置 ../configure --prefix=/usr --bindir=/bin --sbindir=/sbin --libdir=/usr/lib --localstatedir=/var --runstatedir=/run --enable-fs-paths-default=/usr/bin:/usr/sbin:/bin:/sbin --disable-makeinstall-chown --disable-use-tty-group # 编译并安装 make -j$(nproc) sudo make install cd ../.. 

6.1.2 编译procps

# 解压procps源代码 tar -xvf a/procps-ng/procps-ng-*.tar.xz cd procps-ng-* mkdir build cd build # 配置 ../configure --prefix=/usr --exec-prefix= --libdir=/usr/lib --docdir=/usr/doc/procps-ng-3.3.17 --disable-static --disable-kill --with-systemd # 编译并安装 make -j$(nproc) sudo make install cd ../.. 

6.1.3 编译e2fsprogs

# 解压e2fsprogs源代码 tar -xvf a/e2fsprogs/e2fsprogs-*.tar.xz cd e2fsprogs-* mkdir build cd build # 配置 ../configure --prefix=/usr --bindir=/bin --sbindir=/sbin --libdir=/usr/lib --sysconfdir=/etc --with-root-prefix="" --enable-elf-shlibs --disable-libblkid --disable-libuuid --disable-uuidd --disable-fsck # 编译并安装 make -j$(nproc) sudo make install sudo make install-libs cd ../.. 

6.2 创建基本的系统目录结构

# 创建基本的系统目录结构 sudo mkdir -p /{bin,boot,dev,etc,home,lib,media,mnt,opt,proc,root,run,sbin,srv,sys,tmp,var} sudo mkdir -p /usr/{bin,include,lib,sbin,share,src} sudo mkdir -p /var/{log,mail,spool,tmp} sudo mkdir -p /home # 设置权限 sudo chmod 0750 /root sudo chmod 1777 /tmp /var/tmp 

6.3 配置系统文件

# 创建基本的系统配置文件 sudo install -d -m755 /etc sudo touch /etc/passwd /etc/group /etc/shadow sudo chmod 0644 /etc/passwd /etc/group sudo chmod 0600 /etc/shadow # 创建基本的用户和组 sudo echo "root:x:0:0:root:/root:/bin/bash" > /etc/passwd sudo echo "root:x:0:" > /etc/group sudo echo "root::18279:0:99999:7:::" > /etc/shadow # 创建网络配置文件 sudo echo "127.0.0.1 localhost" > /etc/hosts sudo echo "::1 localhost" >> /etc/hosts sudo echo "slackware" > /etc/HOSTNAME # 创建fstab sudo echo "/dev/sda1 / ext4 defaults 1 1" > /etc/fstab sudo echo "proc /proc proc defaults 0 0" >> /etc/fstab sudo echo "sysfs /sys sysfs defaults 0 0" >> /etc/fstab 

7. 编译系统服务和工具

7.1 编译Systemd

# 解压systemd源代码 tar -xvf a/systemd/systemd-*.tar.xz cd systemd-* mkdir build cd build # 配置 ../configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --libdir=/usr/lib --with-rootprefix= --with-rootlibdir=/lib --enable-split-usr --disable-gnutls --disable-integration-tests --disable-coverage --disable-tests --disable-manpages # 编译并安装 make -j$(nproc) sudo make install cd ../.. 

7.2 编译NetworkManager

# 解压NetworkManager源代码 tar -xvf ap/network-manager/NetworkManager-*.tar.xz cd NetworkManager-* mkdir build cd build # 配置 ../configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --libdir=/usr/lib --enable-introspection --disable-ppp --disable-modem-manager-1 --disable-bluez --disable-ofono --disable-teamd --disable-wifi # 编译并安装 make -j$(nproc) sudo make install cd ../.. 

7.3 编译DHCP客户端

# 解压dhcpcd源代码 tar -xvf n/dhcpcd/dhcpcd-*.tar.xz cd dhcpcd-* # 配置 ./configure --prefix=/usr --sbindir=/sbin --sysconfdir=/etc --dbdir=/var/lib/dhcpcd --rundir=/run # 编译并安装 make -j$(nproc) sudo make install cd .. 

8. 解决编译过程中的常见问题

在从源代码构建Slackware系统时,可能会遇到各种问题。以下是一些常见问题及其解决方法。

8.1 依赖问题

编译失败通常是由于缺少依赖库或开发文件导致的。

问题示例:编译软件时出现”cannot find -lxxx”错误。

解决方法

# 搜索提供该库的软件包 apt-file search libxxx.so # 在Debian/Ubuntu上 yum whatprovides "*/libxxx.so" # 在RHEL/CentOS上 # 安装相应的开发包 sudo apt-get install libxxx-dev # 在Debian/Ubuntu上 sudo yum install libxxx-devel # 在RHEL/CentOS上 # 如果是在Slackware环境中,可以创建一个简单的依赖解析脚本 cat > finddep.sh << 'EOF' #!/bin/bash # 查找提供指定库的软件包 LIBRARY=$1 find /var/log/packages -type f -exec grep -l "$LIBRARY" {} ; EOF chmod +x finddep.sh ./finddep.sh libxxx.so 

8.2 版本冲突

有时,软件包之间可能存在版本冲突,特别是当尝试混合使用不同版本的软件时。

问题示例:编译时出现”xxx requires yyy >= version”错误。

解决方法

# 检查当前安装的版本 yyy --version # 如果版本过低,需要升级或下载并编译新版本 wget [url-to-newer-version] tar -xvf yyy-*.tar.gz cd yyy-* ./configure make sudo make install # 或者,如果需要保留旧版本,可以使用stow管理多个版本 sudo apt-get install stow cd /usr/local sudo mkdir stow cd stow sudo tar -xvf /path/to/yyy-*.tar.gz sudo mv yyy-* yyy-newversion sudo stow yyy-newversion 

8.3 编译器错误

有时,代码可能与当前编译器版本不兼容,导致编译错误。

问题示例:编译时出现语法错误或未定义的引用。

解决方法

# 尝试使用不同的编译器标志 CFLAGS="-O2 -fcommon" CXXFLAGS="-O2 -fcommon" ./configure # 或者,如果可能,使用较旧或较新的编译器版本 sudo apt-get install gcc-7 g++-7 # 安装特定版本的GCC CC=gcc-7 CXX=g++-7 ./configure # 使用特定版本的编译器 # 如果是GCC特有的问题,可以尝试使用Clang sudo apt-get install clang CC=clang CXX=clang++ ./configure 

8.4 链接错误

链接错误通常是由于缺少库或库路径不正确导致的。

问题示例:编译时出现”undefined reference to ‘xxx’“错误。

解决方法

# 确保所有必要的库都已安装 sudo apt-get install libxxx-dev # 如果库已安装但链接器找不到,尝试指定库路径 LDFLAGS="-L/path/to/library" ./configure # 或者,在编译时显式链接库 gcc -o program program.c -lxxx # 如果是顺序相关问题,可以调整链接顺序 gcc -o program program.c -lyyy -lxxx # 先链接依赖yyy的库xxx 

8.5 并行编译问题

使用make -j进行并行编译有时会导致问题,特别是在某些软件包的构建系统中。

问题示例:并行编译时出现奇怪的错误,但串行编译正常。

解决方法

# 改为串行编译 make # 或者减少并行任务数 make -j2 # 或者,使用特定于软件包的并行控制 make -j$(nproc) SHELL=/bin/bash # 使用bash作为shell 

9. 系统优化与性能调优

从源代码构建Slackware系统的一个主要优势是可以针对特定硬件和用途进行优化。

9.1 编译优化

9.1.1 CPU特定优化

# 针对特定CPU优化 CFLAGS="-march=native -O2 -pipe" CXXFLAGS="-march=native -O2 -pipe" ./configure # 或者,针对特定CPU系列优化 CFLAGS="-march=haswell -O2 -pipe" CXXFLAGS="-march=haswell -O2 -pipe" ./configure # 针对大小优化(适用于嵌入式系统) CFLAGS="-Os -pipe" CXXFLAGS="-Os -pipe" ./configure 

9.1.2 链接时优化(LTO)

# 启用链接时优化 CFLAGS="-flto -O2 -pipe" CXXFLAGS="-flto -O2 -pipe" LDFLAGS="-flto" ./configure # 如果LTO导致问题,可以尝试增加内存限制 CFLAGS="-flto -O2 -pipe" CXXFLAGS="-flto -O2 -pipe" LDFLAGS="-flto -Wl,--no-keep-memory" ./configure 

9.2 安全优化

# 启用堆栈保护 CFLAGS="-fstack-protector-strong -O2 -pipe" CXXFLAGS="-fstack-protector-strong -O2 -pipe" ./configure # 启用地址无关代码 CFLAGS="-fPIC -O2 -pipe" CXXFLAGS="-fPIC -O2 -pipe" ./configure # 启用地址 sanitizer(用于调试) CFLAGS="-fsanitize=address -O2 -pipe" CXXFLAGS="-fsanitize=address -O2 -pipe" LDFLAGS="-fsanitize=address" ./configure 

9.3 内核优化

# 针对特定硬件配置内核 make menuconfig # 启用CPU特定优化 Processor type and features ---> Processor family (Core 2/newer Xeon) ---> [*] Transparent hugepage support [*] Enable the idle loop (NO_HZ) to save power # 启用或禁用不必要的功能以减少内核大小和内存占用 Device Drivers ---> [ ] Sound card support # 如果不需要音频支持 [ ] Graphics support # 如果不需要图形支持 [ ] MMC/SD/SDIO card support # 如果不需要MMC/SD卡支持 # 启用性能优化选项 Kernel hacking ---> [ ] Compile the kernel with debug info # 仅在调试时启用 [ ] Tracers # 如果不需要跟踪功能 # 启用安全选项 Security options ---> [*] Enable access key retention support [*] Enable different security models [*] Socket and Networking Security Hooks [*] NSA SELinux Support # 如果需要SELinux 

9.4 文件系统优化

# 创建文件系统时指定选项 sudo mkfs.ext4 -O ^has_journal /dev/sda1 # 禁用日志以提高性能(适合SSD) # 或者启用特定功能 sudo mkfs.ext4 -O extents,uninit_bg,dir_index /dev/sda1 # 挂载时指定优化选项 sudo mount /dev/sda1 /mnt -o noatime,discard,data=writeback # 在/etc/fstab中永久设置 echo "/dev/sda1 / ext4 defaults,noatime,discard,data=writeback 0 1" | sudo tee -a /etc/fstab 

9.5 系统服务调优

# 创建systemd服务优化配置 sudo mkdir -p /etc/systemd/system.conf.d cat > /tmp/system.conf << 'EOF' [Manager] DefaultLimitNOFILE=65536 DefaultTasksMax=65536 EOF sudo cp /tmp/system.conf /etc/systemd/system.conf.d/ # 重新加载systemd配置 sudo systemctl daemon-reload # 优化journald配置 sudo mkdir -p /etc/systemd/journald.conf.d cat > /tmp/journald.conf << 'EOF' [Journal] SystemMaxUse=100M RuntimeMaxUse=50M Storage=persistent Compress=yes EOF sudo cp /tmp/journald.conf /etc/systemd/journald.conf.d/ # 重启journald服务 sudo systemctl restart systemd-journald 

10. 系统维护与更新

从源代码构建的系统需要定期维护和更新,以保持安全性和稳定性。

10.1 更新软件包

# 定期检查并下载新的源代码 cd ~/slackware-build/source wget -r -l1 --no-parent -N --accept=*.tar.xz,*.tar.gz,*.txt http://slackware.osuosl.org/slackware64-current/source/ # 编译并安装更新的软件包 # 例如,更新bash tar -xvf a/bash/bash-*.tar.xz cd bash-*/ ./configure --prefix=/usr --bindir=/bin --docdir=/usr/doc/bash-5.1 --without-bash-malloc --with-installed-readline make -j$(nproc) sudo make install cd .. 

10.2 安全更新

# 订阅Slackware安全公告 # 访问 http://slackware.com/security/ 获取最新安全信息 # 下载并应用安全补丁 wget http://slackware.osuosl.org/slackware64-current/patches/packages/xxx-*.txz sudo upgradepkg xxx-*.txz # 创建安全更新脚本 cat > /usr/local/bin/security-updates << 'EOF' #!/bin/bash # 检查并应用安全更新 # 定义镜像站点 MIRROR="http://slackware.osuosl.org/slackware64-current" # 获取已安装的软件包列表 INSTALLED_PACKAGES=$(ls /var/log/packages | cut -d '-' -f1-3 | sort -u) # 检查更新 cd /tmp for package in $INSTALLED_PACKAGES; do # 跳过不需要更新的包 case $package in *-kernel*) continue;; esac # 检查是否有更新 wget -q --spider $MIRROR/patches/packages/$package-*.txz if [ $? -eq 0 ]; then echo "Updating $package..." wget $MIRROR/patches/packages/$package-*.txz sudo upgradepkg $package-*.txz fi done # 清理 rm -f *.txz EOF sudo chmod +x /usr/local/bin/security-updates 

10.3 系统监控和维护

# 使用系统监控工具 sudo apt-get install htop iotop nmon # 创建定期维护脚本 cat > /usr/local/bin/system-maintenance << 'EOF' #!/bin/bash # 系统维护脚本 # 更新软件包列表 echo "Updating package lists..." apt-get update # 清理旧的日志文件 echo "Cleaning old logs..." find /var/log -type f -name "*.gz" -delete find /var/log -type f -name "*.old" -delete # 清理临时文件 echo "Cleaning temporary files..." rm -rf /tmp/* rm -rf /var/tmp/* # 检查磁盘空间 echo "Checking disk space..." df -h # 检查系统资源使用情况 echo "System resource usage:" free -h # 检查是否有失败的系统服务 echo "Checking for failed services:" systemctl --failed # 检查系统日志中的错误 echo "Checking system logs for errors:" journalctl -p 3 -xb --no-pager | tail -n 20 EOF sudo chmod +x /usr/local/bin/system-maintenance # 设置定期执行 echo "0 3 * * 0 /usr/local/bin/system-maintenance" | sudo crontab - 

10.4 备份和恢复

# 创建系统备份脚本 cat > /usr/local/bin/backup-system << 'EOF' #!/bin/bash # 系统备份脚本 # 定义备份目录 BACKUP_DIR="/backup/system" DATE=$(date +%Y%m%d-%H%M%S) # 创建备份目录 mkdir -p $BACKUP_DIR # 备份系统文件 echo "Backing up system files..." tar -czf $BACKUP_DIR/system-backup-$DATE.tar.gz --exclude=/backup --exclude=/dev --exclude=/proc --exclude=/sys --exclude=/tmp --exclude=/run --exclude=/mnt --exclude=/media --exclude=/var/tmp --exclude=/var/cache --exclude=/var/log / # 备份软件包列表 echo "Backing up package list..." ls /var/log/packages > $BACKUP_DIR/package-list-$DATE.txt # 清理旧备份(保留最近5个) echo "Cleaning old backups..." ls -t $BACKUP_DIR/system-backup-*.tar.gz | tail -n +6 | xargs rm -f ls -t $BACKUP_DIR/package-list-*.txt | tail -n +6 | xargs rm -f echo "Backup completed: $BACKUP_DIR/system-backup-$DATE.tar.gz" EOF sudo chmod +x /usr/local/bin/backup-system # 设置定期备份 echo "0 2 * * 0 /usr/local/bin/backup-system" | sudo crontab - # 创建系统恢复脚本 cat > /usr/local/bin/restore-system << 'EOF' #!/bin/bash # 系统恢复脚本 if [ $# -ne 1 ]; then echo "Usage: $0 <backup-file>" exit 1 fi BACKUP_FILE=$1 if [ ! -f "$BACKUP_FILE" ]; then echo "Backup file not found: $BACKUP_FILE" exit 1 fi echo "Restoring from $BACKUP_FILE..." cd / tar -xzf $BACKUP_FILE echo "Restore completed. Please reboot the system." EOF sudo chmod +x /usr/local/bin/restore-system 

11. 创建自定义Slackware软件包

为了便于管理和分发自定义编译的软件,可以创建Slackware格式的软件包。

11.1 创建简单的Slackware包

# 创建Slackware包构建脚本 cat > buildpkg.sh << 'EOF' #!/bin/bash # Slackware包构建脚本 if [ $# -ne 1 ]; then echo "Usage: $0 <source-tarball>" exit 1 fi SOURCE=$1 PACKAGE=$(basename $SOURCE .tar.gz | sed 's/-[0-9].*//') VERSION=$(basename $SOURCE .tar.gz | sed "s/$PACKAGE-//") ARCH=$(uname -m) BUILD=1 # 创建工作目录 WORKDIR=$(mktemp -d) cd $WORKDIR # 解压源代码 tar -xzf $SOURCE cd $PACKAGE-* # 配置和编译 ./configure --prefix=/usr make -j$(nproc) # 创建包目录 PKG=$WORKDIR/pkg mkdir -p $PKG # 安装到包目录 make install DESTDIR=$PKG # 创建Slackware包描述 mkdir -p $PKG/install cat > $PKG/install/slack-desc << EOD # HOW TO EDIT THIS FILE: # The "handy ruler" below makes it easier to edit a package description. Line # up the first '|' above the ':' following the base package name, and the '|' # on the right side marks the last column you can put a character in. You must # make exactly 11 lines for the formatting to be correct. It's also # customary to leave one space after the ':'. |-----handy-ruler------------------------------------------------------| $PACKAGE: $PACKAGE (A short description of the package) $PACKAGE: $PACKAGE: A longer description of the package, explaining what it does, $PACKAGE: its features, and any other relevant information. $PACKAGE: $PACKAGE: $PACKAGE: $PACKAGE: $PACKAGE: $PACKAGE: $PACKAGE: EOD # 创建Slackware包 cd $WORKDIR /sbin/makepkg -l y -c n $PACKAGE-$VERSION-$ARCH-$BUILD.txz # 清理 cd / rm -rf $WORKDIR EOF chmod +x buildpkg.sh # 使用脚本构建包 ./buildpkg.sh /path/to/source.tar.gz 

11.2 使用SlackBuild脚本

Slackware使用标准化的SlackBuild脚本来构建软件包。以下是一个示例:

# 创建SlackBuild脚本 cat > $PACKAGE.SlackBuild << 'EOF' #!/bin/sh # Slackware build script for <package> # Copyright <year> <your name> <your email> # All rights reserved. # # Redistribution and use of this script, with or without modification, is # permitted provided that the following conditions are met: # # 1. Redistributions of this script must retain the above copyright # notice, this list of conditions and the following disclaimer. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PRGNAM=<package> VERSION=${VERSION:-<version>} BUILD=${BUILD:-1} TAG=${TAG:-_SBo} if [ -z "$ARCH" ]; then case "$( uname -m )" in i?86) ARCH=i586 ;; arm*) ARCH=arm ;; *) ARCH=$( uname -m ) ;; esac fi CWD=$(pwd) TMP=${TMP:-/tmp/SBo} PKG=$TMP/package-$PRGNAM OUTPUT=${OUTPUT:-/tmp} if [ "$ARCH" = "i586" ]; then SLKCFLAGS="-O2 -march=i586 -mtune=i686" LIBDIRSUFFIX="" elif [ "$ARCH" = "i686" ]; then SLKCFLAGS="-O2 -march=i686" LIBDIRSUFFIX="" elif [ "$ARCH" = "x86_64" ]; then SLKCFLAGS="-O2 -fPIC" LIBDIRSUFFIX="64" else SLKCFLAGS="-O2" LIBDIRSUFFIX="" fi set -e rm -rf $PKG mkdir -p $TMP $PKG $OUTPUT cd $TMP rm -rf $PRGNAM-$VERSION tar xvf $CWD/$PRGNAM-$VERSION.tar.gz cd $PRGNAM-$VERSION chown -R root:root . find -L . ( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 -o -perm 511 ) -exec chmod 755 {} ; -o ( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 ) -exec chmod 644 {} ; CFLAGS="$SLKCFLAGS" CXXFLAGS="$SLKCFLAGS" ./configure --prefix=/usr --libdir=/usr/lib${LIBDIRSUFFIX} --sysconfdir=/etc --localstatedir=/var --mandir=/usr/man --docdir=/usr/doc/$PRGNAM-$VERSION --build=$ARCH-slackware-linux make make install DESTDIR=$PKG find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION cp -a AUTHORS COPYING ChangeLog INSTALL NEWS README $PKG/usr/doc/$PRGNAM-$VERSION cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild mkdir -p $PKG/install cat $CWD/slack-desc > $PKG/install/slack-desc cd $PKG /sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-txz} EOF chmod +x $PACKAGE.SlackBuild # 创建slack-desc文件 cat > slack-desc << 'EOF' |-----handy-ruler------------------------------------------------------| <package>: <package> (A short description of the package) <package>: <package>: A longer description of the package, explaining what it does, <package>: its features, and any other relevant information. <package>: <package>: <package>: <package>: <package>: <package>: <package>: EOF # 使用SlackBuild脚本构建包 VERSION=<version> ./$PACKAGE.SlackBuild 

12. 结论与最佳实践

从源代码构建Slackware开发版系统是一项复杂但有益的任务,它提供了对系统的完全控制和优化能力。以下是总结的最佳实践:

12.1 编译最佳实践

  1. 保持环境清洁:使用chroot或容器环境进行编译,避免污染宿主系统
  2. 记录编译过程:详细记录每个步骤的命令和输出,便于排查问题
  3. 增量编译:对于大型项目,考虑使用ccache加速重复编译
  4. 并行编译:使用make -j$(nproc)充分利用多核CPU
  5. 验证编译结果:编译完成后进行基本功能测试

12.2 系统稳定性最佳实践

  1. 逐步构建:从基础系统开始,逐步添加组件,便于定位问题
  2. 定期备份:在关键步骤创建系统快照或备份
  3. 监控资源使用:使用工具如htop、iotop监控系统资源使用情况
  4. 日志管理:配置合理的日志轮转策略,避免日志文件过大
  5. 安全更新:定期检查并应用安全补丁

12.3 性能优化最佳实践

  1. 针对性优化:根据系统用途选择合适的编译选项
  2. 基准测试:使用性能测试工具评估优化效果
  3. 资源监控:持续监控系统性能指标,及时调整优化策略
  4. 避免过度优化:平衡性能提升与系统稳定性
  5. 文档记录:记录所有优化措施,便于后续维护

通过遵循这些最佳实践,您可以构建一个稳定、高效且安全的Slackware Linux系统,完全满足您的特定需求。从源代码构建系统不仅提供了技术上的优势,也是深入了解Linux系统内部工作原理的绝佳途径。