免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7915 | 回复: 8
打印 上一主题 下一主题

创建最精简的Linux [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-17 09:16 |只看该作者 |倒序浏览
Linux一大亮点就是开源,相对于Windows我们可以在Linux上发挥更大的想象力,来亲手打造拥有自己特色的Linux系统,首先我们从打造最基本的微型的Linux系统入手,通过整个打造过程的体验,你就可以将自己的完整的Linux系统进行个性化设置,然自己用的Linux系统散发着自己的气息,让其更具亲合力!!
  下面我们就来直接操作,关于原理,会在每步中说明:
  一、准备阶段:
  硬件设施:一台宿主机、一个空磁盘(或者数据不再使用的磁盘,1G就足够了,如果想对自己制作的Linux进行不断的完善,那么就选用大点的光盘,文中我们将其视为sdb,根据自己实际情况进行相应的调整).
  1、分区、格式化我们准备的磁盘
  将我们准备的新磁盘进行分区(如果是数据不用的磁盘,使用dd if=/dev/zero of=/dev/sdb bc=512 count=1 将其磁盘引导区的数据全部进行0覆盖,这样这块磁盘也就编程了空磁盘).
  fdisk /dev/sdb 将其分为两个区sdb1 100M 、sdb2 500M,类型为都为Linux,保存,退出
  格式化分区:根据自己属主机的文件系统类型,进行格式化我的为ext3,所以我格式化时加了个-j,如果自己的是ext2就不需要加-j了
  mke2fs -j /dev/sdb1 mke2fs -j /dev/sdb2 #都将其格式化为ext3格式2、挂载磁盘(挂载点自己选择,但是挂载sdb1的挂载点名字必须为boot)
  创建挂载点:
  mkdir -pv /mnt/{boot,myroot}
  mount /dev/sdb1 /mnt/boot  #将sdb1挂载至/mnt/boot
  mount /dev/sdb2 /mnt/myroot   #将sdb2挂载至/mnt/myroot(注:当我们挂载的这两个分区的时候也许会出现分区不存在的错误提示,主要原因为系统没能自动获取刚刚创建的分区的信息,也就是/proc/partitions文件中没有新建分区的信息,我们只需要输入命令:partproble /dev/sdb 重读分区信息,新建的分区信息将被写入/proc/parttions文件,这样就OK了)
  二、打造阶段:
  1、准备我们Linux的心脏(内核)
  查看我们宿主机中/boot目录中的内容,会发现有类似vmlinuz-2.6.18-164.el5 vmlinuz-2.6.28.10这样带有版本号的文件,这就是系统的内核文件,我们选择一个内核文件,将其拷贝到我们小Linux的/boot目录中,这样我们的Linux就有心脏了.
  命令:
  cp /boot/vmlinuz-2.6.18-164.e15 /mnt/boot/vmlinuxz  #将内核改名为vlinuxz.(注:将内核进行改名,不仅有利于我们接下来操作的操作还可以避免因为此处内核名字和grub.conf文件中内核名字的不符而引起kernel panic(内核恐慌)问题,导致我们的小Linux无法启动,此外我曾遇到过在虚拟机里用手打出的内核名字和用Tab键写出的内核名字不符的现象,至今不知为何!所以我们尽可能的将我们小Linux的内核文件名字写的简短一点)
  2、准备我们的Linux的善意欺骗文件initrd文件.
  关于initrd文件的作用,我在有一篇名为《Linux开机流程简述》的文章中详细说明多,建议大家去看看,对我们的小Linux管理和维修是有很大帮助的.
  同样查看宿主机的/boot目录内的内容,会发现有类似initrd-2.6.18-164.el5.img initrd-2.6.28.10.img 这样以initrd开头中间是版本号,以img结尾的文件,那么这就是initrd文件了,每个版本的内核文件,就会有一个与之版本号相对应的initrd文件,将与我们刚才选择的内核版本号相对应的initrd文件拷贝到一个新建的目录内改造(此处我们在/tmp目录中创建一个名为test的目录)
  cp /boot/initrd-2.6.18-164.el5.img /tmp/test/我们用查看这个文件的类型会发现它是一个用cpio打包,由gzip压缩的文件,我们将其展开在当前目录下.
  zcat initrd-2.6.18-164.el5.img | cpio -id
  展开之后我们会发现一个init的脚本文件,将其用vim打开,将以mkrootdev -t ext3 -o defaults,ro开头行ro后面的内容改成sda2,保存退出,即可(sda2为我们小linux系统单独运行时根文件系统所在的分区,在此我们告诉init进程,真正的根文件系统在sda2上面,让内核去进行根文件系统的加载,需要注意的是ro和sda2之间有一个空格)
  修改 完成之后,我问就该对其进行封装复原了(封装复原前最好先将此目录中的initrd-2.6.18-164.el5.img文件删除,使用命令:rm -rf initrd-2.6.18-164.el5.img),使用命令:
  find . | cpio -H newc -o | gzip -9 > /mnt/boot/initrd.gz
  (注:find . 为当前目录的所有内容cpio -H news -o 将目录下的所有内容进行cpio打包gzip -9 打包之后进行gzip压缩,因为这个文件必须是压缩的格式> /mnt/boot/initrd.gz 将打包压缩好的文件放在/mnt/boot目录下,并命名为initrd.gz,重命名同样是为了方便使用 )
  3、向我们小Linux磁盘安装grub引导程序.(关于grub的作用在我刚刚提到的文章里有介绍,此处不再说明)
  安装命令为:
  grub-install --root-directory =/mnt /dev/sda^此处为boot目录的父目录
  进入/mnt/boot目录查看是否有一个新的目录grub,没有的话则为安装失败,重新安装,有的话直接进入该目录.
  使用vim创建文件grub.conf并写入如下内容(注:#后为我的注释内容,不要写入)
  default=0
  timeout=10 #此处是我们系统启动是菜单选择时间的设置,我们设置为10秒.
  title MY LINUX #title是在开机操作系统选择菜单中我们小Linux所显示的名字,可任意填写
  root (hd0,0) #告诉grub我们小Linux系统的内核、根文件系统,initrd文件的所在磁盘
  kernel /vmlinuz ro root=/dev/sda2 rhgb quiet #告诉grub内核的名字及根文件系统所在的分区
  initrd /initrd.gz #告诉grub initrd文件的名字保存退出即可.
  4、为我们的小Linux系统创建简单的根文件系统
  进入/etc/myroot目录使用命令创建如下目录:
  mkdir -p {boot,proc,sys,dev,home,root,etc/{rc.d,sysconfig,init.d},bin,sbin,lib,usr/{bin,sbin,lib,include},var/{log,run},tmp,mnt,opt,media}
  基本命令移植,将借助宿主机有关命令的库文件,为我们的小Linux移植必须的命令(各命令的移植方法相同,在此以命令bash为例)
  使用which bash 查看bash命令的位置,并将其拷贝到我们小Linux的相应位置即可
  cp /bin/bash /mnt/myroot/bin/bash由于系统在启动时不是读取bash命令本身,而是sh,所以我们为bash命令创建一个sh链接(只有这个命令需要链接)
  进入/mnt/myroot/bin目录
  创建链接 ln -sv bash sh 然后查看该目录将会看见sh
  查看并拷贝bash命令所依赖的库文件(没有库文件,命令只是个摆设)
  使用命令ldd /bin/bash 将显示bash所依赖的所有库文件,如
  linux-gate.so.1 => (0x0061c000)
  libtermcap.so.2 => /lib/libtermcap.so.2 (0x00c8f000)
  libdl.so.2 => /lib/libdl.so.2 (0x00c60000)
  libc.so.6 => /lib/libc.so.6 (0x00b18000)
  /lib/ld-linux.so.2 (0x00af5000)第一个库文件不必拷贝,下面的库文件需一一拷贝进小Linux对应的目录,例如第二个库文件的拷贝为:cp /lib/libtermcap.so.2 /mnt/myroot/lib/libtermcap.so.2
  每个命令的移植过程都是如此,此外init命令也是必须要的,其它命令可以自行选择.
  4、创建我们小Linux的/etc/inittab、/etc/rc.d/rc.sysinit文件(关于这两个文件的作用在我刚刚提到的文章里有介绍,此处不再说明)
  在/etc目录下创建inittab文件,内容如下同样#之后为注释内容)
  id:3:initdefault: #设定系统默认启动级别为3
  si::sysinit:/etc/rc.d/rc.sysinit #让系统执行/etc/rc.d/rc.sysinit脚本保存退出
  在/etc/rc.d目录下创建脚本rc.sysinit ,内容如下
  bin/bash #运行bash命令保存退出,并给予脚本执行权限 chmod +x rc.sysinit
  至此,最精简Linux已经在被我们打造出来,赶紧将含有我们劳动成果的磁盘放在其他的裸机上运行一下吧,千万要记住,心急吃不了热豆腐,在取下磁盘之前一定要给宿主机足够多的时间,将缓存中的数据卸载我们的小Linux磁盘上,不然后果可想而知!
  这是个能进行最基本的运行的Linux,所以大家有很大的空间对其进行不断的完善,希望大家一步步的让我们的小Linux"长大"!

论坛徽章:
0
2 [报告]
发表于 2011-08-17 18:42 |只看该作者
感谢分享,回头我成抽空试试。。

论坛徽章:
0
3 [报告]
发表于 2011-08-25 15:16 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2011-08-29 11:03 |只看该作者
回复楼上,这是一篇最简单系统的构建方法小文,和公司和做什么发行版无关

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:192015年迎新春徽章
日期:2015-03-04 09:57:09
5 [报告]
发表于 2011-09-21 17:23 |只看该作者
貌似用busybox做才是最精简的吧。

论坛徽章:
0
6 [报告]
发表于 2011-10-02 21:48 |只看该作者
对于 Linux 新手,或者那些想要重新审视或改进自己对基本 Linux 概念(比如:复制和移动文件、创建符号和硬链接、设置文件系统对象所有权和权限以及同管道和重定向一起使用 Linux 的标准文本处理命令)的理解的人来说,本教程(第 1 部分)是理想的教材。沿着这个方向,我们将一起分享很多心得、技巧和窍门,使该教程甚至对于那些具有丰富经验的 Linux 老手来说都是“有血有肉”,并且是实用的。对于初学者而言,本教程的许多内容都很新颖,而更有经验的 Linux 用户可能会发现本教程是使他们基本的 Linux 技能“炉火纯青”的有效途径。


介绍 bash

shell

如果您使用过 Linux 系统,那么您知道当登录时,将会看到像这样的提示符:

$



您所看到的特殊的提示符可能看起来很不一样。它可能包含系统的主机名、当前的工作目录名,或者两者都有。但是不管这个特殊的提示符看起来像什么,有一件事是肯定的。打印出这个提示符的程序叫“shell”,极有可能您的特殊的 shell 是一个叫 bash 的程序。
您在运行 bash 吗?

您可以通过输入下面的命令来检查您是否正在运行 bash:

$ echo $SHELL
/bin/bash



如果上面的命令行报错或者不会类似地响应我们的示例,那么您可能正在运行一个不同于 bash 的 shell。在这种情况下,本教程的大部分内容仍然适用,但是出于为 101 考试作准备的目的,您最好切换到 bash。(请参阅本教程系列的第 2 部分,以获取关于使用 chsh 命令来改变 shell 的信息。)


关于 bash

Bash 是“Bourne-again shell”的首字母缩写,它是大多数 Linux 系统缺省的 shell。shell 的任务是执行您的命令,使您能够与 Linux 系统进行交互。当您输完命令,您可以通知 shell 执行 exit 或 logout 命令,在此您将返回到登录提示符。

顺便提一下,您还可以通过在 bash 提示符下按 control-D 来注销。



使用“cd”

您可能已经发现,目不转睛地盯着 bash 提示符可不是世界上最让人感到有劲的事。那么,让我们来开始用 bash 来浏览我们的文件系统。在提示符下,输入下面的命令(不包括 $):

$ cd /



我们只告诉 bash 您想在 /(也称为根目录)中工作;系统上的所有目录形成一棵树,/ 被认为是这棵树的顶部,或者是根。cd 设置当前您正在工作的目录,也称为“当前工作目录”。



路径

要看 bash 的当前工作目录,您可以输入:

$ pwd
/



在上面的示例中,cd 的 / 参数叫做路径。它告诉 cd 我们要转到什么地方。特别是,/ 参数是一个绝对路径,意味着它指定了相对于文件系统树的根的位置。



绝对路径

这里有几个其它的绝对路径:

/dev
/usr
/usr/bin
/usr/local/bin



您可以看到,所有绝对路径有一个共同点就是,它们都以 / 开头。通过路径 /usr/local/bin,我们告诉 cd 进入 / 目录,接着进入这个目录之下的 usr 目录,然后再进入 local 和 bin。绝对路径总是通过是否以 / 开头来判断。



相对路径

另一种路径叫相对路径。在 Bash 中,cd 以及其它命令总是解释那些相对于当前目录的路径。相对路径绝不会以 / 开头。这样,如果我们在 /usr 中:

$ cd /usr



那么,我们可以使用相对路径来转到 /usr/local/bin 目录:

$ cd local/bin
$ pwd
/usr/local/bin




使用“..”

相对路径还可以包含一个或多个 .. 目录。.. 目录是指向父目录的专门目录。那么,继续前面的示例:

$ pwd
/usr/local/bin
$ cd ..
$ pwd
/usr/local



您可以看到,现在我们的当前目录是 /usr/local。我们能够“后退”到相对于我们所在的当前目录的一个目录。



使用“..”(续)

此外,我们还可以将 .. 添加到一个现有的相对路径中,使我们可以进入与我们已在目录并排的目录,例如:

$ pwd
/usr/local
$ cd ../share
$ pwd
/usr/share



相对路径示例

相对路径可以变得相当复杂。这里有几个示例,所有的都没有显示出结果的目标路径。请试着推断一下,输入这些命令后,您最终将会转到什么地方:

$ cd /bin
$ cd ../usr/share/zoneinfo


$ cd /usr/X11R6/bin
$ cd ../lib/X11


$ cd /usr/bin
$ cd ../bin/../bin



现在,试验一次,看看您的推断是否正确。



理解“.”

在我们结束 cd 的介绍之前,我们还需要讨论一些更多的内容。首先,还有另一个叫 . 的专门的目录。它表示“当前目录”。然而该目录不为 cd 命令使用,它通常用来执行一些当前目录中的程序,如下所示:

$ ./myprog



在上面的示例中,驻留在当前工作目录中的 myprog 可执行文件将被执行。



cd 和主目录

如果我们想要转到主目录,我们可以输入:

$ cd



没有参数,cd 将转到主目录,对于超级用户来说是 /root,对于一般用户来说通常是 /home/username。但是,如果我们想要指定一个主目录中的文件,将会怎样呢?可能我们想要将一个文件参数传给 myprog 命令。如果该文件在主目录中,我们可以输入:

$ ./myprog /home/drobbins/myfile.txt



但是,使用像这样的绝对路径并不总是很方便。幸好,我们可以使用 ~(代字符)字符来完成同样的事:

$ ./myprog ~/myfile.txt




其他用户的主目录

Bash 将把单独的 ~ 扩展为指向主目录,然而您还可以用它来指向其他用户的主目录。例如,如果我们想要引用 fred 的主目录中的名为 fredsfile.txt 的文件,可以输入:

$ ./myprog ~fred/fredsfile.txt


本文来源于盛浩教育lpi认证中心 [url]www.china-lpi.com[/url]

论坛徽章:
0
7 [报告]
发表于 2011-12-29 20:14 |只看该作者
龙芯的只能这么搞吧

论坛徽章:
0
8 [报告]
发表于 2011-12-31 15:39 |只看该作者
有空研究研究!

论坛徽章:
0
9 [报告]
发表于 2012-01-26 19:37 |只看该作者
有空制作一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP