Linux学习之系统的构建
实验环境:ubuntu 12.04 LTS
内核版本:linux-3.9.4
因为一直以来都对Linux的工作机理比较感兴趣,所以正好这两天有机会好好的研究一下,那闲话不多说,直接进入正题。
俗话说的好,公欲善其事,必先利其器。那么对于一个系统内核级的修改与研究必然不能从自己机器中正在运行的内核下手,这样一旦发生错误,将导致内核崩溃,无法启动,这个后果稍微有些严重。所以重新编译一个用于实验的内核是非常必要的。这里详见Linux学习之内核编译与添加系统调用。
对于本次的任务,一个模拟器也是非常必要的,这里主要是采用qemu模拟器。这个模拟器在linux下很常用,这里不再赘述。
当编译内核与安装qemu模拟器完成后,就可以正式开始本次任务之旅了。
因为内核已经编译结束,我们现在首先要做的是为我们自己的Linux系统准备一个非常重要的部分——根文件系统。这里主要采用了两种方案。
方法一:
首先建立目标根目录映像:
dd if=/dev/zero of=myinitrd.img bs=4096 count=1024
dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。dd 的主要选项:


方法二:
方法二采用的方法是通过使用busybox制作根文件系统。
首先下载busybox源码,并解压缩。
http://busybox.net/downloads/busybox-1.19.3.tar.bz2
然后进入busybox-1.19.3目录下,对busybox进行配置编译。
make defconfig
make menuconfig
这里要修改如下配置:
将busybox settings -> build options -> build busybox as a static binary这一项选上。
make
然后准备根目录映像,并安装busybox到根目录映像中。
dd if=/dev/zero of=busyboxmyinitrd12M.img bs=4096 count=3072
mkfs.ext3 busyboxmyinitrd12M.img
mkdir rootfs
sudo mount -o loop busyboxmyinitrd12M.img rootfs
cd busybox-1.19.3
sudo make CONFIG_PREFIX=../rootfs/ install

sudo umount rootfs
至此我们自己的通过busybox制作的根目录映像已经做好了,使用qemu模拟器试着运行一下。
qemu -kernel linux-3.9.4/arch/x86/boot/bzImage -initrd busyboxmyinitrd12M.img -append "root=/dev/ram init=/bin/ash"
运行结果如下:

可以看到进入到了busybox提供的shell环境,因此根文件系统加载成功。
到此为止,我们可以把前面的工作都看作是准备工作,真正精彩的节目开始了。
下面我们将制作带grub启动的磁盘映像。
首先获得grub并制作grub启动软盘。
下载grub,解压缩。
ftp://alpha.gnu.org/gnu/grub/grub-0.97-i386-pc.tar.gz
建立启动软盘映像:
dd if=/dev/zero of=vampirem.img bs=512 count=2880
添加grub启动功能
sudo losetup /dev/loop3 vampirem.img
sudo dd if=./grub-0.97-i386-pc/boot/grub/stage1 of=/dev/loop3 bs=512 count=1
sudo dd if=./grub-0.97-i386-pc/boot/grub/stage2 of=/dev/loop3 bs=512 seek=1
sudo losetup -d /dev/loop3
关于losetup命令的详细情况请参阅losetup命令和loop设备的使用
这里实际上是相当于采用一个循环设备loop3作为一个中间的挂载点,来对我们自己的grub软盘映像vampirem.img进行相应的修改和操作。
然后在qemu模拟器上测试一下,看是否可以进入grub界面。
qemu -fda vampirem.img

OK,我们看到grub界面成功启动了。
接下来,开始准备我们自己的linux操作系统的磁盘映像。
dd if=/dev/zero of=40M.img bs=4096 count=10240
sudo losetup /dev/loop3 40M.img
然后要在磁盘映像上建立一个启动引导分区,这里采用
sudo fdisk /dev/loop3

可以看到m命令是察看帮助信息的,我们察看一下

然后看到n命令是新建一个分区,a命令是将这个分区设为引导分区,p命令是打印出分区表,w命令是把分区表写到磁盘上并退出。于是:


