1. 程式人生 > >LFS 8.3 從零開始做自己的系統(一)~!~

LFS 8.3 從零開始做自己的系統(一)~!~

網站 acc multi sda ica 光盤 erl 主機系統 再次

此文是寫給新手的教程~!~
我會盡量寫的詳細一些。
虛擬機軟件:我選的是VirtualBox,版本:4.3.12 r93733。如果用vmware的話,設置方面基本差不多。
縮主機系統:我用的是debian linux系統。(我是在163網站下載的,你也可以去官網上下載live-cd。請盡量用debian9.5.0系統,因為我是按照這個系統寫的教程。其實,只是用這個光盤來引導系統,不用安裝整個debian。)下載地址:
http://mirrors.163.com/debian-cd/9.5.0-live/amd64/iso-hybrid/debian-live-9.5.0-amd64-cinnamon.iso

開始我們的LFS 8.3之旅。

一、建立虛擬機:
1.內存1G
2.硬盤64G
3.CPU 4個(這個根據實際情況設置,我的是8核的,設置了4個)
4.網卡選擇:橋接網卡
下面是我虛擬機設置的截圖:技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
現在虛擬機已經建立完成,點擊啟動。
二、建立縮主機系統:
1.debian系統啟動時,在Main Menu的主菜單中,直接回車。進入debian live-cd系統。
2.點擊左下角的Menu 菜單選擇終端如下圖;
技術分享圖片

3.切換到root用戶,在終端中輸入:sudo su root

技術分享圖片
4.更新軟件源(有的時候非常慢),輸入:apt-get update
技術分享圖片
5.更改root密碼,(相同的密碼輸入再次)輸入:passwd
技術分享圖片
5.看一下現在虛擬機自動獲取的IP地址(inet 後面的是你現在的IP地址,我的是192.168.3.85,將你的IP地址記下來,一會兒要用到。),輸入:ifconfg

技術分享圖片
6.安裝ssh-server服務(以後,我們會用ssh客戶端登錄到虛擬機來完成安裝LFS系統。),輸入:apt-get install openssh-server 當詢問“您是否想繼續?”時,輸入y回車。
技術分享圖片
7.配置ssh-server,輸入:nano /etc/ssh/sshd_config
技術分享圖片
8.打開ssh-server的配置文件,向下移動光標,將PermitRootLogin prohibit-password將前面的#號去掉,並且把後面的prohibit-password去掉,換成yes。將PasswordAuthentication yes前面的#號去掉。修改後,先按Ctrl+o然後回車,再按Ctrl+x退出。
技術分享圖片
技術分享圖片
9.啟動ssh-server服務,輸入:/etc/init.d/ssh start
技術分享圖片
到此,ssh-server配置完成。現在,可以將虛擬機最小化,用ssh客戶端軟件,輸入你剛才用ifconfig查看的IP地址,登錄到虛擬機。
技術分享圖片
三、建立縮主機系統:
1.檢測縮主機系統軟件版本,編寫version-check.sh文件:
cat > version-check.sh << "EOF"
#!/bin/bash
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
2.運行version-check.sh腳本,輸入:
bash version-check.sh
3.輸出結果如下圖:
技術分享圖片
4.調整及安裝軟件,使縮主機適合LFS8.3系統的需求:
(1)ln -sf bash /bin/sh //修改bash指向/bin/sh
(2)apt-get install bison //安裝bison
(3)apt-get install g++ //安裝g++
(4)apt-get install texinfo //安裝texinfo
(5)再次執行version-check.sh文件,查看縮主機軟件版本:
bash version-check.sh
輸出如下圖:
技術分享圖片
(6)以上結果同下圖比較,軟件版本全部比官方要求的高。不過,沒什麽問題。只要不缺少軟件就可以。我是用以上軟件版本編譯通過的。
技術分享圖片
5.創建分區:
(1)我用的是cfdisk命令分區的,如下圖:
技術分享圖片
(2)選擇gpt:
技術分享圖片

