进入菜谱第7章了
修改文件归属
exit 退出到root用户
lfs:/mnt/lfs/sources$ exit
exit
[root@ecs-341537 ~]#
chown -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools}
case $(uname -m) in
x86_64) chown -R root:root $LFS/lib64 ;;
esac
准备虚拟内核文件系统
创建目录
[root@ecs-341537 lfs]# mkdir -pv $LFS/{dev,proc,sys,run}
mkdir: 已创建目录 "/mnt/lfs/dev"
mkdir: 已创建目录 "/mnt/lfs/proc"
mkdir: 已创建目录 "/mnt/lfs/sys"
mkdir: 已创建目录 "/mnt/lfs/run"
设备节点
[root@ecs-341537 lfs]# mknod -m 600 $LFS/dev/console c 5 1
[root@ecs-341537 lfs]# mknod -m 666 $LFS/dev/null c 1 3
挂载
[root@ecs-341537 lfs]# mount -v --bind /dev $LFS/dev
mount:/dev 已绑定到 /mnt/lfs/dev 。
[root@ecs-341537 lfs]# mount -v --bind /dev/pts $LFS/dev/pts
mount:/dev/pts 已绑定到 /mnt/lfs/dev/pts 。
[root@ecs-341537 lfs]# mount -vt proc proc $LFS/proc
mount:proc 已挂臷到 /mnt/lfs/proc。
[root@ecs-341537 lfs]# mount -vt sysfs sysfs $LFS/sys
mount:sysfs 已挂臷到 /mnt/lfs/sys。
[root@ecs-341537 lfs]# mount -vt tmpfs tmpfs $LFS/run
mount:tmpfs 已挂臷到 /mnt/lfs/run。
if [ -h $LFS/dev/shm ]; then
mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi
进入chroot环境
chroot "$LFS" /usr/bin/env -i \
HOME=/root \
TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/usr/bin:/usr/sbin \
/bin/bash --login
创建文件夹
mkdir -pv /{boot,home,mnt,opt,srv}
(lfs chroot) I have no name!:/# ls
bin dev home lib64 mnt proc sbin srv tools var
boot etc lib lost+found opt run sources sys usr
mkdir -pv /etc/{opt,sysconfig}
mkdir -pv /lib/firmware
mkdir -pv /media/{floppy,cdrom}
mkdir -pv /usr/{,local/}{include,src}
mkdir -pv /usr/local/{bin,lib,sbin}
mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv /usr/{,local/}share/man/man{1..8}
mkdir -pv /var/{cache,local,log,mail,opt,spool}
mkdir -pv /var/lib/{color,misc,locate}
ln -sfv /run /var/run
ln -sfv /run/lock /var/lock
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
ln -sv /proc/self/mounts /etc/mtab
cat > /etc/hosts << EOF
127.0.0.1 localhost $(hostname)
::1 localhost
EOF
cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/usr/bin/false
daemon:x:6:6:Daemon User:/dev/null:/usr/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/run/dbus:/usr/bin/false
uuidd:x:80:80:UUID Generation Daemon User:/dev/null:/usr/bin/false
nobody:x:99:99:Unprivileged User:/dev/null:/usr/bin/false
EOF
cat > /etc/group << "EOF"
root:x:0:
bin:x:1:daemon
sys:x:2:
kmem:x:3:
tape:x:4:
tty: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:
adm:x:16:
messagebus:x:18:
input:x:24:
mail:x:34:
kvm:x:61:
uuidd:x:80:
wheel:x:97:
nogroup:x:99:
users:x:999:
EOF
测试用的账号
echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd
echo "tester:x:101:" >> /etc/group
install -o tester -d /home/tester
(lfs chroot) I have no name!:/# exec /usr/bin/bash --login
(lfs chroot) root:/#
touch /var/log/{btmp,lastlog,faillog,wtmp}
chgrp -v utmp /var/log/lastlog
chmod -v 664 /var/log/lastlog
chmod -v 600 /var/log/btmp
Libstdc++
(lfs chroot) root:/# cd /sources/
(lfs chroot) root:/sources# tar -xf gcc-11.2.0.tar.xz
(lfs chroot) root:/sources# cd gcc-11.2.0
(lfs chroot) root:/sources/gcc-11.2.0# ln -s gthr-posix.h libgcc/gthr-default.h
(lfs
mkdir -v build
cd build
../libstdc++-v3/configure \
CXXFLAGS="-g -O2 -D_GNU_SOURCE" \
--prefix=/usr \
--disable-multilib \
--disable-nls \
--host=$(uname -m)-lfs-linux-gnu \
--disable-libstdcxx-pch
make && make install
(lfs chroot) root:/sources# rm -rf gcc-11.2.0
Gettext
这个也有点大,要等一会儿
(lfs chroot) root:/sources# tar -xf gettext-0.21.tar.xz
(lfs chroot) root:/sources# cd gettext-0.21
(lfs chroot) root:/sources/gettext-0.21#
make
(lfs chroot) root:/sources/gettext-0.21# cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin
'gettext-tools/src/msgfmt' -> '/usr/bin/msgfmt'
'gettext-tools/src/msgmerge' -> '/usr/bin/msgmerge'
'gettext-tools/src/xgettext' -> '/usr/bin/xgettext'
Bison
(lfs chroot) root:/sources# tar -xf bison-3.8.2.tar.xz
(lfs chroot) root:/sources# cd bison-3.8.2
./configure --prefix=/usr \
--docdir=/usr/share/doc/bison-3.8.2
这里在编译前检查环境的时候,报错说我的m4版本不对
checking for dmd... no
checking for -g... no
checking for Java compiler... no
checking for Java virtual machine... no
checking for flex... no
checking for lex... no
configure: WARNING: bypassing lex because flex is required
checking for bison... no
checking for byacc... no
checking for ranlib... (cached) ranlib
checking for GNU M4 that supports accurate traces... configure: error: no acceptable m4 could be found in $PATH.
GNU M4 1.4.6 or later is required; 1.4.16 or newer is recommended.
GNU M4 1.4.15 uses a buggy replacement strstr on some systems.
Glibc 2.9 - 2.12 and GNU M4 1.4.11 - 1.4.15 have another strstr bug.
尝试去path里看看M4存不存在
(lfs chroot) root:/bin# echo $PATH
/usr/bin:/usr/sbin
(lfs chroot) root:/bin# cd /usr/bin
(lfs chroot) root:/usr/bin# ls | grep m4
m4
(lfs chroot) root:/usr/bin# m4 --version
m4: memory exhausted
尝试了各种方法都卡在这儿了,然后我又倒回去重新把整个系统装了一遍,就好了。。。 也不知道为啥
make && make install
Perl
(lfs chroot) root:/sources/perl-5.34.0# tar -xf perl-5.34.0.tar.xz
(lfs chroot) root:/sources/perl-5.34.0# cd perl-5.34.0
sh Configure -des \
-Dprefix=/usr \
-Dvendorprefix=/usr \
-Dprivlib=/usr/lib/perl5/5.34/core_perl \
-Darchlib=/usr/lib/perl5/5.34/core_perl \
-Dsitelib=/usr/lib/perl5/5.34/site_perl \
-Dsitearch=/usr/lib/perl5/5.34/site_perl \
-Dvendorlib=/usr/lib/perl5/5.34/vendor_perl \
-Dvendorarch=/usr/lib/perl5/5.34/vendor_perl
make
make install
Python
注意这里的大小写
(lfs chroot) root:/sources# tar -xf Python-3.10.2.tar.xz
./configure --prefix=/usr \
--enable-shared \
--without-ensurepip
make
make install
这里会有一些module报错,但是可以忽略
texinfo
(lfs chroot) root:/sources# tar -xf texinfo-6.8.tar.xz
(lfs chroot) root:/sources# cd texinfo-6.8
sed -e 's/__attribute_nonnull__/__nonnull/' \
-i gnulib/lib/malloc/dynarray-skeleton.c
./configure --prefix=/usr
make
make install
util-linux
(lfs chroot) root:/sources# tar -xf util-linux-2.37.4.tar.xz
(lfs chroot) root:/sources# cd util-linux-2.37.4
mkdir -pv /var/lib/hwclock
./configure ADJTIME_PATH=/var/lib/hwclock/adjtime \
--libdir=/usr/lib \
--docdir=/usr/share/doc/util-linux-2.37.4 \
--disable-chfn-chsh \
--disable-login \
--disable-nologin \
--disable-su \
--disable-setpriv \
--disable-runuser \
--disable-pylibmount \
--disable-static \
--without-python \
runstatedir=/run
make
make install
清理
(lfs chroot) root:/sources/util-linux-2.37.4# rm -rf /usr/share/{info,man,doc}/*
(lfs chroot) root:/sources/util-linux-2.37.4# find /usr/{lib,libexec} -name \*.la -delete
(lfs chroot) root:/# rm -rf /tools
退出chroot, 检查环境变量,备份
exit
(lfs chroot) root:/# exit
logout
[root@ecs-341537 build]# echo $LFS
/mnt/lfs
umount $LFS/dev/pts
umount $LFS/{sys,proc,run,dev}
这个过程比较慢
cd $LFS
tar -cJpf $HOME/lfs-temp-tools-11.1.tar.xz .
备份好了
[root@ecs-341537 lfs]# cd $HOME
[root@ecs-341537 ~]# ls
lfs-temp-tools-11.1.tar.xz version-check.sh
重新进入chroot前要挂载
mount -v --bind /dev $LFS/dev
mount -v --bind /dev/pts $LFS/dev/pts
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run
if [ -h $LFS/dev/shm ]; then
mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi
chroot "$LFS" /usr/bin/env -i \
HOME=/root \
TERM="$TERM" \
PS1='(lfs chroot) \u:\w$ ' \
PATH=/usr/bin:/usr/sbin \
/bin/bash --login