分区建好之后,将活动分区格式化为ext3fs文件系统格式,并挂载到rootfs目录下。
sudo losetup -d /dev/loop3
sudo losetup -o 1048576 /dev/loop3 40M.img
这里的偏移值1048576是因为之前在设置分区时我们可以看到第一个扇区是在2048处,因此2048*512=1048576便是此处的偏移值。
sudo mkfs.ext3 /dev/loop3
sudo mount -o loop /dev/loop3 rootfs/
然后把之前准备好的,文件系统映像文件和内核映像文件拷贝到rootfs目录下,即拷贝到我们的磁盘映像文件中。
sudo cp busyboxmyinit12M.img rootfs/
sudo cp linux-3.9.4/arch/x86/boot/bzImage rootfs/
然后在rootfs下建立boot目录,以及boot目录下的grub目录。
sudo mkdir rootfs/boot
sudo mkdir rootfs/boot/grub
然后将之前下载的grub的boot/grub目录下的文件拷贝到rootfs/boot/grub目录下。
sudo cp ./grub-0.97-i386-pc/boot/grub/* rootfs/boot/grub
然后需要在rootfs/boot/grub目录下建立一个启动菜单文件menu.lst。具体内容如下:

里面的内容意思很明显,这里不再赘述。
sudo umount rootfs
sudo losetup -d /dev/loop3
下面紧张的时刻到了,我们看一下,能否利用grub启动软盘,在磁盘映像上添加grub功能。
qemu -boot a -fda vampirem.img -hda 40M.img

可以看到,成功添加。
下面测试一下,从刚才制作好的我们自己的linux操作系统的磁盘映像文件进入grub界面然后启动。
qemu -hda 40M.img


至此,我们自己的一个小型的LINUX操作系统就完成了~
Linux学习之系统的构建的更多相关文章
- Linux学习之系统时间同步
一.系统时间的设置 在Linux中设置系统时间,可以用date命令: //查看时间 [root@localhost ~]# date 2008年 12月 12日 星期五 :: CST //修改时间 [ ...
- linux 学习随笔-系统日常管理常用命令
1:W 查看系统整体负载,无法查看具体负载,比如内存,磁盘 23:25:20 up 13 min, 2 users, load average: 0.00, 0.01, 0.01 USER ...
- Linux 学习笔记 1 使用最小的系统,从分区安装系统开始
我们常用的linux系统在安装过程中大多都省略了对系统进行分区的操作,以至于后期,不了解什么是分区以及分区当中最基本的一些概念, 我们不说最细的知识,只求了解这个过程,那直接步入正题,开始第一节的学习 ...
- 嵌入式linux系统的构建
前期工作:a.配置好tftp服务器:在嵌入式的童年中有介绍 b.开发板可以pc,linux 三者可以互相ping通 c.配置好nfs服务器:同样在嵌入式的童年中有介绍 一.嵌入式linux内核的制作( ...
- Linux学习之Centos(三)------系统文件目录及含义详解
Linux学习之Centos 之三------文件目录及含义 在了解了每个文件的相关种类与属性,以及了解了如何更改文件属性/权限的相关信息后,再来要了解的就是, 为什么每套Linux distribu ...
- Linux学习笔记-Linux系统简介
Linux学习笔记-Linux系统简介 UNIX与Linux发展史 UNIX是父亲,Linux是儿子. UNIX发行版本 操作系统 公司 硬件平台 AIX IBM PowerPC HP-UX HP P ...
- Linux学习之三-Linux系统的一些重要配置文件
Linux学习之三-Linux系统的一些重要配置文件 1.网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0 说明: DEVICE=eth0 ...
- Linux学习之二-Linux系统的目录结构
Linux学习之二-Linux系统的目录结构 在Linux的根目录下,有很多的目录,但是需要记住,对于Linux而言,一切皆文件.因此此处的目录也是文件.用ls / 命令就能看到根目录下的各类不同的目 ...
- Linux学习笔记(七) 查询系统
1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...
随机推荐
- MVC+MQ+WinServices+Lucene.Net
MVC+MQ+WinServices+Lucene.Net Demo 前言: 我之前没有接触过Lucene.Net相关的知识,最近在园子里看到很多大神在分享这块的内容,深受启发.秉着“实践出真知”的精 ...
- Delta3D 2.8版本号 预习
http://blog.csdn.net/zhuyingqingfen/article/details/38581453 看到官网今天的更新.发现即将公布的delta3d 2.8 版本号 做了非常大的 ...
- ionic入门之色彩、图标和边距和界面组件:列表
色彩 ionic定义了九种前景/背景/边框的色彩样式,: 可以在任何元素上使用这些样式设置前景和背景颜色: <any class="positive-bg energized" ...
- centos 7安装mysql5.5
首先centos7 已经不支持mysql,因为收费了你懂得,所以内部集成了mariadb,而安装mysql的话会和mariadb的文件冲突,所以需要先卸载掉mariadb,以下为卸载mariadb,安 ...
- C和Java中数组的定义
在学习C和Java中,关于数组的定义两者不同,在初学的时候,容易产生混淆,现在将两者对比下. 1.初始化 在C语言中,关于一维数组的定义: 完全初始化 int a[5]={1,2,3,4,5},对于 ...
- asterisk实时添加sip号码--sqlite篇
原文:asterisk实时添加sip号码--sqlite篇 asterisk实时添加sip号码--sqlite篇 今天尝试用了asterisk的实时模式,往sqlite里面添加一个sip帐号,无需重启 ...
- 扩展ToolBarManager、ListView和Grid控件以实现气球式的ToolTip
原文:扩展ToolBarManager.ListView和Grid控件以实现气球式的ToolTip infragistics是全球领先的UI工具和用户体验的专家,Infragistics开发了一系列的 ...
- 学习html5的WebSocket连接
1.什么是WebSocket WebSocket 是一种自然的全双工.双向.单套接字连接.使用WebSocket,你的HTTP 请求变成打开WebSocket 连接(WebSocket 或者WebSo ...
- 强大的jquery-制作选项卡
最近在学习jquery,特地把今天写的一个选项卡源码贴出来.只是做只是梳理,大神们请不要吐槽,如果有更好的方法,欢迎指点.谢谢. css <style> #tab div{ width:2 ...
- SSIS中执行SQL任务组件参数传递的问题
原文:SSIS中执行SQL任务组件参数传递的问题 症状: 执行SQL任务,传递参数到子查询中,执行报错. 错误: 失败,错误如下:"无法从使用 sub-select 查询的 SQL 语句中派 ...