(3)第一個分區:sda1 大小:2M (用gpt,必須分一個2M的小分區,做為第一分區。)
(4)第二個分區:sda2 大小:2048M (交換分區)
(5)第三個分區:sda3 大小:剩余全部空間(/分區)
(6)分區格式設置:將光標移動到sda1 按鍵盤上的t鍵,用光標找到 BIOS boot格式,並回車。再將光標移動到sda2,按鍵盤上的t鍵,將光標移動到Linux swap回車。sda3 分區默認。再將光標移動到Write(再最下面),按回車,輸入:yes回車,然後按q鍵退出分區。這樣我們的分區就完成了。
技術分享圖片
5.在分區上創建文件系統(格式化)(sda1分區不用管,那個是給grub準備的。):
(1)mkfs -v -t ext4 /dev/sda3
(2)格式化交換分區:
mkswap /dev/sda2
6.設置$LFS變量、建立目錄、掛載分區:
export LFS=/mnt/lfs
mkdir -pv $LFS
mount -v -t ext4 /dev/sda3 $LFS
/sbin/swapon -v /dev/sda2 //交換分區
7.創建源代碼目錄、設置權限並進入目錄:
mkdir -v $LFS/sources
chmod -v a+wt $LFS/sources
cd $LFS/sources
四、軟件包、補丁及準備工作:
1.下載源代碼(我是在蘭州大學開源社區下載的,你也可以在官網上下載,就是速度慢此):
wget https://mirror.lzu.edu.cn/lfs/lfs-packages/lfs-packages-8.3.tar
2.解壓縮:
tar xvf lfs-packages-8.3.tar
rm -rf lfs-packages-8.3.tar
cd 8.3
mv . ../
cd ..
rm -rf 8.3
3.這裏最好將wget、ssh-server、blfs-bootscripts-20180105.tar.xz一起全下載下來。要不然,做完LFS系統好,可以上網,但是下載軟件和ssh登錄不了,就悲劇了。
wget https://ftp.gnu.org/gnu/wget/wget-1.19.5.tar.gz
wget http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-7.7p1.tar.gz
wget http://www.linuxfromscratch.org/patches/blfs/8.3/openssh-7.7p1-openssl-1.1.0-1.patch
wget http://anduin.linuxfromscratch.org/BLFS/blfs-bootscripts/blfs-bootscripts-20180105.tar.xz
4.創建工具鍵目錄及鏈接:
mkdir -v $LFS/tools
ln -sv $LFS/tools /
5.添加LFS用戶
groupadd lfs //創建用戶級
useradd -s /bin/bash -g lfs -m -k /dev/null lfs //創建lfs用戶
passwd lfs //給lfs用戶設置密碼
chown -v lfs $LFS/tools //授予lfs用戶對$LFS/tools目錄的所有權限
chown -v lfs $LFS/sources //授予lfs用戶對$LFS/sources目錄的所有權限
su - lfs //以lfs用戶登錄系統
6.設置環境:
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1=‘\u:\w\$ ‘ /bin/bash
EOF
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
五、構建臨時系統:
1.輸入echo $LFS //正常會輸出:/mnt/lfs
2.進入源碼目錄: cd $LFS/sources/

3.Binutils-2.31.1 pass1

tar xvf binutils-2.31.1.tar.xz
cd binutils-2.31.1
mkdir -v build
cd build
../configure --prefix=/tools \
--with-sysroot=$LFS \
--with-lib-path=/tools/lib \
--target=$LFS_TGT \
--disable-nls \
--disable-werror
make
如果在x86_64上構建,創建符號鏈接:
case $(uname -m) in
x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac
make install
cd ../..
rm -rf binutils-2.31.1

4.gcc-8.2.0 pass1

