`

自己动手创建最精简的Linux

 
阅读更多
  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"长大"!


分享到:
评论

相关推荐

    自己动手做一个迷你 Linux 系统

    ### 自己动手做一个迷你 Linux 系统:详细知识点解析 #### 一、项目背景与目标 在本项目中,我们将尝试构建一个极简版的Linux系统。该系统旨在占用尽可能小的空间(不超过16M字节),同时具备基本的功能,如XFree86...

    自己动手做一个迷你Linux系统

    ### 自己动手做一个迷你Linux系统 #### 知识点概览 - **迷你Linux系统的目标与特点** - **系统配置需求** - **选择LILO作为BootLoader的理由** - **安装和配置LILO的过程** - **文件系统的选择与创建** - **内核...

    自己动手写内核 Linux C代码

    《自己动手写内核》这本书是一本专门为对Linux内核感兴趣的读者设计的入门教程。它以浅显易懂的方式引导读者逐步了解并实践Linux内核的编写过程,从而深入理解操作系统的核心原理。这本书的特点在于其薄而精悍,虽然...

    自己动手打造嵌入式Linux软硬开发环境

    【嵌入式Linux软硬开发环境构建】 嵌入式Linux开发环境的构建是将Linux操作系统应用于嵌入式设备的关键步骤,这通常涉及到硬件选择、软件配置以及开发工具链的搭建。1991年,Linus Torvalds的Linux项目始于个人爱好...

    自己动手写操作系统 pdf

    自己动手写操作系统在详细分析操作系统原理的基础上,用丰富的实例代码,一步一步地指导读者用C语言和汇编语言编写出一个具备操作系统基本功能的操作系统框架。本书不同于其他的理论型书籍,而是提供给读者一个动手...

    一个简单的linux文件系统

    通过uxfs_rh8这个项目,你可以亲自动手构建一个简单的Linux文件系统,理解如何实现文件的创建、读取、写入和删除等基本操作,以及如何处理目录结构。这将加深你对Linux内核和文件系统原理的理解,对于系统管理员和...

    linux基础总结简单好学

    ### Linux基础总结:掌握核心命令,轻松驾驭系统 在IT领域,Linux作为一款开源操作系统,因其高度的灵活性、稳定性和安全性而备受青睐。...记住,理论结合实践,多动手操作,才能真正掌握Linux的精髓。

    自己动手写操作系统

    4.1.3 一个最简单的Loader132 4.1.4 加载Loader入内存133 4.1.5 向Loader交出控制权142 4.1.6 整理boot.asm142 4.2 保护模式下的"操作系统"144 第5章 内核雏形146 5.1 用NASM在Linux下写Hello World146 5.2 ...

    如何学习linux操作系统

    4. **项目实践**:参加开源项目或自己动手创建一个小项目,例如设置一个Web服务器或构建一个简单的应用程序。 通过以上步骤,你可以逐步建立起对Linux操作系统的理解和掌握,为未来的职业发展打下坚实的基础。

    自己动手写操作系统》部分源代码

    《自己动手写操作系统》是一本深受程序员和操作系统爱好者欢迎的书籍,它引领读者逐步了解并实践操作系统的构建过程。这份压缩包包含的源代码分别来自书籍的六个章节,分别是chapter1到chapter6,覆盖了操作系统核心...

    自己动手写操作系统(含源代码).part2

    而且我选择我能想到的最精简的设计,以便让读者不至于陷入太多细节而无法看到全貌。我想这是本书可能具有的价值所在──简化的易懂的设计,还有尽量详细的文字。 在这一版中,内容被划分成上下两篇。上篇基本上是第...

    linux自学通(简单易懂的教程哦)

    Bash是Linux最常见的Shell,用于交互式命令行和编写shell脚本。了解变量、条件语句、循环结构以及函数可以帮助你自动化日常任务。 六、权限管理 Linux使用rwx(读、写、执行)权限控制文件和目录,`chmod`命令可以...

    动手做一个迷你型Linux操作系统

    动手构建一个迷你型Linux操作系统是一项有趣的挑战,适合对操作系统原理感兴趣的爱好者或开发者。在这个项目中,我们将构建一个专用于特定单机的系统,它可以在有硬盘或无硬盘(使用Flash Disk)的情况下运行,并且...

    linux下简单聊天工具

    在Linux操作系统中,开发简单的聊天工具是学习网络编程和socket通信的一个经典实践。这个项目包含三个源码文件,分别对应服务端、客户端以及共享的头文件。通过理解并实现这样的程序,可以深入理解TCP/IP协议栈中的...

    老师上课用Linux课件

    Linux是世界上最受欢迎的开源操作系统之一,它为个人用户、企业乃至超级计算机提供了强大的计算平台。...在Linux的世界里,实践是最重要的学习方式,因此,鼓励学生在虚拟机上动手操作,亲身体验Linux的魅力。

    最小的Linux操作系统制作过程详解.doc

    发现实际使用的软件和工具只占了安装内容的一部分,于是产生了创建一个精简版Linux的愿望。通过制作这样的小型系统,可以深入理解Linux的启动过程,学习ramdisk的使用,同时在实践中快速提升Linux知识,带来乐趣。...

    Linux学习教程之 Red Hat Linux 基础教程

    在IT领域,Linux操作系统是不可或缺的一部分,特别是对于服务器管理和系统管理员而言。Red Hat Linux作为Linux发行版中的佼佼者,...实践是学习Linux最好的方法,所以鼓励你在虚拟机中动手操作,亲身体验Linux的魅力。

    linux学习指南针

    - 自己动手安装:亲自安装Linux系统,学习安装技能,不要依赖Windows的工作方式,尝试理解Linux的本质。 3. **进阶阶段**: - 掌握常用命令:至少学习50个以上的基本命令。 - 理解Shell管道、文件流重定向和追加...

    自己动手写操作系统 电子工业出版社 pdf

    第1章 马上动手写一个最小的“操作系统”1 1.1 准备工作1 1.2 10分钟完成的操作系统1 1.3 Boot Sector3 1.4 代码解释3 1.5 水面下的冰山5 1.6 回顾6 第2章 搭建你的工作环境7 2.1 虚拟计算机(Virtual PC)7 2.1.1 ...

Global site tag (gtag.js) - Google Analytics