Welcome to A!Die Software Studio |
上一章 | 回目录 | 下一章 |
我们已经建立好了用于构建 LFS 系统的工具了,为了尽量减少宿主系统的影响,我们使用 chroot 切换到新的系统中进行工作,然后再安装系统软件。
我们之前的 $LFS/tools 是属于 lfs 这个用户的,而 lfs 这个用户是宿主系统上的用户,所以我们首先要把文件的所有者改回 root,由于 root 的用户 ID 和 组 ID 都是 0,可以确保在新的系统下面所有者仍然是 root。
使用 root 而不是 lfs 用户登录虚拟机:
login as: root
root@192.168.237.131's password:
Last login: ...
root [ ~ ]# chown -R root:root /mnt/lfs/tools
由于之后的操作会改变 tools 目录的内容,而构建的 tools 目录也可以用于安装相同版本的多个 LFS 系统,如果需要的话可以进行备份:
root [ ~ ]# cd /mnt/lfs/tools
root [ /mnt/lfs/tools ]# tar zcvf tools.tar.gz ./
root [ /mnt/lfs/tools ]# mv tools.tar.gz /mnt/lfs/usr/src
接下来我们需要创建一些系统目录和文件:
root [ ~ ]# export LFS=/mnt/lfs
root [ ~ ]# mkdir -pv $LFS/{dev,proc,sys}
mkdir: created directory `/mnt/lfs/dev'
mkdir: created directory `/mnt/lfs/proc'
mkdir: created directory `/mnt/lfs/sys'
root [ ~ ]# mknod -m 600 $LFS/dev/console c 5 1
root [ ~ ]# mknod -m 666 $LFS/dev/null c 1 3
root [ ~ ]# mount -v --bind /dev $LFS/dev
/dev on /mnt/lfs/dev type none (rw,bind)
root [ ~ ]# mount -vt devpts devpts $LFS/dev/pts
devpts on /mnt/lfs/dev/pts type devpts (rw)
root [ ~ ]# mount -vt tmpfs shm $LFS/dev/shm
shm on /mnt/lfs/dev/shm type tmpfs (rw)
root [ ~ ]# mount -vt proc proc $LFS/proc
proc on /mnt/lfs/proc type proc (rw)
root [ ~ ]# mount -vt sysfs sysfs $LFS/sys
sysfs on /mnt/lfs/sys type sysfs (rw)
/dev,/sys,/proc 都是内核虚拟的文件系统,我们首先创建一个挂载点目录,然后把内核文件系统挂载上去。/dev 包含了硬件设备文件;/proc 包含了运行的进程信息;/sys 包含了一些系统信息,配置等等。console 和 null 是系统引导时需要的设备节点,我们必须在硬盘上创建它们。
现在我们使用 chroot 来切换环境,为了让以后重新登录时切换方便,我们把切换的命令放入脚本中,以后每次登陆后都运行一次这个脚本:
root [ ~ ]# cat > chsys.sh << "EOF"
> export LFS=/mnt/lfs
> chroot "$LFS" /tools/bin/env -i HOME=/root TERM="$TERM" PS1='\u:\w\$ ' PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin /tools/bin/bash --login +h
> EOF
root [ ~ ]# chmod +x chsys.sh
root [ ~ ]# ./chsys.sh
I have no name!:/#
env -i 命令清除所有 chroot 环境变量,然后重新设置了 HOME, TERM, PS1 和 PATH 的值。通过 +h 选项并且把 /tools/bin 放在 PATH 的最后,可以保证一旦我们完成了系统上的一个工具,就会立即取代临时工具。
此时,命令提示符变为 I have no name!这是正常的,稍后创建了 /etc/passwd 文件后就正常了。
chroot 即 change root directory,更改 root 目录。使用 chroot 之后,系统的目录结构将以指定的位置作为 "/" 位置。使用chroot 主要有 3 个用途:
1. 限制用户的能力,增加系统安全性。chroot 之后,在新的根目录下访问不到旧系统的根目录结构和文件了。
2. 在进行开发的时候建立一个与原系统隔离的目录结构。可以用来测试软件的静态编译和系统无关的独立开发。
3. 用于系统救急。在系统从磁盘引导起来后,从初始的 RAM 磁盘切换系统的根位置并执行真正的 init。
Linux/Unix 系统的目录树是有一定规则的,为了解决各种系统的一些差别,已经形成了一个标准(http://www.adintr.com/media/books/fhs.pdf),我们这里将基本按照标准来创建这些目录结构:
I have no name!:/# mkdir -pv /{bin,boot,etc/opt,home,lib,mnt,opt}
I have no name!:/# mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
I have no name!:/# install -dv -m 0750 /root
I have no name!:/# install -dv -m 1777 /tmp /var/tmp
I have no name!:/# mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
I have no name!:/# mkdir -pv /usr/{,local/}share/{doc,info,locale,man}
I have no name!:/# mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo}
I have no name!:/# mkdir -pv /usr/{,local/}share/man/man{1..8}
I have no name!:/# for dir in /usr /usr/local; do
> ln -sv share/{man,doc,info} $dir
> done
I have no name!:/# mkdir -v /var/{lock,log,mail,run,spool}
I have no name!:/# mkdir -pv /var/{opt,cache,lib/{misc,locate},local}
为了保证兼容性,接下来创建一些符号连接:
I have no name!:/# ln -sv /tools/bin/{bash,cat,echo,grep,pwd,stty} /bin>
I have no name!:/# ln -sv /tools/bin/perl /usr/bin
I have no name!:/# ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
I have no name!:/# ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib
I have no name!:/# ln -sv bash /bin/sh
创建一个空文件 /etc/mtab,它用来记录已经加载的文件系统:
I have no name!:/# touch /etc/mtab
创建 /etc/passwd 和 /etc/group 文件,这两个文件记录了系统的用户和组信息:
I have no name!:/# cat > /etc/passwd << "EOF"
> root:x:0:0:root:/root:/bin/bash
> nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
> EOF
I have no name!:/# cat > /etc/group << "EOF"
> root:x:0:
> bin:x:1:
> sys:x:2:
> kmem:x:3:
> tty:x:4:
> tape:x:5:
> daemon:x:6:
> floppy:x:7:
> disk:x:8:
> lp:x:9:
> dialout:x:10:
> audio:x:11:
> video:x:12:
> utmp:x:13:
> usb:x:14:
> cdrom:x:15:
> mail:x:34:
> nogroup:x:99:
> EOF
重启 shell 就可以看到正常的命令提示符了:
I have no name!:/# exec /tools/bin/bash --login +h
root:/#
login,agetty 和 init 等一些程序要使用日志文件来记录登陆之类的信息,如果文件不存在,它们就无法写入,所以我们把这些日志文件先初始化好:
root:/# touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
root:/# chgrp -v utmp /var/run/utmp /var/log/lastlog
changed group of `/var/run/utmp' to utmp
changed group of `/var/log/lastlog' to utmp
root:/# chmod -v 664 /var/run/utmp /var/log/lastlog
mode of `/var/run/utmp' changed to 0664 (rw-rw-r--)
mode of `/var/log/lastlog' changed to 0664 (rw-rw-r--)
系统结构就创建到此了,下面我们开始安装软件。
Glibc 需要这些头文件才能工作,所以我们需要首先安装它。
root:/# cd
root:~# cat > install_linux_header.sh << "EOF"
> cd /sources
> rm -r linux-2.6.22.5
> tar xvf linux-2.6.22.5.tar.bz2
> cd linux-2.6.22.5
> sed -i '/scsi/d' include/Kbuild
> make mrproper
> make headers_check
> make INSTALL_HDR_PATH=dest headers_install
> cp -rv dest/include/* /usr/include
> cd
> echo -e '\aFinished!'
> EOF
root:~# source install_linux_header.sh
我们首先删除了之前的文件,然后重新解压,并且在安装之前用 sed 命令对安装位置做了一次修改,这是 Glibc 需要的。
包含了一些用户手册。
root:~# cat > install_man_page.sh << "EOF"
> cd /sources
> tar xvf man-pages-2.63.tar.bz2
> cd man-pages-2.63
> make install
> cd
> echo -e '\aFinished!'
> EOF
root:~# source install_man_page.sh
Glibc 软件包包含主要的 C 库。这个库提供了基本例程, 用于分配内存、 搜索目录、 打开关闭文件、 读写文件、 字串处理、模式匹配、数学计算等等。
Glibc 对系统来说很重要,所以我们一步一步的来手动安装,确保过程中没有出现错误。首先,我们清除上次安装的临时文件并重新解压:
root:~# cd /sources
root:/sources# rm -r glibc-2.5.1
root:/sources# tar xvf glibc-2.5.1.tar.bz2
root:/sources# cd glibc-2.5.1
root:/sources/glibc-2.5.1#
glibc-libidn 为 Glibc提供 IDN(国际化域名,即包含各地本地语言的域名,比如中文域名等等) 支持,解压 glibc-libidn 的源代码到 glibc 的目录下以便一起进行安装。
root:/sources/glibc-2.5.1# tar xvf ../glibc-libidn-2.5.1.tar.gz
root:/sources/glibc-2.5.1# mv glibc-libidn-2.5.1 libidn
在vi_VN.TCVN 脚本里,bash 会进入死循环,目前还不清楚是 bash 的 BUG 还是 Glibc 的 BUG,我们禁止安装它来避免这个问题。
root:/sources/glibc-2.5.1# sed -i '/vi_VN.TCVN/d' localedata/SUPPORTED
当运行 make install 时,一个叫做 test-installation.pl 的脚本会在我们新安装的 Glibc 上做一个小的完整性测试。然而,由于我们的 toolchain 仍然指向 /tools 目录, 完整性测试会导致使用错误的Glibc。安装下面的操作, 我们可以强制脚本测试我们刚安装的 Glibc:
root:/sources/glibc-2.5.1# sed -i 's|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=/lib/ld-linux.so.2 -o|' scripts/test-installation.pl
ldd shell 脚本包含 Bash-specific 语法。 如果参照BLFS文档的 Shells章节安装了其他的 /bin/sh 的话,要把它的默认程序解释器改变为 /bin/bash:
root:/sources/glibc-2.5.1# sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in
现在开始为编译进行配置:
root:/sources/glibc-2.5.1# rm -r ../glibc-build
root:/sources/glibc-2.5.1# mkdir ../glibc-build
root:/sources/glibc-2.5.1# cd ../glibc-build
root:/sources/glibc-build# ../glibc-2.5.1/configure --prefix=/usr --disable-profile --enable-add-ons --enable-kernel=2.6.0 --libexecdir=/usr/lib/glibc
一步一步的进行,确保没有错误:
root:/sources/glibc-build# make
下面是测试,注意不要跳过:
root:/sources/glibc-build# touch /etc/ld.so.conf
root:/sources/glibc-build# make -k check 2>&1 | tee glibc-check-log
其中一些已知的错误是可以忽略的,包括 posix/annexc、nptl/tst-clock2、nptl/tst-attr3、rt/tst-cpuclock2、math、atime。之后进行安装:
root:/sources/glibc-build# make install
下面是安装本地化,这不是必须的,但是没有的化之后的某些测试会被跳过:
root:/sources/glibc-build# mkdir -pv /usr/lib/locale
mkdir: created directory `/usr/lib/locale'
root:/sources/glibc-build# localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
root:/sources/glibc-build# localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
root:/sources/glibc-build# localedef -i de_DE -f ISO-8859-1 de_DE
root:/sources/glibc-build# localedef -i de_DE -f UTF-8 de_DE.UTF-8
root:/sources/glibc-build# localedef -i en_HK -f ISO-8859-1 en_HK
root:/sources/glibc-build# localedef -i en_PH -f ISO-8859-1 en_PH
root:/sources/glibc-build# localedef -i en_US -f ISO-8859-1 en_US
root:/sources/glibc-build# localedef -i en_US -f UTF-8 en_US.UTF-8
root:/sources/glibc-build# localedef -i es_MX -f ISO-8859-1 es_MX
root:/sources/glibc-build# localedef -i fa_IR -f UTF-8 fa_IR
root:/sources/glibc-build# localedef -i fr_FR -f ISO-8859-1 fr_FR
root:/sources/glibc-build# localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
root:/sources/glibc-build# localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
root:/sources/glibc-build# localedef -i it_IT -f ISO-8859-1 it_IT
root:/sources/glibc-build# localedef -i ja_JP -f EUC-JP ja_JP
root:/sources/glibc-build# localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
root:/sources/glibc-build# localedef -i zh_CN -f GB18030 zh_CN.GB18030
我们还需要创建 /etc/nsswitch.conf 文件,因为在这个文件丢失或不正确的情况下,Glibc 会使用默认配置, 而 Glibc 的默认配置无法很好地在网络环境下工作。 并且我们也需要设置自己的时区。
root:/sources/glibc-build# cat > /etc/nsswitch.conf << "EOF"
> # Begin /etc/nsswitch.conf
> passwd: files
> group: files
> shadow: files
> hosts: files dns
> networks: files
> protocols: files
> services: files
> ethers: files
> rpc: files
> # End /etc/nsswitch.conf
> EOF
root:/sources/glibc-build# tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
1) Africa
2) Americas
3) Antarctica
4) Arctic Ocean
5) Asia
6) Atlantic Ocean
7) Australia
8) Europe
9) Indian Ocean
10) Pacific Ocean
11) none - I want to specify the time zone using the Posix TZ format.
#? 5
Please select a country.
1) Afghanistan 18) Israel 35) Palestine
2) Armenia 19) Japan 36) Philippines
3) Azerbaijan 20) Jordan 37) Qatar
4) Bahrain 21) Kazakhstan 38) Russia
5) Bangladesh 22) Korea (North) 39) Saudi Arabia
6) Bhutan 23) Korea (South) 40) Singapore
7) Brunei 24) Kuwait 41) Sri Lanka
8) Cambodia 25) Kyrgyzstan 42) Syria
9) China 26) Laos 43) Taiwan
10) Cyprus 27) Lebanon 44) Tajikistan
11) East Timor 28) Macau 45) Thailand
12) Georgia 29) Malaysia 46) Turkmenistan
13) Hong Kong 30) Mongolia 47) United Arab Emirates
14) India 31) Myanmar (Burma) 48) Uzbekistan
15) Indonesia 32) Nepal 49) Vietnam
16) Iran 33) Oman 50) Yemen
17) Iraq 34) Pakistan
#? 9
Please select one of the following time zone regions.
1) east China - Beijing, Guangdong, Shanghai, etc.
2) Heilongjiang
3) central China - Gansu, Guizhou, Sichuan, Yunnan, etc.
4) Tibet & most of Xinjiang Uyghur
5) southwest Xinjiang Uyghur
#? 1
The following information has been given:
China
east China - Beijing, Guangdong, Shanghai, etc.
Therefore TZ='Asia/Shanghai' will be used.
Local time is now: Sun Apr 15 23:18:28 CST 2012.
Universal Time is now: Sun Apr 15 15:18:28 UTC 2012.
Is the above information OK?
1) Yes
2) No
#? 1
You can make this change permanent for yourself by appending the line
TZ='Asia/Shanghai'; export TZ
to the file '.profile' in your home directory; then log out and log in again.
Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai
root:/sources/glibc-build# cp -v --remove-destination /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
removed `/etc/localtime'
`/usr/share/zoneinfo/Asia/Shanghai' -> `/etc/localtime'
其中,cp 命令的 --remove-destination选项强制删除已存在的符号链接。我们采用拷贝文件而不是创建符号链接的原因是:有可能 /usr 在单独的分区上,如果启动进入单用户模式,就会出问题。
默认情况下,动态链接库加载程序 (/lib/ld-linux.so.2) 搜索 /lib 和 /usr/lib 目录来寻找程序运行时需要使用的动态连接库。 但是, 如果某些库在这两个目录之外, 你就需要把它们的路径加到 /etc/ld.so.conf 文件里,以便动态链接库加载程序能够找到它们。 /usr/local/lib 和 /opt/lib 是两个经常包含动态连接库但又不在默认目录中的目录, 我们要把它们添加到动态链接库加载程序的搜索路径中。
root:/sources/glibc-build# cat > /etc/ld.so.conf << "EOF"
> # Begin /etc/ld.so.conf
> /usr/local/lib
> /opt/lib
> # End /etc/ld.so.conf
> EOF
现在,最终的 Glibc库已经安装好了,我们需要再次调整工具链,让随后编译的那些工具都连接到这个库上。上一次调整工具链的时候,我们从宿主系统的 /{,usr/}lib 转向新安装的/tools/lib 目录。现在,我们把工具链使用的库将从临时的 /tools/lib 转向 LFS 系统最终的 /{,usr/}lib 目录。调整的过程和之前是类似的。
root:~# mv -v /tools/bin/{ld,ld-old}
root:~# mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
root:~# mv -v /tools/bin/{ld-new,ld}
root:~# ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld
root:~# gcc -dumpspecs | sed -e 's@/tools/lib/ld-linux.so.2@/lib/ld-linux.so.2@g' -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > `dirname $(gcc --print-libgcc-file-name)`/specs
首先,进行备份后替换掉原来的连接器。然后修改 gcc 的 specs 文件,只需要把其中 /tools 的内容删除掉,就会自动指向正确的路径了。下面我们对调整进行检查,首先可以尝试用 vi 打开 `dirname $(gcc --print-libgcc-file-name)`/specs 文件,搜索是否还有 /tools 存在。然后我们编译程序来检验:
root:~# echo 'main(){}' > dummy.c
root:~# cc dummy.c -v -Wl,--verbose &> dummy.log
root:~# readelf -l a.out | grep ': /lib'
[Requesting program interpreter: /lib/ld-linux.so.2]
root:~# grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded
root:~# grep -B1 '^ /usr/include' dummy.log
#include <...> search starts here:
/usr/include
root:~# grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
SEARCH_DIR("/tools/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");
root:~# grep "/lib/libc.so.6 " dummy.log
attempt to open /lib/libc.so.6 succeeded
root:~# grep found dummy.log
found ld-linux.so.2 at /lib/ld-linux.so.2
root:~# rm -v dummy.c a.out dummy.log
removed `dummy.c'
removed `a.out'
removed `dummy.log'
确保你看到的输出和上面一致或类似,尤其注意前缀应该是 /lib,/usr这样的,除了 SEARCH_DIR("/tools/i686-pc-linux-gnu/lib") 外不应该再包含 /tools 了。
如果你的输出不正常,在继续之前必须检查之前的步骤,确保输出正常。
首先安装 Binutils
root:~# cat > install_binutils.sh << "EOF"
> cd /sources
> rm -r binutils-build
> rm -r binutils-2.17
> tar xvf binutils-2.17.tar.bz2
> cd binutils-2.17
> mkdir -v ../binutils-build
> cd ../binutils-build
> ../binutils-2.17/configure --prefix=/usr --enable-shared
> make tooldir=/usr
> make check
> make tooldir=/usr install
> cp -v ../binutils-2.17/include/libiberty.h /usr/include
> echo -e "\aFinished!"
> EOF
root:~# source install_binutils.sh
然后是 gcc
root:~# cat > install_gcc.sh << "EOF"
> cd /sources
> rm -r gcc-build
> rm -r gcc-4.1.2
> tar xvf gcc-4.1.2.tar.bz2
> cd gcc-4.1.2
> sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
> sed -i 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in
> sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
> sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in
> mkdir -v ../gcc-build
> cd ../gcc-build
> ../gcc-4.1.2/configure --prefix=/usr --libexecdir=/usr/lib --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-languages=c,c++
> make
> make -k check
> make install
> ln -sv ../usr/bin/cpp /lib
> ln -sv gcc /usr/bin/cc
> echo -e "\aFinished!"
> EOF
root:~# source install_gcc.sh
其中 sed 的作用分别是:
1. 禁止安装 libiberty.a,我们使用 Binutils 中的那一份;安装完成后可以使用
root:/sources/gcc-build# ../gcc-4.1.2/contrib/test_summary
root:/sources/gcc-build# ../gcc-4.1.2/contrib/test_summary | grep -A7 Summ
命令来查看测试结果和摘要。
最后,我们还要做一次和调整完工具链之后相似的验证,如果以下命令输出有不一致的地方,就需要检查前面的步骤了:
root:~# echo 'main(){}' > dummy.c
root:~# cc dummy.c -v -Wl,--verbose &> dummy.log
root:~# readelf -l a.out | grep ': /lib'
[Requesting program interpreter: /lib/ld-linux.so.2]
root:~# grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crt1.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crti.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crtn.o succeeded
root:~# grep -B3 '^ /usr/include' dummy.log
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include
/usr/include
root:~# grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
root:~# grep "/lib/libc.so.6 " dummy.log
attempt to open /lib/libc.so.6 succeeded
root:~# grep found dummy.log
found ld-linux.so.2 at /lib/ld-linux.so.2
root:~# rm dummy.c a.out dummy.log
到此我们最终的编译环境就已经搭建好了,现在我们开始编译和安装软件包。和之前一样,为了简便,我们把这些软件包的安装命令都放在脚本里面,可以一次完成所有安装,也可以分别进行安装。我们要安装的软件包括:
安装这些软件包的脚本由于太长,就不详细列出来了,可以通过如下方式从网络获取来进行安装:
root:~# cd
root:~# wget http://www.adintr.com/down/lfs/install_tools.tar.gz
root:~# tar xvf install_tools.tar.gz
root:~# source install_tools/install_all.sh
如果当前系统中找不到 wget 命令,可以先 exit 退回 LiveCD 的系统,下载好文件后再运行之前创建的 ./chsys.sh 来进入 LFS 的系统。
上一章 | 回目录 | 下一章 |
最后一部,退回 退回 LiveCD 的系统下载好了install_tools.tar.gz ,但运行./chsys.sh 进来后,找不到这个包了.....怎么办?
找到原因了,这个install_tools.tar.gz要从/root目录下,复制到/mnt/lfs/source目录下就好.
终极版:
1.在LiveCD系统(寄主系统)里面要把下好的包,移动到/mnt/lfs/root里面,这样LFS系统的/root目录里才能看到这个下好的包(sh的脚本,安装路径都指向这里).
2. tar -zxvf install_tools.tar.gz
3. cd install_tools
4. source install_all.sh