tar xvf gcc-8.2.0.tar.xz
cd gcc-8.2.0
tar -xf ../mpfr-4.0.1.tar.xz
mv -v mpfr-4.0.1 mpfr
tar -xf ../gmp-6.1.2.tar.xz
mv -v gmp-6.1.2 gmp
tar -xf ../mpc-1.1.0.tar.gz
mv -v mpc-1.1.0 mpc
for file in gcc/config/{linux,i386/linux{,64}}.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
x86_64主機上,將64位庫的默認目錄名設置為“?lib?”:
case $(uname -m) in
x86_64)
sed -e ‘/m64=/s/lib64/lib/‘ \
-i.orig gcc/config/i386/t-linux64
;;
esac
mkdir -v build
cd build
../configure \
--target=$LFS_TGT \
--prefix=/tools \
--with-glibc-version=2.11 \
--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-libmpx \
--disable-libquadmath \
--disable-libssp \
--disable-libvtv \
--disable-libstdcxx \
--enable-languages=c,c++
make && make install
cd ../..
rm -rf gcc-8.2.0

5.Linux內核頭文件

tar xvf linux-4.18.5.tar.xz
cd linux-4.18.5
make mrproper
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include
cd ..
rm -rf linux-4.18.5

6.glibc-2.28

tar xvf glibc-2.28.tar.xz
cd glibc-2.28
mkdir -v build
cd build
../configure \
--prefix=/tools \
--host=$LFS_TGT \
--build=$(../scripts/config.guess) \
--enable-kernel=3.2 \
--with-headers=/tools/include \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes
make && make install
檢查新工具鏈的基本功能:
echo ‘int main(){}‘ > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep ‘: /tools‘
沒有問題會輸出:
[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2] //64位輸出
[Requesting program interpreter: /tools/lib/ld-linux.so.2] //32位輸出
如果輸出沒有如上所示或者根本沒有輸出,則出現問題。檢查之前的軟件安裝,找出問題並予以糾正。在繼續之前必須解決此問題。否則以後的安裝將沒有意義!
cd ../..
rm -rf glibc-2.28

7.Libstdc ++

tar xvf gcc-8.2.0.tar.xz
cd gcc-8.2.0
mkdir -v build
cd build
../libstdc++-v3/configure \
--host=$LFS_TGT \
--prefix=/tools \
--disable-multilib \
--disable-nls \
--disable-libstdcxx-threads \
--disable-libstdcxx-pch \
--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/8.2.0
make && make install
cd ../..
rm -rf gcc-8.2.0

8.binutils-pass2

tar xvf binutils-2.31.1.tar.xz
cd binutils-2.31.1
mkdir -v build
cd build
CC=$LFS_TGT-gcc \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../configure \
--prefix=/tools \
--disable-nls \
--disable-werror \
--with-lib-path=/tools/lib \
--with-sysroot
make && make install
make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin
cd ../..
rm -rf binutils-2.31.1

9.GCC-8.2.0 pass2

tar xvf gcc-8.2.0.tar.xz
cd gcc-8.2.0
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
dirname $($LFS_TGT-gcc -print-libgcc-file-name)/include-fixed/limits.h
for file in gcc/config/{linux,i386/linux{,64}}.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
64位庫的缺省目錄名更改為“?lib?”:
case $(uname -m) in
x86_64)
sed -e ‘/m64=/s/lib64/lib/‘ \
-i.orig gcc/config/i386/t-linux64
;;
esac
tar -xf ../mpfr-4.0.1.tar.xz
mv -v mpfr-4.0.1 mpfr
tar -xf ../gmp-6.1.2.tar.xz
mv -v gmp-6.1.2 gmp
tar -xf ../mpc-1.1.0.tar.gz
mv -v mpc-1.1.0 mpc
mkdir -v build
cd build
CC=$LFS_TGT-gcc \
CXX=$LFS_TGT-g++ \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../configure \
--prefix=/tools \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--enable-languages=c,c++ \
--disable-libstdcxx-pch \
--disable-multilib \
--disable-bootstrap \
--disable-libgomp
make && make install
ln -sv gcc /tools/bin/cc
檢查新工具鏈功能:
echo ‘int main(){}‘ > dummy.c
cc dummy.c
readelf -l a.out | grep ‘: /tools‘
64位顯示:
[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]
32位顯示:
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
如果輸出沒有如上所示或者根本沒有輸出,則出現問題。檢查並回顧這些步驟,找出問題所在並予以糾正。在繼續之前必須解決此問題,否則繼續安裝沒有意義!
echo $PATH
驗證/tools/bin是否位於列表的頭部。如果不是,則可能意味著您沒有以用戶身份登錄lfs或者環境變量設置錯誤。
cd ../..
rm -rf gcc-8.2.0

