自动化的 LFS : ALFS

本来是做 LFS8.2 的,但是时间有限啊,所以上ALFS。 中途遇到的坑可不比LFS的少。

首先是环境

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~}

(눈_눈)


转载于:https://juejin.im/post/5b65101df265da0f9a2d06b9

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值