Linux From Scratch(從零開始構建Linux系統,簡稱LFS)(一)


一. 准備工作

  1. 需要一個Linux宿主系統,例如早先版本的 LFS,Ubuntu/Fedora,SuSE 或者是在你的架構上可以運行的其它發行版

    如果想實現Win7與Linux雙系統,可參考我的上一篇博文:Win7下硬盤安裝Ubuntu雙系統  

  2. 一個8G的U盤,LFS系統將安裝在上面

  3. 參考網址:Linux From Scratch V7.10

  4. 中文版參考網址:Linux From Scratch Version 7.7-systemd (簡體中文版)  

  5. 參考文檔:LFS-BOOK-7.10.pdf

  6. 參考網址:U盤上安裝與啟動LFS系統

 

二. LFS目標架構

    LFS主要支持 AMD/Intel 的 x86(32 位)和 x86_64(64 位) 的目標架構。

    假如按照本文的默認方式構建,那么你將得到一個“純” 64 位系統————這意味着你僅能夠執行64 位的程序。

 

三. 宿主系統需求

  1. 如果未設置root密碼,先設置,再以root用戶登錄

sudo passwd root
su - root

  2. 請執行以下命令,查看宿主機的各個軟件包的版本以及編譯環境是否准備妥當:

cat > version-check.sh << "EOF"
#!/bin/bash
# Simple script to list version numbers of critical development tools
export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
MYSH=$(readlink -f /bin/sh)
echo "/bin/sh -> $MYSH"
echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash"
unset MYSH

echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1

if [ -h /usr/bin/yacc ]; then
  echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
  echo yacc is `/usr/bin/yacc --version | head -n1`
else
  echo "yacc not found" 
fi

bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1

if [ -h /usr/bin/awk ]; then
  echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
elif [ -x /usr/bin/awk ]; then
  echo awk is `/usr/bin/awk --version | head -n1`
else 
  echo "awk not found" 
fi

gcc --version | head -n1
g++ --version | head -n1
ldd --version | head -n1 | cut -d" " -f2-  # glibc version
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
sed --version | head -n1
tar --version | head -n1
makeinfo --version | head -n1
xz --version | head -n1

echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c
if [ -x dummy ]
  then echo "g++ compilation OK";
  else echo "g++ compilation failed"; fi
rm -f dummy.c dummy
EOF

bash version-check.sh
View Code

    a. 如果宿主系統是Ubuntu 14.04.5,你會發現缺少了五個包,使用命令行增加:

apt-get update
apt-get install bison gawk m4 texinfo g++

    b. 同時,/bin/sh 是指向dash,使用命令行修改指向bash:

ln -sf bash /bin/sh

  3. 同時,還請進行庫文件的一致性檢查,這些文件應該要么都在或者是都缺失,而不應該只有一兩個。

cat > library-check.sh << "EOF"
#!/bin/bash
for lib in lib{gmp,mpfr,mpc}.la; do
  echo $lib: $(if find /usr/lib* -name $lib|
               grep -q $lib;then :;else echo not;fi) found
done
unset lib
EOF

bash library-check.sh
View Code

     如果宿主系統是Ubuntu 14.04.5,這些庫文件都是缺失的,不用管它

 

四. 准備新分區

  1. 宿主系統下安裝分區工具 gparted,命令:

apt-get install gparted

  2. 利用 gparted 重新划分U盤,我的U盤是分為:

    /dev/sdc1      100M        EXT4          boot分區

    /dev/sdc2       7.3G        EXT4          LFS系統分區  

  3. 我的宿主分區是這樣的:         

    /dev/sda5       2G         Swap          交換分區

    /dev/sda6       100M      EXT4          boot分區

    /dev/sda7       28G        EXT4          Ubuntu系統分區

  5. 掛載新分區

export LFS=/mnt/lfs
mkdir -pv $LFS  
mount -v -t ext4 /dev/sdc2 $LFS   

# 如果你正在使用交換分區,用 swapon 命令確保它已經啟用
/sbin/swapon -v /dev/sda5


五. 軟件包與補丁  

  1. 執行下面的命令創建$LFS/sources目錄

mkdir -v $LFS/sources

    此目錄用於保存軟件包和補丁,同時用來解壓源代碼並執行編譯。 

  2. 設置目錄的寫權限和粘滯模式

chmod -v a+wt $LFS/sources

    “粘滯模式”意思是就算有多個用戶對某個目錄有寫權限,仍然只有該文件的主人能刪除一個粘滯目錄里的文件。

  3. 下載需要的軟件包和補丁,它們用來構建一個基本的 Linux 系統  

    點擊此下載 wget-list 文件作為 wget 的輸入:

wget --input-file=wget-list --continue --directory-prefix=$LFS/sources

  4. 下載批處理腳本 ch5-build.shch6-build.sh,放到 $LFS/sources 文件夾下

 

六. 最后的准備工作

  1. 創建 $LFS/tools 文件夾

# 編譯的臨時工具會安裝到 $LFS/tools 文件夾,不會成為最終 LFS 系統的一部分。

mkdir -v $LFS/tools

  2. 在宿主系統中創建 /tools 的符號鏈接,將其指向$LFS/tools

# 創建的符號鏈接使得編譯的工具鏈總是指向 /tools 文件夾。

ln -sv $LFS/tools /

  3. 添加lfs用戶

groupadd lfs    # 添加新組
useradd -s /bin/bash -g lfs -m -k /dev/null lfs     # 添加新用戶    
passwd lfs      # 為用戶設置密碼
chown -v lfs $LFS/tools     # 賦予了訪問 $LFS/tools 文件夾的所有權限
chown -vR lfs $LFS/sources   # 賦予了訪問 $LFS/sources 文件夾的所有權限
su - lfs    # 切換用戶

  4. 設置環境

# 以 lfs 用戶登錄運行以下兩個命令,為 bash shell 創建兩個開機啟動的文件。
# 當以 lfs 用戶身份登錄時,初始 shell 通常是一個可登錄的 shell
# 它先讀取宿主機的 /etc/profile 文件(很可能包括一些設置和環境變量),然后是 .bash_profile 文件
# .bash_profile 文件使用完全空環境的 shell 代替運行中的 shell

cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF


# 新的 shell 實例是一個非登錄 shell,不會讀取 /etc/profile 或者 .bash_profile 文件,而是讀取 .bashrc 文件
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH
EOF


# 啟用配置文件
source ~/.bash_profile
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM