文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>10.构建LFS系统──安装系统基础软件(二)

10.构建LFS系统──安装系统基础软件(二)

时间:2006-11-17  来源:anima

十、构建LFS系统──安装系统基础软件(二)


4.进入Chroot环境


现在将要进入 chroot 环境开始编译安装最终的 LFS 系统了,注意:在这里我们只使用临时构建的工具。以 root 身份运行以下命令进入构建环境:

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

env 命令的参数 -i 的作用是清除所有 chroot 环境变量。后面是重新设定 HOME, TERM, PS1, PATH 等变量的值。TERM=$TERM 设定虚拟根环境中的 TERM 的值与 chroot 外面的一样。这个值是让像 vim 和 less 之类的程序可以正确操作。如果还需要重新设置其它的值,如 CFLAGS 或 CXXFLAGS ,这里是个不错的位置。

从这里开始,不再需要 LFS 环境变量了,因为所有的工作都被限制在 LFS 文件系统里面。这是由于已经告诉了 Bash shell $LFS 是现在的根目录(/)。

注意,这里 /tools/bin 位于 PATH 的最后面。也就是说当软件包的最终版本安装之后就不再使用临时工具了。为了使 shell 无法"记住"可执行二进制代码的位置,需要通过使用 +h 参数关闭 bash 的散列功能。

注意此时 bash 提示符会显示:I have no name! 这是正常的,因为 /etc/passwd 还没有创建。


[root@fish ~]# /usr/sbin/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

I have no name!:/#



注意

这一章剩下的命令以及后面几章的命令都是在chroot环境下进行的。如果你离开了这个环境(比如重启), 要确保内核虚拟文件系统挂载,像在“挂载并填充 /dev 目录”和“挂载虚拟内核文件系统”描述的。在继续安装之前,再次进入chroot环境。









5.创建系统目录结构


现在我们在 LFS 分区中创建目录树结构,用下列命令能创建一个标准的目录树:

mkdir -pv /{bin,boot,etc/opt,home,lib,mnt,opt}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{doc,info,locale,man}
mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv /usr/{,local/}share/man/man{1..8}
for dir in /usr /usr/local; do
ln -sv share/{man,doc,info} $dir
done
mkdir -v /var/{lock,log,mail,run,spool}
mkdir -pv /var/{opt,cache,lib/{misc,locate},local}

缺省的目录的权限模式为 755,但也并非所有的目录都如此。以上的命令有两处有所不一样:一个是 root 用户的目录,另外两个是临时文件目录。

第 一个权限模式的不同之处是确保禁止任何人进入到 /root 目录中——同样的,这个模式也适用于让其它的普通用户可以工作在自己的目录中。第二个权限模式的不同之处是确保所有用户都可以写 /tmp 和 /var/tmp 目录,但不能从中删除其它用户的文件,这是由"sticky位",也就是"1777"中的"1"来设定的。



I have no name!:/# mkdir -pv /{bin,boot,etc/opt,home,lib,mnt,opt}

mkdir: created directory `/bin'

mkdir: created directory `/boot'

mkdir: created directory `/etc'

mkdir: created directory `/etc/opt'

mkdir: created directory `/home'

mkdir: created directory `/lib'

mkdir: created directory `/mnt'

mkdir: created directory `/opt'

I have no name!:/# mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}

mkdir: created directory `/media'

mkdir: created directory `/media/floppy'

mkdir: created directory `/media/cdrom'

mkdir: created directory `/sbin'

mkdir: created directory `/srv'

mkdir: created directory `/var'

I have no name!:/# install -dv -m 0750 /root

install: creating directory `/root'

I have no name!:/# install -dv -m 1777 /tmp /var/tmp

install: creating directory `/tmp'

install: creating directory `/var/tmp'

I have no name!:/# mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}

mkdir: created directory `/usr'

mkdir: created directory `/usr/bin'

mkdir: created directory `/usr/include'

