首先是环境
Windows 8.1 下的Vmware Workstation Pro 14 母系统是差不多新装的 Debian9.5 一块 20 GB 的虚拟硬盘,母系统,内存 12GB 处理器 4 x 2.7 GHz UEFI grub2 引导
检查一下依赖环境
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复制代码
然后根据情况补全依赖
默认你应该装好以下开发所需的包
sudo apt install build-essential texinfo m4 gawk bison 复制代码
/bin/sh 指向 dash 而不是 bash
sudo ln -s bash /bin/sh -f
复制代码
检查库一致性
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复制代码
要么都没有,要么都得有,我这里是都有
下载
自动化脚本 jhalfs 下载地址
LFS8.0 的软件包 下载地址 (不太确定官方给的是不是全的,上次8.2的就缺个包)
下载 LFS8.0 的书,需要用到 svn ,会下载到当前目录下的 8.0 文件夹中
(没有 svn 的需要安装 subversion )
sudo apt install subversion复制代码
下载
svn co svn://svn.linuxfromscratch.org/LFS/tags/8.0
复制代码
进入 8.0 文件夹,修改packages.ent文件中lfs-bootscripts-20150222.tar.bz2的md5值
7ee67b16b345b43cd34ed481792169ed 是错误的
修改为:3cb3d36089f2d6ab19c7c0f3282de1c5
复制代码
准备目录与配置
创建目录
sudo mkdir /mnt/lfs
复制代码
($LFS变量不需要设置的)
以 root 账户创建 jhalfs 账户
groupadd jhalfs
useradd -s /bin/bash -g jhalfs -m -k /dev/null jhalfs
复制代码
以 root 账户设置密码,密码为 jhalfs
passwd jhalfs
复制代码
以 root 账户编辑 /etc/sudoers
nano /etc/sudoers复制代码
添加 jhalfs ALL=(ALL:ALL) ALL
解压 jhalfs 脚本
tar xf jhalfs-2.4.tar.xz
复制代码
配置脚本
cd jhalfs-2.4
make
复制代码
如出现Unable to find the ncurses libraries 报错,则需要安装 libncurses5-dev
sudo apt install libncurses5-dev
复制代码
重新配置脚本
make clean
make复制代码
配置主要就是
书的目录
LFS 编译的目录
时区设为 Asia/Shanghai
选中 Installthe full set of locales
其它基本上都可以默认,内核和fstab什么的都靠后续手动配置咯
退出,保存,报错,需要安装 xsltproc
sudo apt install xsltproc
复制代码
重新 make ,load 刚才保存的配置,退出,输入 yes 确认配置
然后发现设置的 LFS 编译目录里有个 sources 文件夹,把 LFS 的软件包解压进去
开始自动编译
开始自动编译
进入jhalfs用户
sudo su jhalfs
复制代码
编译(我设置的编译目录是 /mnt/lfs )
cd /mnt/lfs
make -C /mnt/lfs/jhalfs
复制代码
然后开始编译
到这里开始发现,似乎脚本需要密码,所以去修改 /etc/sudoers
把 jhalfs ALL=(ALL:ALL) ALL 修改为 jhalfs ALL=(ALL)NOPASSWD:ALL
然后让它编译着,慢慢等,希望不出问题。
好了,终端出现如下提示,没有出错
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Finished the build of 8.0
--------------------------------------------------------------------------------
W A R N I N G
--------------------------------------------------------------------------------
To be able to boot your new system you need to follow
the next steps:
- Mount the virtual kernel file systems.
- Enter to the chroot using the command found
in the section -Entering the Chroot Environment-
except if building CLFS with METHOD=boot.
- Set a password for the root user.
- Edit or create /etc/fstab,
/etc/hosts,
/etc/sysconfig/clock,
/etc/sysconfig/console,
/etc/sysconfig/network,
/etc/sysconfig/ifconfig.eth0,
/etc/resolv.conf
and any other configuration file required to suit your needs.
- Set-up the boot loader, except if building CLFS with METHOD=boot.
You can set-up the new boot-loader installed on the new system
or the host bootloader.
If the last, it is better to exit first from the chroot.
- Exit from the chroot and umount the filesystems.
If you are an experienced LFS user, several of those steps can be
skipped or done in a different way. But then, that is something
that you already know and there is no need to discuss it here.
--------------------------------------------------------------------------------
Have a nice day :-)
--------------------------------------------------------------------------------
make: Leaving directory '/mnt/lfs/jhalfs'
复制代码
后续
编译完成后需要把编译好的系统文件复制到新的系统分区里
除此之外,还可以令复制一份做备份,免得以后再编译,毕竟编译一次要等老久
cd 编译目录
cp -r bin 新分区
cp -r dev 新分区
cp -r etc 新分区
cp -r lib 新分区
cp -r lib64 新分区
cp -r media 新分区
cp -r mnt 新分区
cp -r opt 新分区
cp -r proc 新分区
cp -r tmp 新分区
cp -r root 新分区
cp -r run 新分区
cp -r sbin 新分区
cp -r srv 新分区
cp -r sys 新分区
cp -r usr 新分区
cp -r var 新分区
复制代码
进入新分区目录
cd 新分区目录复制代码
挂载和激活/dev
sudo mount -v --bind /dev ./dev
复制代码
挂载虚拟文件系统
sudo mount -vt devpts devpts ./dev/pts -ogid=5,mode=620
sudo mount -vt proc proc ./proc
sudo mount -vt sysfs sysfs ./sys
sudo mount -vt tmpfs tmpfs ./run
复制代码
chroot 到新分区
chroot ./ /usr/bin/env -i \
HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/bin/bash --login
复制代码
然后发现不能改密码,我都没输入密码,就这么莫名其妙地显示了
root:/# passwd root
正在为 root 修改密码
请输入新密码(最少 5 个字符)
请混合使用大小写字母和数字。
错误的密码:太短。
警告:脆弱的密码(重新输入以强制使用它)。
passwd:密码已更改
按照大神(冷清你可以表这么称呼我嘛 /斜眼笑)的说法,是 shadow 的问题,按照8.2的书重编译就好了(本来是8.0的,但是8.0的可能是灵异问题)
可以直接复制下面的命令,也可以去官网看,地址
sed -i 's/groups$(EXEEXT) //' src/Makefile.in
find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \;
find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \;
find man -name Makefile.in -exec sed -i 's/passwd\.5 / /' {} \;
sed -i -e 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD SHA512@' \
-e 's@/var/spool/mail@/var/mail@' etc/login.defs
sed -i 's/1000/999/' etc/useradd
./configure --sysconfdir=/etc --with-group-name-max-length=32
make
make install
mv -v /usr/bin/passwd /bin
pwconv
grpconv
复制代码
然后就可以愉快地改密码了
root:~# passwd root
正在为 root 修改密码
请输入新密码(最少 5 个字符)
请混合使用大小写字母和数字。
新密码:
请重新输入新密码:
passwd:密码已更改。
然后人懒,内核也不编译了,直接拿 Debian 的 grub 和内核复制过来到 /boot 目录
复制 Debian 的 fstab 文件
其中,grub 与 fstab 对应的 UUID需要改掉,下面的命令查看磁盘 UUID
ls -l /dev/disk/by-uuid
vi /etc/fstab
vi /boot/grub/grub.cfg复制代码
这样,我们就有了 Debian 的内核和引导
设置主机名
echo "LFS" > /etc/hostname
复制代码
启动
现在母系统就可以关机了
因为是直接复制的 Debian 的引导,所以可能分不清硬盘
要把 LFS 所在的硬盘挪出来,用这块硬盘新建一个虚拟机,配置与母系统一样就行了,主要是要UEFI引导
最后,启动失败。GG思密达(gurb很致命,暂时找不到解决办法)
转载自 https://www.lengqing.org/archives/37/{lengqingzhuangbikuang_hhh~}
(눈_눈)