環境準備:
Centos6.8虛擬機
2G內存 2顆CPU 200G硬盤
分區情況:/ 50G ?/boot 1G ?/swap 2G /data 30G
安裝時吧開發工具安裝上(gcc)
安裝手冊:
https://linux.cn/lfs/LFS-BOOK-7.7-systemd/
LFS-BOOK-7.7-systemd
軟件補丁包準備:
ftp.lfs-matrix.net/pub/lfs/lfs-packages/7.7-systemd下的所有
開始安裝LFS前準備
創建一個分區10G
fdisk /dev/sda
格式化分區
mkfs.ext4 /dev/sda6
swap使用宿主主機的,不需要創建
檢測swap是否在使用
/sbin/swapon -v /dev/sda5 (/dev/sda5是swap的掛載分區位置,用lsblk可以查看自己的swap的分區位置)
設置環境變量:
export LFS=/mnt/lfs ??#(把命令添加到/root/.bash_profile配置文檔中)
echo $LFS ?#檢查環境變量
掛載文件系統:
mkdir -pv $LFS ???#創建掛載點
mount -v -t ext4 /dev/sda6 $LFS ???#將sda6以ext4的格式掛載到/mnt/lfs下($LFS是/mnt/lfs的環境變量)
把下載好的軟件包放到系統中:
mkdir -v $LFS/sources
chmod -v a+wt $LFS/sources ?#給軟件存放目錄設置權限和粘滯模式
創建軟件安裝目錄
mkdir -v $LFS/tools
ln -sv $LFS/tools / ?#創建符號鏈接
創建工作用戶和組
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
命令行選項的意思:
-s /bin/bash
把 bash 設置為 lfs 用戶的默認 shell。
-g lfs
這個選項將用戶 lfs 添加到組 lfs 中。
-m
為 lfs 用戶創建主目錄。
-k /dev/null
這個參數通過改變輸入位置為特殊的空(null)設備,以防止可能從一個模版目
錄中(默認是 /etc/skel )復制文件。
lfs
這是創建的組和用戶的實際名稱。
給lfs用戶設置密碼:
passwd lfs
給lfs用設置文件的訪問權限:
chown -v lfs $LFS/tools
chown -v lfs $LFS/sources
最后的工作準備:
su – lsf ?#”- ?”指示su啟動登錄shell,而不是一個非登錄shell
配置一個新.bash_profile文件
cat > ~/.bash_profile << “EOF”
exec env -i HOME=$HOME TERM=$TERM PS1=’\u:\w\$ ‘ /bin/bash
EOF
配置一個新.bashrc文件
cat > ~/.bashrc << “EOF”
set +h #關閉bash的哈希功能
umask 022 #設置用戶文件新建掩碼為022
LFS=/mnt/lfs #選定的掛載點
LC_ALL=POSIX #控制特定程序的本地化
LFS_TGT=$(uname -m)-lfs-linux-gnu #一個編譯器非默認的變量,本人也不懂后續再看
PATH=/tols/bin:/bin:/usr/bin #一個外部命令搜索順序的變量
export LFS LC_ALL LFS_TGT PATH
EOF
啟用配置文件
source ~/.bash_profile
構建臨時系統:
cd /mnt/lfs/sources
重要:
編譯指南假定你已經正確地設置了宿主系統需求和符號鏈接:
- shell 使用的是 bash 。
- sh 是到 bash 的符號鏈接。
- /usr/bin/awk 是到 gawk 的符號鏈接。
- /usr/bin/yacc 是到 bison 的符號鏈接或者一個執行 bison 的小腳
本。
重要:
再次強調構建過程:
- 把所有源文件和補丁放到 chroot 環境可訪問的目錄,例如/mnt/lfs/sources/ 。但是 千萬不能把源文件放在 /mnt/lfs/tools/中。
- 進入到源文件目錄。
- 對于每個軟件包:
- 用 tar 程序解壓要編譯的軟件包。在第五章中,確保解壓軟件包時你使用的是 lfs 用 戶。
- 進入到解壓后創建的目錄中。
- 根據指南說明編譯軟件包。
- 回退到源文件目錄。
- 除非特別說明,刪除解壓出來的目錄和所有編譯過程中生成的<package> -build 目錄。
安裝交叉編譯的binutils:
tar xf binutils-2.25.tar.bz2 #解壓安裝包
cd binutils-2.25 #到解壓文件下
mkdir -v ../binutils-build #在上一級目錄新建安裝路徑
cd ../binutils-build/ #到安裝路徑下
../binutils-2.25/configure \
–prefix=/tools \ #指定安裝位置
–with-sysroot=$LFS \ #在$LFS中查找所需的目標系統庫
–with-lib-path=/tools/lib \ #指定連接器的庫路徑
–target=$LFS_TGT \ #告訴configure腳本調整編譯系統來編譯
–disable-nls \ #禁止國際化(i18n)
–disable-werror #防止警告事件導致的停止編譯
make #繼續編譯
如果是在x86——64上編譯,創建符號鏈接,以確保工具鏈的完整性:
case $(uname -m) in
x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac
安裝軟件包:
make install
安裝交叉編譯的gcc:
cd /mnt/lfs/sources
rm -rf binutils-2.25
tar xf gcc-4.9.2.tar.bz2 #解壓gcc
cd gcc-4.9.2
tar xf ../mpfr-3.1.2.tar.xz && mv -v mpfr-3.1.2 mpfr #解壓并且更改名稱
tar xf ../gmp-6.0.0a.tar.xz && mv -v gmp-6.0.0 gmp
tar xf ../mpc-1.0.2.tar.gz && mv -v mpc-1.0.2 mpc
for file in \
$(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
cp -uv $file{,.orig}
sed -e ‘s@/lib\(64\)\?\(32\)\?/ld@/tools&@g’ \
-e ‘s@/usr@/tools@g’ $file.orig > $file
echo ‘
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 “/tools/lib/”
#define STANDARD_STARTFILE_PREFIX_2 “”‘ >> $file
touch $file.orig
done #這一串命令太多我還有點迷糊,所以不想解釋
GCC不能正確檢測棧保護,這會導致編譯Glibc-2.21是出現問題,用一下命令修復:
sed -i ‘/k prot/agcc_cv_libc_provides_ssp=yes’ gcc/configure
mkdir -v gcc-build && cd gcc-build #新建并且進入到目錄中
準備編譯GCC:
../gcc-4.9.2/configure \
–target=$LFS_TGT \
–prefix=/tools \
–with-sysroot=$LFS \
–with-newlib \
–without-headers \–with-local-prefix=/tools \
–with-native-system-header-dir=/tools/include \
–disable-nls \
–disable-shared \
–disable-multilib \
–disable-decimal-float \
–disable-threads \
–disable-libatomic \
–disable-libgomp \
–disable-libitm \
–disable-libquadmath \
–disable-libsanitizer \
–disable-libssp \
–disable-libvtv \
–disable-libcilkrts \
–disable-libstdc++-v3 \
–enable-languages=c,c++ #不要問我這是啥,我也不知道,大概就是指定了一下目錄,禁用了一些模塊庫什么的吧(一臉懵逼)
運行命令編譯GCC
make
安裝軟件包:
make install
rm -rf gcc-4.9.2
安裝LinuxAPI頭文件:
tar xf linux-3.19.tar.xz
cd linux-3.19
make mrproper #確認沒有陳舊的文件且不依賴于之前的操作
make INSTALL_HDR_PATH=dest headers_install
mkdir /mnt/lfs/tools/include
cp -rv dest/include/* /tools/include #從源代碼中提取用戶可見的內核頭文件,把它們保存到臨時文件夾中然后復制到所需的位置
rm -rf linux-3.19
檢測頭文件是否正確安裝:
if [ ! -r /usr/include/rpc/types.h ]; then
su -c ‘mkdir -pv /usr/include/rpc’
su -c ‘cp -v sunrpc/rpc/*.h /usr/include/rpc’
fi #回車后并沒有什么提示和報錯,應該是沒問題的
研究了半天就這點結果,后天繼續研究。
未完待續……
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/93721