mkdir: created directory `/usr/lib'

mkdir: created directory `/usr/sbin'

mkdir: created directory `/usr/src'

mkdir: created directory `/usr/local'

mkdir: created directory `/usr/local/bin'

mkdir: created directory `/usr/local/include'

mkdir: created directory `/usr/local/lib'

mkdir: created directory `/usr/local/sbin'

mkdir: created directory `/usr/local/src'

I have no name!:/# mkdir -pv /usr/{,local/}share/{doc,info,locale,man}

mkdir: created directory `/usr/share'

mkdir: created directory `/usr/share/doc'

mkdir: created directory `/usr/share/info'

mkdir: created directory `/usr/share/locale'

mkdir: created directory `/usr/share/man'

mkdir: created directory `/usr/local/share'

mkdir: created directory `/usr/local/share/doc'

mkdir: created directory `/usr/local/share/info'

mkdir: created directory `/usr/local/share/locale'

mkdir: created directory `/usr/local/share/man'

I have no name!:/# mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo}

mkdir: created directory `/usr/share/misc'

mkdir: created directory `/usr/share/terminfo'

mkdir: created directory `/usr/share/zoneinfo'

mkdir: created directory `/usr/local/share/misc'

mkdir: created directory `/usr/local/share/terminfo'

mkdir: created directory `/usr/local/share/zoneinfo'

I have no name!:/# mkdir -pv /usr/{,local/}share/man/man{1..8}

mkdir: created directory `/usr/share/man/man1'

mkdir: created directory `/usr/share/man/man2'

mkdir: created directory `/usr/share/man/man3'

mkdir: created directory `/usr/share/man/man4'

mkdir: created directory `/usr/share/man/man5'

mkdir: created directory `/usr/share/man/man6'

mkdir: created directory `/usr/share/man/man7'

mkdir: created directory `/usr/share/man/man8'

mkdir: created directory `/usr/local/share/man/man1'

mkdir: created directory `/usr/local/share/man/man2'

mkdir: created directory `/usr/local/share/man/man3'

mkdir: created directory `/usr/local/share/man/man4'

mkdir: created directory `/usr/local/share/man/man5'

mkdir: created directory `/usr/local/share/man/man6'

mkdir: created directory `/usr/local/share/man/man7'

mkdir: created directory `/usr/local/share/man/man8'

I have no name!:/# for dir in /usr /usr/local; do

> ln -sv share/{man,doc,info} $dir

> done

create symbolic link `/usr/man' to `share/man'

create symbolic link `/usr/doc' to `share/doc'

create symbolic link `/usr/info' to `share/info'

create symbolic link `/usr/local/man' to `share/man'

create symbolic link `/usr/local/doc' to `share/doc'

create symbolic link `/usr/local/info' to `share/info'

I have no name!:/# mkdir -v /var/{lock,log,mail,run,spool}

mkdir: created directory `/var/lock'

mkdir: created directory `/var/log'

mkdir: created directory `/var/mail'

mkdir: created directory `/var/run'

mkdir: created directory `/var/spool'

I have no name!:/# mkdir -pv /var/{opt,cache,lib/{misc,locate},local}

mkdir: created directory `/var/opt'

mkdir: created directory `/var/cache'

mkdir: created directory `/var/lib'

mkdir: created directory `/var/lib/misc'

mkdir: created directory `/var/lib/locate'

mkdir: created directory `/var/local'

I have no name!:/#




FHS兼容性说明

我们的目录树是按照 FHS(Filesystem Hierarchy Standard) 标准(http://www.pathname.com/fhs/)。 除了上面创建的目录外,该标准还规定了必须有 /usr/local/games 和 /usr/share/games 两个目录,但是作为一个基本系统,我们并不需要这些。如果你要完全的遵守 FHS 标准的话,就自己建立这两个目录。至于 /usr/local/share 目录下的子目录,FHS 标准规定得并不严格,所以我们就创建了(在我们看来)需要的子目录。









6.创建必需的文件和符号链接


一些程序使用固化的路径(hard-wired paths)指向一些目前还不存在的程序上。为了兼容这些程序,可以创建一些符号链接,然后在软件安装之后用实际文件进行替代。

ln -sv /tools/bin/{bash,cat,grep,pwd,stty} /bin
ln -sv /tools/bin/perl /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv bash /bin/sh


I have no name!:/# ln -sv /tools/bin/{bash,cat,grep,pwd,stty} /bin

create symbolic link `/bin/bash' to `/tools/bin/bash'

