|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
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 编译系统基础工具
- # 解压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 ../..
复制代码- # 解压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 ../..
复制代码- # 解压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 编译优化
- # 针对特定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
复制代码- # 启用链接时优化
- 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系统内部工作原理的绝佳途径。 |
|