|
LFS是Linux From Scratch 的简称(中文:拼凑的Linux),它是从源代码开始编译的一个真实可用的Linux,它是学习linux的利器,特别适合从Windows转到Linux上程序开发人员。它最早由Gerard Beekmans发起的。官方网址:http://www.linuxfromscratch.org/,9月18号发布了稳定版本是:6.7。有一个在线的LFS6.6的中文文档地址:“http://www.tztsg.com/lfs/index.html”。如果你认为LFS是一个发行版本那就大错特错。它不提供软件,所有的软件都需要你自己下载,它提供的只是个几百K的小小文档。我们可以称之为“书”的东西。“书”在百度百科中这么定义的:“书是人类用来纪录一切成就的主要工具,也是人类交融感情,取得知识,传承经验的重要媒介”。LFS只告诉你知识,不提供产品,一切都得靠自己,我将编译这个版本的“LFS6.7”。
我接触到LFS是在去年年底。我们工程文件中心二期改造的项目可能要用到Linux,linux很早以前也玩过两天,可是那个时候它对硬件兼容性不是特别好。下载的发行版本是iso的镜像文件,不太容易找到刻录光驱。还有一个原因就是网络不发达,找到资料比较难,即使有资料也大多是英文的,我的英文水平和小沈阳一个级别的,所以一直也就放着。现在的情况已经好了。我将我做“LFS”的一些经验,写出来和大家分享,必尽绕路浪费的油钱够儿子买好多棒棒糖。我将在我的机器上安装,windows,ubuntu,和LFS。Ubuntu是一个Linux的发行版本,它最大的特点就是方便,对主流硬件的支持非常好,“163”和“sohu”都有ubuntu的镜像。下载和更新速度都非常快,用“鸟哥”的话说,离开了更新Linux就是一个屁。
编译“LFS”是需要一个宿主,我把ubuntu作为宿主,LFS编译时间非常长,最少需要2-3天时间,所以,下班之后可以直接让机器休眠,第二天继续,前面几个部分主要是为构建这个宿主。后面部分是根据"LFS"文档,结合我自己做的经验,将脚本提取出来,便于复制粘帖用的,有一些关键的内容被“LFS”文档一笔带过,比如分区,内核编译,这些对于初接触linux的朋友来说,会是一个卡;由于“LFS”编译的时间会非常长,有的时候会发生这样或那样的错误,需要恢复环境,我也会比较啰嗦。
你可以把这个文章copy到你的手机中,安装宿主的时候可以拿来翻看。
一、安装宿主系统。
“LFS”需要一个宿主,这是高度定制的Linux系统都需要的,比如“Gentoo,slckware”等。从2003年开始,主流的主板就开始支持从U盘启动了,如果需要安装系统非常简单将“启动U盘”插入,从U盘引导。LFS文档中有一节是说明对宿主系统的要求,我打算用Ubuntu作为的宿主,来编译我的LFS,我用的是ubuntu-10.04-desktop-i386,可在:“http://mirrors.sohu.com”下载。
我这边有一个可直接启动的Ubuntu的启动U盘,谁需要和我要一下。
我机器上以前已经有了一个Windows,并且我的分区已经满了。我在网上找到了一个软件“pqmagic9.0”它可以动态调整硬盘的分区,可添加删除分区,动态调整分区的大小。可以支持windows7,和Vista。以前的8.0好像有些问题。因为调整分区非常有风险。所以建议再调整分区之前先把所有的重要的文件备份一下啊。
硬盘只能支持4个主分区,这和历史局限性有关系,我把windows放在第一个分区,在linux下看上是“/dev/sda1”,将ubuntu放在第二个主分区,“/dev/sda2”,将交换分区放在,“/dev/sda3”现在这些分区已经足够了,我们安装完Ubuntu后再通过“fdisk”来分余下的空间。
一般对于多系统,都是先安装windows,再安装Ubuntu,用Ubuntu提供的引导程序“GRUB”来引导所有的系统,包括LFS,我不打算安装LFS的引导系统。所以“LFS文档”中的第8章,用“GRUB”引导系统可以省略。如果windows需要重新安装的话,它会再次覆盖掉“GRUB”写入的MBR。所以对于多系统环境下,重新安装windows,需要备份“mbr”,windows安装完成之后,用Ubuntu的引导盘进入“live CD”模式,再恢复一下“mbr”。
备份MBR
恢复MBR
如果没有备份MBR的情况下。
插入Ubuntu的启动盘,选择U盘启动,Ubuntu的安装非常简单,只需要做几道选择题,其中需要注意的是分区部分,前面的内容我就省略了,直接进入第4步。
必须选择“手动指定分区(高级)”选项,其他的都不适合。
第五步,选中“空闲”->“添加”。选择主分区,我将分配60G给,Ubutnu使用,挂载点选“/”,用于:”ext4 日志文件系统“。因为默认已经有一个windows分区。确定之后会出现“/dev/sda2”这个设备。再选择“空闲”。选择“主分区”,大小选择内存的2倍,起始位,用于“交换分区”,确定。其他的分区等ubuntu安装完成之后用“fdisk”再分其他的分区。
其他的都默认选择完成安装。
二、更新系统用于满足LFS对宿主的要求
1、选择一个最快的服务器
"系统"->“系统管理”->“软件源”->“选择最佳服务器”。
2、安转宿主必须的软件包。
先打开一个终端:“应用程序”->“附件”->"终端"。从“文档”前言中的《vii. Host System Requirements》中的一个“version-check.sh”这一大段脚本复制出来,终端的粘帖快捷键是“Ctrl+Shift+v”。执行一下,发现缺少了几个包,切换到root用户,安装vim m4 bison patch texinfo软件包,用以下命令。
--命令:----------
sudo su
apt-get install vim m4 bison patch texinfo
--结束:----------
三、准备一个新分区
建议在第一次做的时候只分配一个根分区,交换分区(swap)于ubuntu的共享,先取得root用户权限:"sudo su",接着查看一下你硬盘的分区情况“fdisk -l”。找到如果你的硬盘的设备号,我的是“/dev/sda”。然后执行“fdisk /dev/sda”。fdisk分区抄作比较简单,"m"帮助,里面列出来了所有的命令。“p”:查看分区情况。n:添加分区(主分区,或者扩展分区),t:改变分区的类型,w:保存(确认无误之后一定要保存);q:退出。d:删除(特别注意的是,删除要从后往前删,否则可能会出问题,我遇到过几次,可能是因为,windows下的分区软件和Linux不一样吧,不确定,反正从后往前删除就不会错了。)
我先建立了一个扩展分区,然后再在上面分出来3G的空间,就是“/dev/sda5”了。
四、准备工作
2.3. 在这个分区上创建文件系统
我打算将文件系统格式化成:ext4。
使用以下命令:
mke2fs -t ext4 /dev/sda5
2.4. Mounting the New Partition
和书上略有不同,文件系统我选择的是ext4.
export LFS=/mnt/lfs
mkdir -pv $LFS
mount -v -t ext4 /dev/sda5 $LFS
wget 是一个命令行的下载工具。对于我们这些 Linux 用户来说,几乎每天都在使用它。
wget -r -np -nd http://example.com/packages/
这条命令可以下载 http://example.com 网站上 packages 目录中的所有文件。其中,-np 的作用是不遍历父目录,-nd 表示不在本机重新创建目录结构。
wget -r -np -nd --accept=iso http://example.com/centos-5/i386/
与上一条命令相似,但多加了一个 --accept=iso 选项,这指示 wget 仅下载 i386 目录中所有扩展名为 iso 的文件。你也可以指定多个扩展名,只需用逗号分隔即可。
wget -i filename.txt
此命令常用于批量下载的情形,把所有需要下载文件的地址放到 filename.txt 中,然后 wget 就会自动为你下载所有文件了。
wget -c http://example.com/really-big-file.iso
这里所指定的 -c 选项的作用为断点续传。
wget -m -k (-H) http://www.example.com/
该命令可用来镜像一个网站,wget 将对链接进行转换。如果网站中的图像是放在另外的站点,那么可以使用 -H 选项。
sohu上有6.7的源码包,直接下载就ok了。这里我多下载了一个wget,打算把这个包也安装进去。
cd $LFS
wget -c http://mirrors.sohu.com/lfs/lfs-packages/lfs-packages-6.7.tar
wget -c http://ftp.gnu.org/gnu/wget/wget-1.12.tar.bz2
解压:
tar -xf lfs-packages-6.7.tar
删除打包文件,如果你还想留在用就“mv lfs-packages-6.7.tar ~/”到别的地方。
因为我们直接下载的源码包,接下来,只需要修改权限,添加lfs用户,通过以下命令列表,完成准备前工作。
#----------------- 添加用户
chmod -v a+wt $LFS/sources
mkdir -v $LFS/tools
ln -sv $LFS/tools /
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
passwd lfs
#---------------- 改变用户权限
chown -v lfs $LFS/tools
chown -v lfs $LFS/sources
su - lfs
#---------------- 设置lfs用户权限。
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH
EOF
source ~/.bash_profile
五、编译工具链
我已将工具链中的脚本放到了 20.sh中。如果你嫌麻烦可以在终端中,直接执行“bash 20.sh”。当然你也可以复制,粘贴来执行,这部分的脚本都没带测试,因为,测试在这个阶段没有意义。
我用的是6.7版本,可以用6.6的中文版对照,我还是用6.7的章节号。
5.32. 清理系统
之后需要切换到"root"用户,用“exit”命令。
5.33. 改变所有者
chown -R root:root $LFS/tools
特别说明:如果在做工具链一不小心重新启动了,就需要恢复状态,基本上是以下几步。
sudo su
export LFS=/mnt/lfs
mount -v -t ext4 /dev/sda5 $LFS
su - lfs
六、安装基础系统软件
我将所有的脚本都做到了,“60.sh”中,方便大伙复制粘帖。
对于多核的cpu在编译时可以采用“make -j8”,表示用8个核心编译,如果少于8个的话,这样写也没有问题。
这个地方是官方测试的log文件:“http://www.linuxfromscratch.org/ ... 果比较一下,
我将和“文档中不一样的地方列出”。严格按照书上说的顺序来。
如果编译的时候,出现了问题的话,可以通过以下命令恢复环境。
sudo su
export LFS=/mnt/lfs
mount -t ext4 /dev/sda5 $LFS
mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts
mount -vt tmpfs shm $LFS/dev/shm
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
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
6.9. Glibc-2.12.1
测试这个包,最有可能出问题。如果发现了问题,可以将错误的提示信息放到"google"去搜索一下,有些是偶发性的,我也说不好。如果不是非常严重的都可以pass掉。
在安装字符支持时,不需要所有的都装,只装一些与中文有关的就可以了。
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
localedef -i zh_CN -f GB2312 zh_CN.GB2312
localedef -i zh_CN -f GBK zh_CN.GBK
localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
可参见“60.sh”
7.4. 配置 setclock 脚本
这一节的配置时间,我一直没搞对,哪位知道告我一声,我用的是默认的配置,不影响。
7.5. 配置 Linux 控制台
这一节pass掉,consle对中文没意义。
7.8. Bash Shell 启动文件
编辑profile文件,一些环境变量的设置,你可以用"set"命令查看所有的环境变量
cat > /etc/profile << "EOF"
# Begin /etc/profile
umask 022
export LANG=en_US.iso88591
LC_ALL=en_US.iso88591 locale language
if [ "$PS1" ]; then
if [ "$BASH" ]; then
PS1='\u@$(uname -n):\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
EOF
7.11. 配置 localnet 脚本
你也可以随便给你的机器起一个名字。
echo "HOSTNAME=lfs6.7" > /etc/sysconfig/network
7.12. 定制 /etc/hosts 文件
就是定义一个ip给eth*使用的。根据你的网络情况自己配,
cat > /etc/hosts << "EOF"
# Begin /etc/hosts (network card version)
127.0.0.1 localhost
193.168.1.188 xiongying-lfs6.7
# End /etc/hosts (network card version)
EOF
7.13. 配置网络脚本
根据实际的网络配置,ip,网关等。
cd /etc/sysconfig/network-devices
mkdir -v ifconfig.eth0
cat > ifconfig.eth0/ipv4 << "EOF"
ONBOOT=yes
SERVICE=ipv4-static
IP=193.168.1.188
GATEWAY=193.168.1.1
PREFIX=24
BROADCAST=193.168.1.255
EOF
配置主机名,域名服务地址,根据自己的实际情况:
cat > /etc/resolv.conf << "EOF"
# Begin /etc/resolv.conf
domain xy-lfs6.7
nameserver 210.73.128.10
# End /etc/resolv.conf
EOF
8.2. 创建 /etc/fstab 文件
这个文件是默认情况加载的文件系统,就我现在的情况下,修改如下,如果你还需要挂别的分区的话也可以在这里写。
cat > /etc/fstab << "EOF"
# Begin /etc/fstab
# file system mount-point type options dump fsck
# order
/dev/sda5 / ext4 defaults 1 1
/dev/sda3 swap swap pri=1 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devpts /dev/pts devpts gid=4,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
# End /etc/fstab
EOF
8.3. Linux-2.6.32.8
大部分系统因为没有这一部分没有配好,这这里有一个配置好的文件,除了网卡没有加载,其他都加载了。我试了几台机器,基本都可以,其中ext4文件系统一定要编译进内核。要不然就启动不了。对于usb键盘的机器“HID Devices”这个一定要编译进去,我这这个地方搞了很长时间。Processor type and features,中选择你的CPU的类型。
大伙可以参看,鸟哥的内核编译的内容。和我上次上传的一个2.6.31的内核参考。
具体如何使用:
将"config-ok"拷贝到,souces/linux-2.6.32.8根目录中。
make clean
make mrproper
make menuconfig
选择“Load an Alternate Configuretion File” 输入"config-ok",修改“General setup ”->"Local version"加入你喜欢的名字。
在驱动程序列中,找到对应的网卡。
配置完成直接退出,提示要你保存。yes。
之后make。
按照书上的步骤来。
8.4. 使用 GRUB 配置启动过程
这部分省略。直接用ubuntu自带的GRUB启动
echo 6.6 > /etc/lfs-release
umount -v $LFS/dev/pts
umount -v $LFS/dev/shm
umount -v $LFS/dev
umount -v $LFS/proc
umount -v $LFS/sys
直接,logout,
七、配置ubuntu的Grub。
超级简单,打开一个终端,
sudo su
grub-mkconfig -o /boot/grub/grub.cfg
完成之后,你cat /boot/grub/grub.cfg文件就会发现多了一个启动选项。
哈哈,如果一起顺利你的新的LFS将会启动。
人生不如意十有八九。
如果不幸你的LFS没有启动的话。我们再进入ubuntu.从新chroot进去命令如下:
sudo su
export LFS=/mnt/lfs
mount -t ext4 /dev/sda5 $LFS
mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts
mount -vt tmpfs shm $LFS/dev/shm
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
chroot "$LFS" /usr/bin/env -i \
HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/bin/bash --login
之后可以先查看一下 /var/log/kern.log文件,看看是什么情况,或者查看sys.log。
再编译一次内核,再启动,good luck! |
|