create symbolic link `/bin/cat' to `/tools/bin/cat'

create symbolic link `/bin/grep' to `/tools/bin/grep'

create symbolic link `/bin/pwd' to `/tools/bin/pwd'

create symbolic link `/bin/stty' to `/tools/bin/stty'

I have no name!:/# ln -sv /tools/bin/perl /usr/bin

create symbolic link `/usr/bin/perl' to `/tools/bin/perl'

I have no name!:/# ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib

create symbolic link `/usr/lib/libgcc_s.so' to `/tools/lib/libgcc_s.so'

create symbolic link `/usr/lib/libgcc_s.so.1' to `/tools/lib/libgcc_s.so.1'

I have no name!:/# ln -sv bash /bin/sh

create symbolic link `/bin/sh' to `bash'

I have no name!:/#





一个常规的Linux系统在/etc/mtab中有一个已挂载文件系统的列表。 正常情况下,这个文件在我们挂载一个新的文件系统的时候会被创建。因为我们在chroot环境下不会再挂载任何文件系统 ,所以我们需要为那些用到/etc/mtab的程序创建一个空文件:


I have no name!:/# touch /etc/mtab




为了让 root 用户可以登录而且用户名"root"可以被识别,在这里需要创建相应的 /etc/passwd 和 /etc/group 文件。

使用下面的命令创建 /etc/passwd 文件:

cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
EOF

root 的真正密码将在后面设置("x"在这里只是一个占位符)。


I have no name!:/# cat > /etc/passwd << "EOF"

> root:x:0:0:root:/root:/bin/bash

> EOF

I have no name!:/# cat /etc/passwd

root:x:0:0:root:/root:/bin/bash

I have no name!:/#






下面的命令创建 /etc/group 文件:

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:
EOF

这里创建的用户组并不是某个标准所要求的部分,只是因为在随后 Udev 配置将要用到而以。Linux 标准基础(LSB, Linux Standard Base, http://www.linuxbase.org) 只是推荐"root"组的 GID 为 0,另一个组"bin"的 GID 为 1 。其它所有的组名和 GID 均由系统管理员自由设定,因为比较好的软件包一般都不依赖于 GID ,而只是使用组名。



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:

> EOF

I have no name!:/# cat /etc/group

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:

I have no name!:/#




因为完整的 Glibc 在“构建临时编译环境”中已经安装,而且 /etc/passwd 和 /etc/group 文件也已创建,用户名和组名现在可以开始使用了。现在启动新的shell,驱除"I have no name!"提示符:


I have no name!:/# exec /tools/bin/bash --login +h

root:/#



注意这里使用了 +h 参数。这是告诉 bash 不能使用其内部哈希表查找路径。如果没有使用这个参数,则 bash 将会记住已经执行的二进制代码的路径。为了让新编译安装的二进制代码可以马上投入使用,在这一章中,我们使用 +h 关闭了此功能。

程序 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--)

root:/#



/var/run/utmp 记录着现在登录的用户。

/var/log/wtmp 记录所有的登录和退出。

/var/log/lastlog 记录每个用户最后的登录信息。

/var/log/btmp 记录错误的登录尝试。











7.Linux-Libc-Headers-2.6.12.0

Linux-Libc-Headers 包含"纯净的"内核头文件。

预计编译时间: 少于 0.1 SBU

所需磁盘空间: 27 MB