10.TCL-8.6.8

tar xvf tcl8.6.8-src.tar.gz
cd tcl8.6.8
cd unix
./configure --prefix=/tools
make && make install
chmod -v u+w /tools/lib/libtcl8.6.so
make install-private-headers
ln -sv tclsh8.6 /tools/bin/tclsh
cd ../..
rm -rf tcl8.6.8

11.Expect-5.45.4

tar xvf expect5.45.4.tar.gz
cd expect5.45.4
cp -v configure{,.orig}
sed ‘s:/usr/local/bin:/bin:‘ configure.orig > configure
./configure --prefix=/tools \
--with-tcl=/tools/lib \
--with-tclinclude=/tools/include
make && make SCRIPTS="" install
cd ..
rm -rf expect5.45.4

12.DejaGnu-1.6.1

tar xvf dejagnu-1.6.1.tar.gz
cd dejagnu-1.6.1
./configure --prefix=/tools
make install
cd ..
rm -rf dejagnu-1.6.1

13.M4-1.4.18

tar xvf m4-1.4.18.tar.xz
cd m4-1.4.18
sed -i ‘s/IO_ftrylockfile/IO_EOF_SEEN/‘ lib/*.c
echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h
./configure --prefix=/tools
make && make install
cd ..
rm -rf m4-1.4.18

14.ncurses的6.1

tar xvf ncurses-6.1.tar.gz
cd ncurses-6.1
sed -i s/mawk// configure
./configure --prefix=/tools \
--with-shared \
--without-debug \
--without-ada \
--enable-widec \
--enable-overwrite
make && make install
cd ..
rm -rf ncurses-6.1

15.bash-4.4.18

tar xvf bash-4.4.18.tar.gz
cd bash-4.4.18
./configure --prefix=/tools --without-bash-malloc
make && make install
ln -sv bash /tools/bin/sh
cd ..
rm -rf bash-4.4.18

16.bison-3.0.5

tar xvf bison-3.0.5.tar.xz
cd bison-3.0.5
./configure --prefix=/tools
make && make install
cd ..
rm -rf bison-3.0.5

17.Bzip2-1.0.6

tar xvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
make && make PREFIX=/tools install
cd ..
rm -rf bzip2-1.0.6

18.Coreutils-8.30

tar xvf coreutils-8.30.tar.xz
cd coreutils-8.30
./configure --prefix=/tools --enable-install-program=hostname
make && make install
cd ..
rm -rf coreutils-8.30

19.diffutils-3.6

tar xvf diffutils-3.6.tar.xz
cd diffutils-3.6
./configure --prefix=/tools
make && make install
cd ..
rm -rf diffutils-3.6

20.file-5.34

tar xvf file-5.34.tar.gz
cd file-5.34
./configure --prefix=/tools
make && make install
cd ..
rm -rf file-5.34

21.findutils-4.6.0

tar xvf findutils-4.6.0.tar.gz
cd findutils-4.6.0
sed -i ‘s/IO_ftrylockfile/IO_EOF_SEEN/‘ gl/lib/*.c
sed -i ‘/unistd/a #include <sys/sysmacros.h>‘ gl/lib/mountlist.c
echo "#define _IO_IN_BACKUP 0x100" >> gl/lib/stdio-impl.h
./configure --prefix=/tools
make && make install
cd ..
rm -rf findutils-4.6.0

22.GAWK-4.2.1

tar xvf gawk-4.2.1.tar.xz
cd gawk-4.2.1
./configure --prefix=/tools
make && make install
cd ..
rm -rf gawk-4.2.1

23.Gettext-0.19.8.1

tar -xvf gettext-0.19.8.1.tar.xz
cd gettext-0.19.8.1
cd gettext-tools
EMACS="no" ./configure --prefix=/tools --disable-shared
make -C gnulib-lib
make -C intl pluralx.c
make -C src msgfmt
make -C src msgmerge
make -C src xgettext
cp -v src/{msgfmt,msgmerge,xgettext} /tools/bin
cd ../..
rm -rf gettext-0.19.8.1

24.grep-3.1

tar xvf grep-3.1.tar.xz
cd grep-3.1
./configure --prefix=/tools
make && make install
cd ..
rm -rf grep-3.1

25.gzip-1.9

tar xvf gzip-1.9.tar.xz
cd gzip-1.9
sed -i ‘s/IO_ftrylockfile/IO_EOF_SEEN/‘ lib/*.c
echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h
./configure --prefix=/tools
make && make install
cd ..
rm -rf gzip-1.9

26.make-4.2.1

tar xvf make-4.2.1.tar.bz2
cd make-4.2.1
sed -i ‘211,217 d; 219,229 d; 232 d‘ glob/glob.c
./configure --prefix=/tools --without-guile
make && make install
cd ..
rm -rf make-4.2.1

27.patch-2.7.6

tar xvf patch-2.7.6.tar.xz
cd patch-2.7.6
./configure --prefix=/tools
make && make install
cd ..
rm -rf patch-2.7.6

28.perl-5.28.0

tar xvf perl-5.28.0.tar.xz
cd perl-5.28.0
sh Configure -des -Dprefix=/tools -Dlibs=-lm -Uloclibpth -Ulocincpth
make
cp -v perl cpan/podlators/scripts/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.28.0
cp -Rv lib/* /tools/lib/perl5/5.28.0
cd ..
rm -rf perl-5.28.0

29.sed-4.5

tar xvf sed-4.5.tar.xz
cd sed-4.5
./configure --prefix=/tools
make && make install
cd ..
rm -rf sed-4.5

30.tar-1.30

tar xvf tar-1.30.tar.xz
cd tar-1.30
./configure --prefix=/tools
make && make install
cd ..
rm -rf tar-1.30

31.Texinfo-6.5

tar xvf texinfo-6.5.tar.xz
cd texinfo-6.5
./configure --prefix=/tools
make && make install
cd ..
rm -rf texinfo-6.5

32.UTIL-Linux-2.32.1

tar xvf util-linux-2.32.1.tar.xz****
cd util-linux-2.32.1
./configure --prefix=/tools \
--without-python \
--disable-makeinstall-chown \
--without-systemdsystemunitdir \
--without-ncurses \
PKG_CONFIG=""
make && make install
cd ..
rm -rf util-linux-2.32.1

33.XZ-5.2.4

tar xvf xz-5.2.4.tar.xz
cd xz-5.2.4
./configure --prefix=/tools
make && make install
cd ..
rm -rf xz-5.2.4
34.剝離

strip --strip-debug /tools/lib/
/usr/bin/strip --strip-unneeded /tools/{,s}bin/

rm -rf /tools/{,share}/{info,man,doc}
find /tools/{lib,libexec} -name *.la -delete

35.更改tools目錄權限
exit
chown -R root:root $LFS/tools

LFS 8.3 從零開始做自己的系統(一)~!~