自己动手构建一个Linux不仅可以加深对Linux的理解,对嵌入式Linux的学习也有很大的帮助。构建一个自己的Linux(内核的编译,文件系统的制作,图形界面,驱动等)和开发嵌入式Linux的过程基本一样。
1开发环境
RedFlag Linux 6.0
VMware 7.1.3build-324285
2 添加磁盘
添加一个新的虚拟硬盘,硬盘类型选择“IDE”,如下图所示:
注意:一定选择IDE类型的虚拟磁盘,否则系统无法识别磁盘,会无法挂载文件系统!,在initrd.img中还要插入相应的内核模块。
3查看磁盘
启动虚拟机,在终端下查看刚刚添加的硬盘
[root@localhost ~]# fdisk -l
...
Disk /dev/sdc: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280bytes
Disk /dev/sdc doesn't contain a validpartition table
4给硬盘分区
[root@localhost ~]# fdisk /dev/sdc
Device contains neither a valid DOSpartition table, nor Sun, SGI or OSF disklab
el
Building a new DOS disklabel. Changes willremain in memory only,
until you decide to write them. After that,of course, the previous
content won't be recoverable.
The number of cylinders for this disk isset to 1044.
There is nothing wrong with that, but thisis larger than 1024,
and could in certain setups cause problemswith:
1) software that runs at boot time (e.g.,old versions of LILO)
2) booting and partitioning software fromother OSs
(e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partitiontable 4 will be corrected by w(rite)
Command (m for help): n //添加一个新的分区
Command action
e extended
p primary partition (1-4)
p //选择主分区
Partition number (1-4): 1
First cylinder (1-1044, default 1): 1
Last cylinder or +size or +sizeM or +sizeK(1-1044, default 1044): +100M//boot分区为100M
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p //添加一个新的分区
Partition number (1-4): 2
First cylinder (14-1044, default 14): 14
Last cylinder or +size or +sizeM or +sizeK(14-1044, default 1044): +2048M//主分区为2G
Command (m for help): w //写入分区表
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
5查看分区
[root@localhost ~]# fdisk -l
Disk /dev/sdc: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280bytes
Device Boot Start End Blocks Id System
/dev/sdc1 1 13 104391 83 Linux
/dev/sdc2 14 263 2008125 83 Linux
6格式化为ext3格式
[root@localhost ~]# mke2fs -j /dev/sdc1
[root@localhost ~]# mke2fs -j /dev/sdc2
7安装grub
[root@localhost ~]#mkdir /mnt/boot
[root@localhost ~]#mkdir /mnt/sysroot
[root@localhost ~]# mount /dev/sdc1/mnt/boot //挂载分区
[root@localhost ~]# mount /dev/sdc2/mnt/sysroot//挂载分区
[root@localhost ~]# grub-install--root-directory=/mnt/ /dev/sdc //安装grub
修改/mnt/boot/grub/device.map,只留下(hd0)/dev/sda
8修改initrd
关于initrd的更多的资料,可以参看我前面写的文章(linux 2.6内核initrd.img文件分析)。
[root@localhost ~]#cp /boot/vmlinuz-2.6.23.1-4/mnt/boot/vmlinuz
[root@localhost ~]#cp /boot/initrd-2.6.23.1-4.img/mnt/boot/initrd.img
[root@localhost ~]#mkdir /mnt/boot/1 //建立一个临时目录
[root@localhost ~]#cp /mnt/boot/initrd.img /mnt/boot/new/initrd.img
[root@localhost ~]#cd /mnt/boot/1
[root@localhost 1]#gzip -dc initrd.img |cpio –idvm //解压initrd.img
[root@localhost 1]#cp/lib/modules/2.6.23.1-4/kernel/drivers/scsi/ide-scsi.ko/mnt/boot/1/lib
修改/mnt/boot/1/init如下:
#!/bin/nash
mount -t proc /proc /proc
setquiet
echo Mounting proc filesystem
echo Mounting sysfs filesystem
mount -t sysfs /sys /sys
echo > /sys/power/suspend2/do_resume
echo Creating /dev
mount -o mode=0755 -t tmpfs /dev /dev
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 /dev/pts/dev/pts
mkdir /dev/shm
mkdir /dev/mapper
echo Creating initial device nodes
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mknod /dev/systty c 4 0
mknod /dev/tty c 5 0
mknod /dev/console c 5 1
mknod /dev/ptmx c 5 2
mknod /dev/rtc c 10 135
mknod /dev/tty0 c 4 0
mknod /dev/tty1 c 4 1
mknod /dev/tty2 c 4 2
mknod /dev/tty3 c 4 3
mknod /dev/tty4 c 4 4
mknod /dev/tty5 c 4 5
mknod /dev/tty6 c 4 6
mknod /dev/tty7 c 4 7
mknod /dev/tty8 c 4 8
mknod /dev/tty9 c 4 9
mknod /dev/tty10 c 4 10
mknod /dev/tty11 c 4 11
mknod /dev/tty12 c 4 12
mknod /dev/ttyS0 c 4 64
mknod /dev/ttyS1 c 4 65
mknod /dev/ttyS2 c 4 66
mknod /dev/ttyS3 c 4 67
echo Setting up hotplug.
hotplug
echo Creating block device nodes.
mkblkdevs
echo "Loading uhci-hcd.ko module"
insmod /lib/uhci-hcd.ko
echo "Loading ohci-hcd.ko module"
insmod /lib/ohci-hcd.ko
echo "Loading ehci-hcd.ko module"
insmod /lib/ehci-hcd.ko
mount -t usbfs /proc/bus/usb /proc/bus/usb
echo "Loading jbd.ko module"
insmod /lib/jbd.ko
echo "Loading ext3.ko module"
insmod /lib/ext3.ko
echo "Loading BusLogic.ko module"
insmod /lib/BusLogic.ko
echo "Loading libata.ko module"
insmod /lib/libata.ko
echo "Loading ata_piix.ko module"
insmod /lib/ata_piix.ko
echo Waiting for driver initialization.
stabilized --hash --interval 250/proc/scsi/scsi
echo "Loading ide-core.ko module"
insmod /lib/ide-core.ko
echo "Loading ide-disk.ko module"
insmod /lib/ide-disk.ko
echo "Loading ide-scsi.ko module"//添加SCSI硬盘驱动模块,增加IDE设备对SCSI的模拟,否则无法挂载文件系统
insmod /lib/ide-scsi.ko
mkblkdevs
echo Creating root device.
mkrootdev -t ext3 -o defaults,rw sda2 // 生成根目录设备 注意:一定要以rw(可读写)方式挂载,否则系统启动后无法修改和创建文件
echo Mounting root filesystem.
mount /sysroot
echo Setting up other filesystems.
setuproot
echo Switching to new root and runninginit.
switchroot
修改完成后,下面生成新的initrd.img,先删除旧的initrd.img。
[root@localhost 1]#del initrd.img
[root@localhost 1]# find ./ | cpio -c -o> initrd.img
26626 blocks
[root@localhost 1]# gzip -9 initrd.img
[root@localhost 1]# mv initrd.img.gzinitrd.img
[root@localhost 1]#cp initrd.img /mnt/boot/initrd.img
9再次修改grub
[root@localhost ~]#cp /boot/message/mnt/boot/message //引导画面,可以去掉
[root@localhost ~]#cp /boot/grub/grub.conf/mnt/boot/grub/grub.conf
修改如下:
default=0
timeout=20
gfxmenu (hd0,0)/message
title EmbeddedCE123
root(hd0,0)
kernel/vmlinuz ro root=/dev/sda2
initrd/initrd.img
10构建文件系统
10.1命令移植
[root@localhost~]# cd /mnt/sysroot/
[root@localhostsysroot]# mkdir -pv root bin sbin usr/{bin,sbin} lib dev tmp proc sys home mnt media boot //创建文件系统的基本框架
复制基本的命令 init bash。
[root@localhost sysroot]#cp /bin/bash /bin/bash
[root@localhostsysroot]#cp/sbin/init /sbin/init
查看命令所依赖的可文件:
[root@localhost sysroot]# ldd/bin/bash
linux-gate.so.1 => (0xb7f2d000)
libtermcap.so.2 =>/lib/libtermcap.so.2 (0xb7f12000)
libdl.so.2 => /lib/libdl.so.2 (0xb7f0d000)
libc.so.6 => /lib/libc.so.6(0xb7db6000)
/lib/ld-linux.so.2 (0xb7f2e000)
在宿主机中找到这些文件并拷贝到相应的目录下。同理,移植init命令。最后,这两个命令所需的库文件如下:
libc-2.6.so
libdl.so.2
libtermcap.so.2
ld-2.6.so
libc.so.6
libselinux.so.1
libtermcap.so.2.0.8
ld-linux.so.2
libdl-2.6.so
libsepol.so.1
10.2配置文件(/etc目录下的文件)
inittab文件的内容如下:
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
fstab文件的内容如下:
/dev/sda2 / ext3 defaults 0 0
/dev/sda1 /boot ext3 defaults 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
var /dev tmpfs defaults 0 0
rc.d/rc.sysinit文件的内容如下:
#!/bin/bash
echo -e " Welcome to EmbeddedCE123 Linux"
/bin/bash
给rc.sysinit赋执行权限
[root@localhostsysroot]# chmod +x /etc/rc.d/rc.sysinit
11测试
新建一个虚拟机,选择linux2.6xx ,挂载上这块硬盘。效果如下图所示:
相关推荐
sshxcute 就是这样一个框架工具集,它基于 JSCH 构建,允许工程师利用Java 代码通过 SSH 连接远程批量执行 Linux/UNIX 系统上的命令或者脚本,同时加入了判断成功与否,取回输出等多种实用功能。sshxcute 不管是针对...
本文探讨了一种基于Linux用户态的实时多任务调度框架ULight,旨在解决Linux内核调度器的调度开销巨大,无法满足实时应用需求的问题。ULight框架由三个核心模块组成:多任务调度模块、定时器模块和用户态中断处理模块...
路由转发依赖作为路由器的主机中安装多块网卡,当某一块网卡接收到数据包后,系统内核会根据数据包的目的IP地址,查询路由表,然后根据查询结果将数据包发送到另外一块网卡,最后通过此网卡把数据包发送出去。...
本文提出了一种在 Linux 平台上实现 IPSec 的框架,详细介绍了安全策略数据库 (SPD) 和安全关联数据库 (SAD) 的记录结构,分析了 Linux 的网络 IP 层代码,並給出了 IPSec 的原型和在核心的嵌入点。 IPSec 是一种...
EdgeX Foundry 是一个由Linux基金会托管的供应商中立的开源项目,旨在为物联网边缘计算构建一个通用的开放框架。该项目的核心是一个互操作性框架,该框架托管在一个完全与硬件和操作系统无关的参考软件平台中,以...
Linux系统具有高效的网络功能和稳定的性能,因此被广泛应用于服务器领域,Linux是云计算的核心组成部分,被广泛用于构建云平台和云服务。许多知名的云计算服务提供商都采用Linux系统作为其基础架构,一些游戏平台和...
本文给出了一个通用的线程池框架,该框架将与线程执行相关的任务进行了高层次的抽象,使之与具体的执行任务无关。另外该线程池具有动态伸缩性,它能根据执行任务的轻重自动调整线程池中线程的数量。文章的最后,我们...
Drogon是一个基于C 11的Http应用框架,使用Drogon可以方便的使用C 构建各种类型的Web应用服务端程序。
本项目旨在基于C++语言实现一个RPC分布式网络通信框架项目,使用CMake在Linux平台上构建编译环境。它可以将任何单体架构系统的本地方法调用重构为基于TCP网络的RPC远程方法调用。该框架实现了同一台机器的不同进程...
Linux系统具有高效的网络功能和稳定的性能,因此被广泛应用于服务器领域,Linux是云计算的核心组成部分,被广泛用于构建云平台和云服务。许多知名的云计算服务提供商都采用Linux系统作为其基础架构,一些游戏平台和...
qnapplication 调试环境:Red Hat 9.0;gcc 3.4
适用于嵌入式系统的DTV Linux设备框架构建.pdf
* POKY基于Linux、X窗口系统和GNOME Mobile的应用程序框架,旨在构建一套完整的现代软件包。 * POKY可以解决以下问题:指定编译工具链、程序和库之间的依赖关系、创建镜像、建立目标板上的安装包、建立本地安装包。 ...
简单点说,线程池就是有一堆已经创建好了的线程,初始它们都处于空闲等待状态,当有新的任务需要处理的时候,就从这个池子里面取一个空闲等待的线程来处理该任务,当处理完成了就再次把该线程放回池中,以供后面的...
sysinfo 使用 Python Flask 框架和 psutil 开发的一个中文版 Linux 服务器信息查看应用,可查看的信息包括系统、CPU、内存、硬盘、进程、网络、登录用户等,同时可查看并导出部分数据的图表。, Linux系统具有高效的...
该项目以Linux内核为核心,围绕其构建了一个完整的操作系统,包括各种系统工具、库、应用程序和硬件支持。 以下是Linux项目的一些主要特点和资料介绍: 开放源代码:Linux项目的所有源代码都是公开的,并允许任何...
Vim基于文本的UI框架
该项目以Linux内核为核心,围绕其构建了一个完整的操作系统,包括各种系统工具、库、应用程序和硬件支持。 以下是Linux项目的一些主要特点和资料介绍: 开放源代码:Linux项目的所有源代码都是公开的,并允许任何...
该项目以Linux内核为核心,围绕其构建了一个完整的操作系统,包括各种系统工具、库、应用程序和硬件支持。 以下是Linux项目的一些主要特点和资料介绍: 开放源代码:Linux项目的所有源代码都是公开的,并允许任何...