安装Linux-Libc-Headers

多年来,通常的做法是直接从内核源代码中复制出"原始"内核头文件,放在 /usr/include 中使用。但是最近几年,内核开发人员强烈要求停止这种做法。因此诞生了 Linux-Libc-Headers 项目,其目的就是维护一个 API 版本稳定的内核头文件。

(在chroot环境,$LFS即是Chroot环境的/。)



root:/# mv $LFS/sources/linux-libc-headers-2.6.12.0 $LFS/sources/old

root:/# tar -jxvf $LFS/sources/linux-libc-headers-2.6.12.0.tar.bz2 -C $LFS/sources

root:/# cd $LFS/sources/linux-libc-headers-2.6.12.0



添加一个用户空间头文件和新内核对于inotify特性的系统调用支持:



root:/sources/linux-libc-headers-2.6.12.0# patch -Np1 -i ../linux-libc-headers-2.6.12.0-inotify-3.patch

patching file include/asm-i386/unistd.h

patching file include/asm-ppc/unistd.h

patching file include/linux/inotify.h

root:/sources/linux-libc-headers-2.6.12.0#





安装内核头文件:



root:/sources/linux-libc-headers-2.6.12.0# install -dv /usr/include/asm

install: creating directory `/usr/include/asm'

root:/sources/linux-libc-headers-2.6.12.0# cp -Rv include/asm-i386/* /usr/include/asm

root:/sources/linux-libc-headers-2.6.12.0# cp -Rv include/linux /usr/include





确保这些头文件的所有者是 root :



root:/sources/linux-libc-headers-2.6.12.0# chown -Rv root:root /usr/include/{asm,linux}



确保用户可以读取这些头文件:



root:/sources/linux-libc-headers-2.6.12.0# find /usr/include/{asm,linux} -type d -exec chmod -v 755 {} \;

mode of `/usr/include/asm' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/asm/mach-bigsmp' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/asm/mach-default' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/asm/mach-es7000' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/asm/mach-generic' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/asm/mach-numaq' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/asm/mach-summit' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/asm/mach-visws' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/asm/mach-voyager' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/linux' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/linux/byteorder' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/linux/dvb' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/linux/hdlc' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/linux/isdn' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/linux/lockd' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/linux/mtd' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/linux/netfilter_arp' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/linux/netfilter_bridge' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/linux/netfilter_ipv4' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/linux/netfilter_ipv6' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/linux/nfsd' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/linux/raid' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/linux/sunrpc' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/linux/tc_act' retained as 0755 (rwxr-xr-x)

mode of `/usr/include/linux/tc_ematch' retained as 0755 (rwxr-xr-x)

root:/sources/linux-libc-headers-2.6.12.0# find /usr/include/{asm,linux} -type f -exec chmod -v 644 {} \;



Linux-Libc-Headers 的内容

安装的头文件: /usr/include/{asm,linux}/*.h

简要描述

/usr/include/{asm,linux}/*.h

内核头文件 API











8.Man-pages-2.34

Man-pages 包含 1200 页的用户手册。

预计编译时间: 少于 0.1 SBU

所需磁盘空间: 18.4 MB



安装Man-pages

root:/sources/linux-libc-headers-2.6.12.0# tar -jxvf $LFS/sources/man-pages-2.34.tar.bz2 -C $LFS/sources

root:/sources/linux-libc-headers-2.6.12.0# cd $LFS/sources/man-pages-2.34



使用下述命令安装 Man-pages :



root:/sources/man-pages-2.34# make install



Man-pages 的内容

安装的文件: 一些用户手册文件

简要描述

man pages

描述了 C 和 C++ 的函数、重要的设备文件、以及一些重要的配置文件。












相关阅读 更多 +
排行榜 更多 +
激萌手账

激萌手账

游戏工具 下载
躺平不要慌

躺平不要慌

音乐节奏 下载
嗨自拍修图

嗨自拍修图

图像拍照 下载