LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1749|回复: 10

从LFS打造一个基本的linux系统(学习贴)

[复制链接]
发表于 2007-7-16 15:33:15 | 显示全部楼层 |阅读模式
上周根据相关的帖子,经过多次尝试,总算将LFS做了一遍。
大体上对系统有了一个基本的认识。
现在打算就这些认识做一些新的尝试,目的在于加深对系统的认识。
新学的同学也可以和我一起来做一下,交流一下心得。
同时也希望老鸟们能给于关注与指导,谢谢。
 楼主| 发表于 2007-7-16 17:44:44 | 显示全部楼层

第一步 让系统可以启动内核

[1]准备原料
系统当然是在虚拟机的环境下操作比较安全些,当然也方便些。
先下载两个原料:Vmware 6和LFS 6.2-5 LiveCD。

[2]安装虚拟机
安装好Vmware,并创建一台虚拟机,配置为单CPU,128M内存,IDE硬盘2G,网卡为NAT,CDROM采用LFS LiveCD的iso文件。
启动虚拟机,等待机器启动到提示符下,就准备动手了。

[3]准备硬盘
首先是分区。比较简单的是采用cfdisk工具。

#cfdisk /dev/hda

先后用new write quit 命令就可以完成分区。简便起见,整个硬盘只分了一个Linux分区。
接下来就是格式化分区。

#mke2fs /dev/hda1

可能e2fs文件系统比较落后了,我这里只是打算做做实验,要保证内核的支持,以后大家可以尝试更多的文件系统。

将硬盘挂载到LFS系统。

#mount /dev/hda1 /mnt

[4]安装grub
先为安装grub准备目录

#mkdir -v /mnt/boot /mnt/boot/grub

还有/usr/lib/grub//i386-pc下的其他几个文件
#cp -av /usr/lib/grub/i386-pc/stage? /mnt/boot/grub

由于我们采用的是e2fs文件系统,所以还要拷贝e2fs相关文件
#cp -av /usr/lib/grub/i386-pc/e2fs* /mnt/boot/grub

编辑启动文件菜单menu.lst

cat > /mnt/boot/grub/menu.lst << "EOF"
default 0

timeout 10

title MyLinux
root (hd0,0)
kernel /boot/bzImage root=/dev/hda1
EOF

然后就是安装grub到硬盘
#grub
grub>root (hd0,0)
grub>setup (hd0)
grub>quit

[5]准备内核
我们可以编译自己的内核,但建议以后再尝试吧。
这里我们采用LFS的内核,并将文件名改为更通用menu.lst中使用的bzImage。

#cp -av /boot/isolinux/linux /mnt/boot/bzImage

[6]完成了
第一步到此结束,启动机器看一看成果吧。

#reboot
回复 支持 反对

使用道具 举报

发表于 2007-7-16 19:20:57 | 显示全部楼层
有點不解,不明白樓主的動機,也看不明白到底樓主在做什麼系統
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-16 21:15:55 | 显示全部楼层
呵呵,就是想知道系统到底是由那些东西组合而成的。
回复 支持 反对

使用道具 举报

发表于 2007-7-16 21:30:01 | 显示全部楼层
mke2fs /dev/[xxx] 创建ext2文件系统
mke2fs -j /dev/[zzz] 创建ext3文件系统, -j 是创建日志文件系统。
mkfs.ext2 或者 mkfs.ext3 也可以
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-16 22:06:22 | 显示全部楼层

第二步 完成能正常启动的系统

[1]搞定init
之前系统启动后,提示:
Kernel panic - not syncing: No init found. Try passing init= option to kernel.

意思是找不到init
我们现在就要搞定init

首先从光驱启动虚拟机,然后挂载硬盘

>mount /dev/hda1 /mnt

拷贝/sbin/init到硬盘
>mkdir -v /mnt/sbin
>cp -av /sbin/init /mnt/sbin

init的运行需要一些运行库支持,也必须拷贝到相应目录。
我们可以使用ldd命令查找这些运行库
>ldd /sbin/init

建立库目录
>mkdir -v /mnt/lib

将init所需的库文件拷贝到硬盘中
>cp -av /lib/libc-* /mnt/lib
>cp -av /lib/libc.* /mnt/lib
>cp -av /lib/ld* /mnt/lib

另外,init的运行还需要一个配置文件/etc/inittab
LFS系统的inittab文件对于目前的系统来说过于复杂,我们可以自己写一个简单的
>mkdir /mnt/etc
>cat > /mnt/etc/inittab << "EOF"
# Begin /etc/inittab

id:3:initdefault:

1:2345:respawn:/bin/bash

# End /etc/inittab
EOF

[2]安装bash
在inittab中配置系统启动后进入bash,当然要安装bash到系统了。

>mkdir /mnt/bin
>cp -av /bin/bash /mnt/bin

用ldd查找相关的库文件,然后拷贝到硬盘。

>cp -av /lib/libread* /mnt/lib
>cp -av /lib/libhis* /mnt/lib
>cp -av /lib/libncur* /mnt/lib
>cp -av /lib/libdl* /mnt/lib

[3]建立/dev/console
bash要有一个显示终端,所以需要建立/dev/console

>mkdir /mnt/dev
>cp -av /dev/console /mnt/dev

重启看看效果啦

>reboot
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-16 22:19:50 | 显示全部楼层

系统能干什么?

这个系统好像什么都不能干。
真的是这样吗?
实际上现在系统的硬件已经被驱动起来了。
如果我们自己写了一个嵌入式的应用
我们就可以用它代替bash
这样我们就有了一个专用的系统
而这个系统具有linux的稳定性和扩展性
回复 支持 反对

使用道具 举报

发表于 2007-7-16 22:22:24 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2007-7-17 10:19:41 | 显示全部楼层
疑惑?楼主想干什么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-17 10:37:16 | 显示全部楼层
只是为了学习。

看了8楼推荐的文章,想简单定制一下bash
写了个简单的/etc/profile
PS1="\w#"
export PS1
但重启后并没有起作用
export的输出中也没有PS1
还差什么?

查看了相关资料。
原来,只有交互登录的bash才会使用/etc/profile文件。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表