linux_根文件系统_rootfs

合集下载

bootload、kernel、rootfs

bootload、kernel、rootfs

嵌入式Linux系统的构建一、嵌入式Linux系统中的典型分区结构Root filesystemKernel二、各个结构的分析1、从咱们所学的硬件知识能够明白,在系统上电后需要一段程序来进行初始化(关闭WATCHDOG、改变系统时钟、初始化存储器操纵器、将更多的代码复制到内存中)。

简单的说bootload确实是这么一段小程序(相当于PC机中的BIOS),初始化硬件设备、预备好软件环境,最后挪用操作系统内核。

从某个观点上来看Bootload能够分为两种操作模式:启动模式和下载模式。

启动模式:上电后bootload从板子上的某个固态存储器上将操作系统加载到RAM中运行,整个进程并无效户的介入下载模式:在这种模式下,开发人员能够利用各类命令,通过串口连接或网络连接等通信手腕从主机下载文件,将它们直接放在内存运行或是烧入Flash类固态存储设备中。

Bootload能够分为两个时期:第一时期实现的功能:硬件设备初始化、为加载Bootload的第二时期代码预备RAM空间、复制Bootload的第二时期代码到RAM空间中、设置好栈、跳转到第二时期代码的C入口点第二时期:初始化本时期要利用的硬件设备、检测系统内存映射、将内核镜像和根文件映像从Flash上读到RAM空间中、为内核设置启动参数、挪用内核2、内核的结构:Linux内核文件数量快要2万,除去其他构架CPU的相关文件,支持S3C2410、S3C2440这两款芯片的完整内核文件有1万多个。

这些文件组织结构并非复杂,他们别离位于顶层目录下的17个子目录,各个目录功能独立Linu内核Makefile文件分类3、根文件系统嵌入式Linux 中都需要构建根文件系统,构建根文件系统的规那么在FHS(FilesystemHierarchy Standard)文档中,下面是根文件系统顶层目录。

三、根文件系统的制作一、进入到/opt/studyarm 目录,新建成立根文件系统目录的脚本文create_rootfs_bash,利用命令chmod +x create_rootfs_bash 改变文件的可执行限,./create_rootfs_bash 运行脚本,就完成了根文件系统目录的创建。

根文件系统(rootfs)

根文件系统(rootfs)

根文件系统(rootfs)展开全文一、根文件系统的作用是linux挂载的第一个文件系统,rootfs包含shell命令、linux系统配置文件(文件系统的挂载、网络服务、用户名、主机名、用户密码、环境变量...)、linux应用程序、应用程序处理的数据、独立的驱动模块(*.ko)。

根文件系统,相当于linux内核外围的一个应用环境。

====================================== ========================================= =========================二、控制台输出:[ 4.183226] yaffs: dev is 32505860 name is "mtdblock4" rw //存放rootfs的设备名字mtdblock4 ,rw可读写[ 4.183291] yaffs: passed flags ""[ 4.337878] VFS: Mounted root (yaffs filesystem) on device 31:4. //31:4 --》主设备:次设备号[ 4.338028] Freeing init memory: 536K ---->rootfs挂载成功,释放内核中一些初始化函数所占用的内存[ 4.357023] usb 1-1: New USB device found, idVendor=1a40, idProduct=0101[ 4.357083] usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=0[ 4.357145] usb 1-1: Product: USB 2.0 Hub[ 4.357747] hub 1-1:1.0: USB hub found[ 4.357852] hub 1-1:1.0: 4 ports detected[ 5.886184] smdkc110-rtc smdkc110-rtc: rtc disabled, re-enabling[ 6.086924] eth0: link down[ 6.087198] ADDRCONF(NETDEV_UP): eth0: link is not ready[root@YueQian /]#[root@YueQian /]#[root@YueQian /]#[root@YueQian /]#最小的根文件系统的内容:# ls /bin home media proc sys usrdev lib mnt root tmp varetc lost+found opt sbin====================================== ========================================= =========================三、根文件系统启动过程1、uboot的启动参数:init=/linuxrcinit是linux运行时的第一个进程,该进程执行的是/linuxrc 其中linuxrc -> bin/busyboxinit=/sbin/init 其中:init -> ../bin/busybox--------------------------------------------------------------------------------------------------------2、内核启动后,首先通过vfs去挂在rootfs,然后再执行init=/linuxrc ,linuxrc是busybox这个工作生成的文件。

嵌入式Linux中常见的文件系统及特点

嵌入式Linux中常见的文件系统及特点

嵌⼊式Linux中常见的⽂件系统及特点1、Linux可⽀持的⽂件系统有多种,但是这么多种的⽂件系统都是基于Linux内核所提供的⽂件系统VFS的接⼝API。

因此对于Linux内核级别实现的⽂件系统只有VFS虚拟⽂件系统; 其余实现的⽂件系统都是调⽤VFS⽂件系统的API更上⼀层实现的;2、Linux⽂件系统的组成结构: 1、⽤户层:⽤户层向外提供Linux内核所⽀持⽂件系统的VFS的API接⼝ 内核层:内核实现了所说的各种⽂件系统 驱动层:驱动层是块设备的驱动程序 硬件层:硬件层是不同⽂件系统⽀持的存储器;3、Linux启动时的⽂件系统: 硬件上电启动,各项硬件初始化后,第⼀个启动的⽂件系统时RootFS根⽂件系统,如果说根⽂件系统没有起来,系统出现异常、将重启;4、常⽤的⽂件系统运⾏、存储设备有: DRAM、SDRAM以及ROM其中常使⽤flash;5、根据不同的存储介质,常见的⽂件系统有: 基于Flash(Nor、Nand)的⽂件系统有: jffs2:可读写,数据压缩、⽀持哈希表的⽂件系统,掉电保护;缺点:不适合使⽤在⼤容量的Nand Flash中,内存使⽤量太⼤极⼤降低数据操作速度; yaffs:读写速度快,占⽤内存⼩,实现内存访问异常处理;混合的垃圾回收算法;特别适合嵌⼊式设备使⽤;跨平台、⾃带Nand 芯⽚驱动 cramfs:只读的⽂件系统,执⾏速度快,内容⽆法扩充;⽂件系统健壮; romfs:简单紧凑、只读、不⽀持动态擦写;较多使⽤在uclinux系统上; 基于RAM存储介质的⽂件系统: ramdisk:将⼀部分固定⼤⼩的内存当做分区使⽤,不能真正算的上实际的⽂件系统,更像是⼀种机制,将实际的⽂件系统加载到内存中;将⼀些经常被访问的⽽⼜不会更改的⽂件放⼊到内存中,达到提⾼系统效率的⽬的;同时还负责将内核镜像与⽂件系统⼀块加载到内存中; ramfs/tmpfs :基于内存的⽂件系统,⼯作于虚拟⽂件系统层,可以创建多个⽂件系统,可以指定每个⽂件系统最⼤使⽤内存;这种⽂件系统将所有的⽂件都放在RAM中,既可以提⾼读写速度,也可以避免对flash⼤量的读写操作;⽂件系统不可以格式化,占⽤内存⼤⼩可以指定; ⽹络⽂件系统: NFS:是⼀种基于⽹络共享技术,可以在不同平台、不同机器、不同操作系统上实现⽂件共享、⽂件传输;在嵌⼊式Linux系统初始开发阶段可以⾮常⽅便⽂件传输、⽂件修改;地址异常进⼊模式描述0x0000,0000复位管理模式电平复位0x0000,0004未定义指令异常未定义模式遇到不能处理的指令,⽆法识别的指令0x0000,000c 软件中断管理模式异常发⽣时CPU处理的步骤:R13(sp),R15(PC)1、保存当前执⾏位置:LR寄存器(R14)2、保存当前执⾏状态:CPSR3、寻找中断⼊⼝,中断向量表:PC寄存器找向量地址4、执⾏中断处理完成:5、中断返回,继续执⾏:R14 <exception_mode> = return linkSPSR<exception_mode>=CPSRCPSR[4:0] =exception mode number;/* 处理器⼯作模式控制位 */CPSR[5]=0; /* 使⽤ARM指令集 */If<exception_mode> == reset or FIQ thenCPSR[6]= 1;/* 屏蔽快速中断FIQ */CPSR[7]=1; /* 屏蔽外部中断IRQ */PC=exception vector address;复位异常中断处理程序的主要功能:1、设置异常中断向量表:2、初始化数据栈和寄存器:3、初始化存储系统MMU:4、初始化关键IO设备:5、使能中断:6、处理器切换到合适的模式:7、初始化C变量跳转到应⽤程序执⾏:R14<SVC> = 设置相应的值;SPSR<SVC> = 设置相应的值;CPSR[4:0]=0b10011;/* 进⼊特权模式 */CPSR[5]=0; /* 使⽤ARM指令集 */CPSR[6] =1; /* 禁⽌相关关闭FIQ */CPSR[7] =1; /* 禁⽌IRQ */If high vectors configured thenPC=0xffff,0000;ElsePC= 0x0000,0000;其余的异常以此类推;异常的优先级:1、Reset: 优先级1(最⾼)2、Data abort:23、FIQ:34、IRQ:45、Prefetch abort:56、SWI或者undefined instruction:6(最低),软件中断异常或者未定义指令异常ARM硬件接⼝:1、程序的链接地址和程序地址:ld程序链接地址程序链接地址:是程序运⾏的起始地址;程序地址:是程序保存在硬盘中的地址;2、呵呵呵。

buildroot make 原理

buildroot make 原理

buildroot make 原理一、什么是buildrootBuildroot是一个用于嵌入式Linux系统的简化和自动化构建工具。

它允许用户通过配置文件定制自己的Linux系统,并使用make命令自动构建整个系统。

Buildroot主要用于构建根文件系统(rootfs),它是Linux系统的基础,包含了操作系统运行所需的所有文件和目录。

二、make的基本原理在介绍buildroot的make原理之前,我们先来了解一下make的基本原理。

make 是一个基于文件时间戳的自动化构建工具,它通过比较源文件和目标文件的时间戳来判断是否需要重新编译。

make工具通过读取Makefile文件中的规则来执行构建过程。

Makefile中定义了目标(target)、依赖关系(prerequisites)和构建命令(recipe)。

当make命令执行时,它会根据Makefile中的规则来判断哪些目标需要重新构建。

make会先判断目标文件是否存在,如果不存在或者目标文件的时间戳早于依赖文件,则需要执行构建命令来生成目标文件。

构建命令可以是编译源代码、链接目标文件等。

构建命令执行完毕后,会更新目标文件的时间戳。

make会递归地处理所有的依赖关系,确保所有的依赖文件都是最新的。

这样,只有需要重新构建的目标才会执行相应的构建命令,提高了构建的效率。

三、buildroot的make原理buildroot使用make作为构建工具,通过读取Makefile来执行构建过程。

buildroot的Makefile是由Kconfig文件和一些其他的Makefile片段生成的。

1. Kconfig文件Kconfig文件是buildroot的配置文件,用于定义系统的配置选项。

Kconfig文件使用一种特定的语法来描述配置选项,包括菜单(menu)、菜单项(menuconfig)和配置项(config)等。

Kconfig文件中的配置选项会生成一个.config文件,用于指定构建rootfs所需的软件包和配置参数。

Linux通过nfs挂载根文件系统失败:VFS:Unabletomountrootfsvi。。。

Linux通过nfs挂载根文件系统失败:VFS:Unabletomountrootfsvi。。。
请求出错错误代码503请尝试刷新页面重试
Linux通过 nfs挂载根文件系统失败: VFS: Unabletomountrootfsvi。 。 。
在网上搜索各种资料均未解决。
最终发现原因是我的Ubuntu版本太新了,不兼容导致。
终于在大神的博客里找到解决方法:
查找资料发现从Ubuntu17.04开始,nfs默认只支持协议3和协议4,而kernel中默认支持协议2,所以才会出现挂载失败的情况,现有两种方 法可以解决该问题:
1. 设置Ubuntu18.04系统中的nfs服务支持协议2,修改nfs配置文件 /etc/default/nfs-kernel-server,在文件末尾加入一句:RPCNFSDOPTS="-nfs-version 2,3,4 --debug --syslog"。
2. 如果kernel版本较高支持nfs协议3的话,可以在Uboot传到Kernel的bootargs参数中加入'nfsvers=3',使kernel使用nfБайду номын сангаас协议3。

解决mount root fs问题的方法

解决mount root fs问题的方法

解决mount root fs问题的方法在Linux系统中,"mount root fs"问题是一个常见的技术难题,通常发生在系统启动过程中,由于根文件系统未能正确挂载而导致系统无法正常加载。

下面将详细介绍几种解决这一问题的方法。

一、理解"mount root fs"问题"mount root fs"问题指的是在Linux系统启动时,内核未能成功挂载作为根文件系统的分区。

这可能是由于多种原因造成的,如文件系统损坏、分区表错误、挂载选项问题等。

二、解决方法1.修复文件系统如果文件系统受损,可以使用fsck工具进行修复。

通常,在系统启动时,可以通过以下步骤进行:- 重启系统,进入GRUB引导加载器界面。

- 选择需要启动的Linux内核,按e键进入编辑模式。

- 找到以"linux"或"linux16"开头的行,通常包含启动参数。

- 在行尾添加"init=/bin/bash"或"rw init=/sysroot/bin/sh",按Ctrl + X或F10启动。

- 在紧急模式下,运行"fsck -y /dev/sdXn"(将sdXn替换为根文件系统的设备名和分区号)来检查和修复文件系统。

- 修复完成后,执行"exec /sbin/init"或"exec switchroot /sysroot"来继续启动。

2.修改GRUB启动参数如果是挂载选项问题,可以在GRUB启动参数中修改:- 同样进入GRUB编辑模式。

- 找到启动参数行,修改或添加"ro"为"rw",表示以读写模式挂载根文件系统。

- 或者,尝试移除"rhgb"(redhat graphics boot)和"quiet"参数,以便在启动过程中查看可能的错误信息。

BUSYBOX

BUSYBOX
ARM Linux 根文件系统(Root Filesystem)的制作
关于根文件系统的制作,网络上有很多文章,大多数 都只讲到建几个目 录,然后用 Busybox 做个 Shell,有很多关键的东西没有说。经过很长 时间的摸爬滚打,我终于能够白手起家建立一个根文件系统了。 其实我 也不懂得原理,只是告诉大家我的作法,其中也不免有错误,欢迎大家 指正。 首先介绍根文件系统的组成:目录、Shell、库、脚本,一个个 来。 目录 根文件系统要包含这些必须有的目录:/dev、/bin、/usr、/sbin、/lib、 /etc、/proc、/sys /dev 是 devfs(设备文件系统)或者 udev 的挂在点所在。在使用 devfs 的内核里如果没有/dev,根本见不到 Shell 启动的信息,因为内核找不 到 /dev/console;在使用 udev 的系统里,也事先需要在/dev 下建立 console 和 null 这两个节点。关于 devfs 和 udev 的区别, 网上很多文 章说。当然如果你的内核已经不支持 devfs 了(2.6.12 以后),可以使 用纯纯的静态节点。也就是用 mknod 人工生成。 /bin、 /usr/bin、/usr/sbin、/sbin 是编译 Busybox 这个 Shell 时候 就有的,用于存放二进制可执行文件,就不多解释了。 /lib 用于存放动态链接库。网上很多文章都说静态编译 Busybox,可以 省去建库的麻烦过程。这样做只能让 Busybox 启动,我们自己写的,或 者是编译的软 件包还是需要动态库的。 除非全部静态编译, 你可以试试, 一个 Hello world 就要几百 k。关于库的内容后面仔细说。 /etc 是用来存放初始 化脚本和其他配置文件的。关于初始化脚本的内 容后面仔细说。 /proc 是用来挂载存放系统信息虚拟文件系统——“proc 文件系统”, “proc 文件系统”在内核里面可以选。如果没有“proc 文件系统”, 很多 Shell 自己的命令就没有办法运行,比如 ifconfig。“proc 文件系 统”不像 devfs 可以自动挂载, 它需要使用初始化脚本挂载。 另外, udev 也需要“proc 文件系统”的支持。 /sys 用于挂载“sysfs 文件系 统”,“sysfs 文件系统”在内核里面可 以选。 目前我认为它就是给 udev 提供支持的, 呵呵。 “sysfs 文件系统” 也需要使用初始化脚本挂载。 另 外还可以有/tmp、/mnt、/swp、/var 这样的不是嵌入式系统必须的 目录,在说完 Shell 的制作之后,我再谈建立目录的事情。 Shell Shell 很简单,就是 Busybox,上网下载一个来: /downloads/。说 Busybox 和 arm- linux-gcc 有兼容性问题, 不过我觉得那是比较低版本的时代问题了, 我用 Busybox 1.8.2 和 arm-linux-gcc 3.4.1/3.3.2 都可以。 解压缩以后找到 Makefile 里面的 ARCH 和 CROSS_COMPILE,改成: ARCH ?= arm CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-

linux之fstab文件详解,实现rootfs根文件目录下prog和dapa的挂载

linux之fstab文件详解,实现rootfs根文件目录下prog和dapa的挂载

linux之fstab⽂件详解,实现rootfs根⽂件⽬录下prog和dapa的挂载mtdparts的格式如下:mtdparts=<mtddef>[;<mtddef]<mtddef> := <mtd-id>:<partdef>[,<partdef>]<partdef> := <size>[@offset][<name>][ro]<mtd-id> := unique id used in mapping driver/device<size> := standard linux memsize OR "-" to denote all remaining space<name> := (NAME)在使⽤的时候需要按照下⾯的格式来设置:mtdparts=mtd-id:<size1>@<offset1>(<name1>),<size2>@<offset2>(<name2>)这⾥⾯有⼏个必须要注意的:a. mtd-id必须要跟你当前平台的flash的``mtd-id⼀致,不然整个mtdparts会失效b. size在设置的时候可以为实际的size(xxM,xxk,xx),也可以为'-'这表⽰剩余的所有空间。

kernel⾥.config配置⽂件CONFIG_CMDLINE="mem=64M console=ttyS0,115200 mtdparts=nand0:8M(bootstrap/uboot/kernel)ro,16M(rootfs),16M(appbin),-(appdapa) root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 ubi.mtd=2 ubi.mtd=3 root=ubi0:rootfs"kernel分配8M,rootfs分配16M,appbin分配16M,剩余空间分配给appdapa/etc/fstab是⽤来存放⽂件系统的静态信息的⽂件。

uClinux 启动过程详细分析

uClinux 启动过程详细分析

uClinux 启动过程详细分析大家对uclinux的启动应该都比较熟悉,作为一名嵌入系统开发者,你一定遇到过下面的情景:在某论坛上看到一篇帖子,上面贴着uclinux开发板启动时的一堆信息,然后大家在帖子里讨论着这个启动过程中出现的问题,随机举例如下:Linux version 2.4.20-uc1 (root@Local) (gcc version 2.95.320010315 (release)(ColdFire patches - 20010318 from http://f(uClinux XIP and shared lib patches from /)) #20 三 6月 1 8 00:58:31 CST 2003Processor: Samsung S3C4510B revision 6Architecture: SNDS100On node 0 totalpages: 4096zone(0): 0 pages.zone(1): 4096 pages.zone(2): 0 pages.Kernel command line: root=/dev/rom0Calibrating delay loop... 49.76 BogoMIPSMemory: 16MB = 16MB totalMemory: 14348KB available (1615K code, 156K data, 40K init)Dentry cache hash table entries: 2048 (order: 2, 16384 bytes)Inode cache hash table entries: 1024 (order: 1,Mount-cache hash table entries: 512 (order: 0, 4096 bytes)Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)Page-cache hash table entries: 4096 (order: 2, 16384 bytes)POSIX conformance testing by UNIFIXLinux NET4.0 for Linux 2.4Based upon Swansea University Computer Society NET3.039Initializing RT netlink socketStarting kswapdSamsung S3C4510 Serial driver version 0.9 (2001-12-27) with no serial options en abledttyS00 at 0x3ffd000 (irq = 5) is a S3C4510BttyS01 at 0x3ffe000 (irq = 7) is a S3C451Blkmem copyright 1998,1999 D. Jeff DionneBlkmem copyright 1998 Kenneth AlbanowskiBlkmem 1 disk images:0: BE558-1A5D57 [VIRTUAL BE558-1A5D57] (RO)RAMDISK driver initialized: 16 RAM disks of 1024K size 1024 blocksizeSamsung S3C4510 Ethernet driver version 0.1 (2002-02-20) <mac@.tw>eth0: 00:40:95:36:35:34NET4: Linux TCP/IP 1.0 for NET4.0IP Protocols: ICMP, UDP, TCPIP: routing cache hash table of 512 buckets, 4KbytesTCP: Hash tables configured (established 1024 bind 1024)上面的这些输出信息,也可能包括你自己正在做的uclinux开发板的输出信息,其中的每一行,每一个字的含义,你是否深究过,或者说大部分的含义你能确切地知道的?本人想在这里结合本人在实践中一些体会来和广大uclinux的开发者一起读懂这些信息。

文件系统加载过程

文件系统加载过程

linux文件系统初始化过程(1)---概述术语表:struct task:进程struct mnt_namespace:命名空间struct mount:挂载点struct vfsmount:挂载项struct file:文件struct super_block:超级块struct dentry:目录struct inode:索引节点一、目的linux文件系统主要分为三个部分:文件系统调用;虚拟文件系统(VFS);挂载到VFS 的实际文件系统。

其中,VFS是核心,linux文件系统的本质就是在内存中创建一棵VFS树。

当根目录被创建后,用户就可以使用系统调用在VFS上创建文件、删除文件、挂载各种文件系统等操作。

该系列文章主要分析linux3.10文件系统初始化过程,分为三个阶段:1、挂载根文件系统(rootfs);2、加载initrd;3、挂载磁盘文件系统;二、常用数据结构linux文件系统中重要的数据结构有:文件、挂载点、超级块、目录项、索引节点等。

每个数据结构的具体实现请参见源代码,这里不再描述。

为了直观的表示数据结构之间的关系,请参见图1:图中含有两个文件系统(红色和绿色表示的部分),并且绿色文件系统挂载在红色文件系统tmp目录下。

一般来说,每个文件系统在VFS层都是由挂载点、超级块、目录和索引节点组成;当挂载一个文件系统时,实际也就是创建这四个数据结构的过程,因此这四个数据结构的地位很重要,关系也很紧密。

由于VFS要求实际的文件系统必须提供以上数据结构,所以不同的文件系统在VFS层可以互相访问。

如果进程打开了某个文件,还会创建file(文件)数据结构,这样进程就可以通过file来访问VFS的文件系统了。

另外,该图只给出了主要的关系结构,忽略了部分细节。

图1三、函数调用关系图2描述了文件系统初始化过程中主要的函数调用关系。

linux文件系统初始化过程主要分为三个阶段:1、vfs_caches_init()负责挂载rootfs文件系统,并创建了第一个挂载点目录:'/';2、rest_init()负责加载initrd文件,扩展VFS树,创建基本的文件系统目录拓扑;3、init程序负责挂载磁盘文件系统,并将文件系统的根目录从rootfs切换到磁盘文件系统;图2四、总结linux文件系统初始化过程主要分为三个阶段:挂载rootfs,提供第一个挂载点''/;加载initrd,扩展VFS树;执行init程序,完成linux系统的初始化。

NUC97XLinuxyaffs2根文件系统制作

NUC97XLinuxyaffs2根文件系统制作

NUC97XLinuxyaffs2根文件系统制作NUC97X Linux yaffs2 根文件系统制作ARM kernrl文件系统中只有一个根文件系统,根文件系统被加载后,还可以再挂载其它文件系统,互不影响。

比如可以在Nandflash,SPI, EMMC,SD,U盘等每个存储模块上挂载不同的文件系统。

每个存储部件又可以具体分为许多块,就像电脑里分成许多盘。

不同部件甚至不同的块也可以有不同的文件系统。

挂载根文件系统后,如果要继续在其它存储部件或不同的块上挂载其它文件系统,可以使用mount命令来实现。

不同的块要被文件系统识别,可以要么在kernel环境下,使用命令把它变成所需要的某种文件格式的块。

也可以使用工具把你要烧录的文件夹,其中可以为空文件做成文件系统可识别的镜像烧到存储区域。

Kernel中默认就有根文件系统,但该文件系统操作的区域为RAM 中,如创建或修改文件,掉电或复位后文件和数据即丢失。

因此要制作能挂载在flash等存储部件的根文件系统,指定具体存储部件和存储位置,以便在ARM平台上运行的kernel能识别系统文件,同事能够保存和同步文件和数据。

制作根文件系统是制作ARM平台的文件系统,而不是制作PC端linux平台的根文件系统。

根文件系统制作过程,参考:Linux BSP\nuc970bsp-release-20161108\Documents\ChineseNUC970 Linux 快速入门.pdf 3.8章节,5.3.1 基本系統設置章节,5.3.4 文件系統設置章节。

開機命令設置–以RAM為根文件系統的設定開機命令設置–以SPI Flash JFFS2文件系統為根文件系統的設定開機命令設置–以NAND Flash YAFFS2文件系統為根文件系統的設定開機命令設置–以NAND Flash UBIFS文件系統為根文件系統的設定開機命令設置–以NFS文件系統為根文件系統的設定開機命令設置–以NAND Flash YAFFS2文件系統為根文件系統的設定介绍一.1.NAND flash的设置使能MTD 的“Caching block device access to MTD devices Device drivers”驅動中的基本設置如果需要由U-boot環境變數傳入就必須將”Command line partition table parsing”選上, 否則會使用驅動程式裡的默認配置, 这里要把该项禁止。

简述linux的文件系统结构

简述linux的文件系统结构

简述linux的文件系统结构
Linux的文件系统结构是一个层次结构,从根目录(/)开始,每个目录都可以包含文件和子目录。

下面是主要目录的简要说明:
·/bin - 包含系统中最基本的命令(例如cp、ls、mv、rm等)。

·/boot - 包含用于启动系统的文件,如内核、引导装载程序等。

·/dev - 包含设备文件,如磁盘、键盘、鼠标等硬件设备。

·/etc - 包含系统的配置文件。

·/home - 包含所有用户的主目录。

·/lib - 包含与系统运行有关的库文件,如动态链接库。

·/media - 包含可插入媒体(如CD-ROM、DVD、USB驱动器等)的挂载点。

·/mnt - 包含临时挂载的文件系统。

·/opt - 用于安装附加软件包。

·/proc - 动态映射到正在运行的进程,系统信息等。

·/root - 管理员的主目录。

·/sbin - 包含系统管理员使用的系统命令和实用程序。

·/tmp - 用于存储临时文件。

·/usr - 包含用户安装的应用程序和文件。

·/var - 用于存储程序数据和日志文件。

嵌入式linux烧录步骤

嵌入式linux烧录步骤

嵌入式linux烧录步骤嵌入式Linux的烧录过程可以根据具体的开发板、芯片或厂商而有所不同,但一般步骤如下:准备工作:1.获取固件:下载或编译适用于你的嵌入式设备的Linux内核镜像和根文件系统。

2.连接烧录设备:将开发板或目标设备通过USB、JTAG或其他适配器连接到计算机。

烧录过程:1.烧录工具选择:根据硬件和厂商提供的指南选择适当的烧录工具,比如dd命令、flashcp、U-Boot工具等。

2.擦除存储器(如果需要):如果需要擦除存储器(如闪存),可以使用工具进行擦除。

注意备份数据(如果需要)。

3.烧录内核镜像:使用烧录工具将预编译或自定义的Linux内核镜像烧录到设备的闪存中。

示例命令(使用dd命令烧录)sudo dd if=your_kernel_image of=/dev/sdX bs=4Mif=指定输入文件,of=指定设备路径(请替换为你的设备路径),bs=指定块大小。

4.烧录根文件系统:将根文件系统烧录到设备的闪存或存储介质中。

示例命令(使用dd命令烧录)sudo dd if=your_rootfs_image of=/dev/sdX bs=4M5.配置启动选项:根据需要,配置引导加载程序(如U-Boot)以引导新烧录的内核和文件系统。

6.断开连接并启动设备:完成烧录后,断开连接并重新启动嵌入式设备,使其加载新的内核和根文件系统。

注意事项:●在执行烧录操作之前,请确保你理解并确认要烧录的目标设备和存储介质。

●仔细阅读并遵循硬件厂商提供的烧录指南和文档。

●在烧录过程中小心操作,避免误操作导致数据丢失或损坏设备。

●这些步骤提供了一般性的指南,实际操作可能因设备、开发板和硬件环境而有所不同。

initramfs如何切入真实linux文件系统

initramfs如何切入真实linux文件系统

initramfs如何切入真实linux文件系统initramfs切入真实linux文件系统initramfs切入真实linux文件系统主要用到switch_root命令。

通常initramfs都是为安装最终的根文件系统做准备工作,它的最后一步需要安装最终的根文件系统,然后切换到新根文件系统上去。

以往的基于ramdisk 的initrd 使用pivot_root命令切换到新的根文件系统,然后卸载ramdisk。

但是initramfs是rootfs,而rootfs 既不能 pivot_root,也不能umount。

busybox的解决方案是,提供了switch_root命令,完成全部的处理过程,使用起来非常方便。

switch_root命令的格式是:switch_root [-c /dev/console] NEW_ROOT NEW_INIT [ARGUMENTS_TO_INIT]其中NEW_ROOT是实际的根文件系统的挂载目录,执行switch_root命令前需要挂载到系统中;NEW_INIT是实际根文件系统的init程序的路径,一般是/sbin/init;-c /dev/console是可选参数,用于重定向实际的根文件系统的设备文件,一般情况我们不会使用;ARGUMENTS_TO_INIT则是传递给实际的根文件系统的init程序的参数,也是可选的。

特别注意switch_root命令必须由PID=1的进程调用,也就是必须由initramfs的init程序直接调用,不能由init派生的其他进程调用,否则会出错,提示: switch_root: not rootfs也是同样的原因,init脚本调用switch_root命令必须用exec命令调用,否则也会出错,提示: switch_root: not rootfs示例下面是个人写的一个init文件,把分区写到命令里了,你可以从“/proc/cmdline”中读取内核参数来找到要切换的分区。

Linux系统裁剪、自定义内核、busybox系统定制

Linux系统裁剪、自定义内核、busybox系统定制

Linux系统裁剪、⾃定义内核、busybox系统定制字体颜⾊:T_RED="\\033[1;31m" # bold+redT_GREEN="\\033[1;32m" # bold+greenT_YELLOW="\\033[1;33m" # bold+yellowT_BLUE="\\033[1;34m" # bold+blueT_CYAN="\\033[1;36m" # cyanT_BOLD="\\033[1;37m" # bold+whiteT_NORM="\\033[0;39m" # normal系统启动流程:POST-->BIOS(Boot Sequence)--> BootLoader(MBR)--> Kernel(initrd,initramfs)--> init (/etc/inittab)⾸先加电⾃检,加电⾃检是怎么完成的,计算机本⾝不会执⾏程序,由此先去载⼊⼀段程序,系统刚刚启动的时候,它能够实现将某个RAM中的程序映射到CPU可以寻址的地址空间中去,并且让CPU能够执⾏其中的指令,这些指令⽆法是完成系统检测,当检测完成以后,如果所有的硬件或基本硬件、核⼼硬件没有问题的话,接下来进⼊下⼀步根据BIOS当中所设定的系统启动流程去找那个对应设备上的MBR,根据引导次序去挨个逐个的去找那个对应的存储设备上的MBR,如果说MBR存在的话,则回去读取MBR中的bootloader,bootloader是⼀段程序,对于早些的设备来讲这个bootloader空间,或者MBR留给bootloader空间⼀共是512bytes,但是⽤于bootloader有446bytes,在bootloader当中配置了所要引导的操作系统的内核的位置,因此BIOS被载⼊内存以后,当它实现将控制权限转交给bootloader以后,那么bootloader就接收了整个系统的控制权限,⽽后根据⽤户的选择去读取相应操作系统的内核,将内核装载进内存当中合适的位置,解压缩,并完成内核初始化以后,接下来bootloader会将控制权限转交给内核,内核在初始化时主要完成硬件探测、装载驱动、这个驱动程序可能在内核当中,也可能在另外⼀个辅助⽂件当中initrd(RHEL 5 ramdisk、RHEL 6 ramfs),在RHEL 6中叫initramfs,这⾥⾯有内核所需要依赖到的额外的其他的设备驱动,尤其是根⽂件系统的驱动,接下来挂载根⽂件系统,当根⽂件系统挂载完成之后,接下来启动⽤户空间中的第⼀个进程叫init,这是内核初始化的基本任务,如果内核要完成初始化,它需要依赖于驱动程序,这些驱动程序如果没有被直接做在内核当中,那就需要到某个⽂件系统路径下去装载这个驱动程序,但是在真正根⽂件系统被挂载之前就出现⼀个难题,如果内核访问这个根⽂件系统那个设备,需要⽤到某个驱动程序的话,内核中没有,它就需要到⽂件系统当中找这个驱动程序,但是这个⽂件系统本⾝⼜没有挂载,所以要想访问⽂件系统得先找到驱动,要访问驱动得先找到⽂件系统,所以出现这样的难题,就是借助与initrd为内核提供访问真正的根⽂件系统所需要基本驱动程序,所以initrd是个辅助性的、过渡性的中间层,它能够实现将kernel和真正的根⽂件系统连接起来,所以当连接完成之后,它就没有意义了,当kernel初始化完成以后接下来执⾏init进程,⽽init本⾝的配置⽂件是/etc/inittab,在RHEL 6上不再是传统的init,⽽是upstart,⽽upstart的配置⽂件是/etc/inittab和/etc/init*.conf,upstart是个项⽬名称,这个程序为了兼容它依然较Init,也就意味着RHEL 6上的init不再是传统的init了,它是⼀个被称作较upstart的init程序,这个程序和传统的有着巨⼤的区别,⽽upstart本⾝它的配置⽂件/etc/inittab和/etc/init/*.conf⽂件,依然以RHEL 5来讲,init主要完成那些⼯作,这主要取决于inittab⽂件;RHEL 6:upstart(项⽬名称) --> init /etc/inittab /etc/init*.conf内核初始化: 硬件探测 装载驱动 挂载根⽂件系统(rootfs) 启⽤⽤户空间中的第⼀个进程init/etc/inittab: 设定默认运⾏级别 系统初始化(/etc/rc.d/rc.sysinit) 运⾏指定级别的服务脚本 /etc/rc.d/init.d/ /etc/rc.d/rc#.d rc0.d--rc6.d K* S* 00-99:运⾏次序 启动虚拟终端 启动图形终端/etc/rc.d/rc.sysinit: 系统初始化脚本 检测并以读写⽅式重新挂载根⽂件系统; 设定主机名; 检测并挂载/etc/fstab中的其它⽂件系统; 启动swap分区; 初始化外围硬件设备的驱动; 根据/etc/sysctl.conf设定内核参数; 激活udev和selinux; 激活LVM和RAID设备; 清理过期锁和PID⽂件; 装载键映射;/etc/inittabid:3:initdefault: (默认运⾏级别)si::sysinit:/etc/rc.d/rc.sysinit (系统初始化脚本)/etc/rc.d/rc.sysinitechoinsmodifconfig/bin/bashshutdown -r -hhalt 关机reboot 重启poweroff 关机init 0 关机init 6 重启1、关机和重启;2、主机名;3、运⾏对应服务脚本;4、启动终端;5、运⾏⽤户;6、定义单⽤户级别;7、装载⽹卡驱动,启⽤⽹络功能;8、提供⼀个web服务器;9、设定内核参数;busybox: ⼆进制程序,1M⼤⼩,能模拟数百个命令的使⽤;Kernel:RHEL5, RHEL6定制安装: ⾃动化安装 定制引导盘mount -n: 挂载时不更新/etc/mtab⽂件;cat /proc/mounts脚本编程知识点:1、变量中字符的长度:${#VARNAME}⼩Linux制作过程:在现有linux虚拟机增加⼀块20G的IDE硬盘,并对磁盘进⾏分区和创建⽂件系统,将创建的⽂件系统挂载到/mnt/boot和/mnt/sysroot⽬录;[root@localhost ~]# fdisk -l(查看系统上磁盘及分区情况)Disk /dev/hda: 21.4 GB, 21474836480 bytes15 heads, 63 sectors/track, 44384 cylindersUnits = cylinders of 945 * 512 = 483840 bytesDisk /dev/hda doesn't contain a valid partition tableDisk /dev/sda: 53.6 GB, 53687091200 bytes255 heads, 63 sectors/track, 6527 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Blocks Id System/dev/sda1 * 1 13 104391 83 Linux/dev/sda2 14 2624 20972857+ 83 Linux/dev/sda3 2625 2755 1052257+ 82 Linux swap / Solaris[root@localhost ~]# fdisk /dev/hda(管理磁盘分区,进⼊交互式模式)Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabelBuilding a new DOS disklabel. Changes will remain in memory only,until you decide to write them. After that, of course, the previouscontent won't be recoverable.The number of cylinders for this disk is set to 44384.There is nothing wrong with that, but this is larger than 1024,and could in certain setups cause problems with:1) software that runs at boot time (e.g., old versions of LILO)2) booting and partitioning software from other OSs(e.g., DOS FDISK, OS/2 FDISK)Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)Command (m for help): n(创建分区)Command actione extendedp primary partition (1-4)p(主分区)Partition number (1-4): 1(分区编号)First cylinder (1-44384, default 1):Using default value 1Last cylinder or +size or +sizeM or +sizeK (1-44384, default 44384): +20M(创建20M分区)Command (m for help): n(创建分区)Command actione extendedp primary partition (1-4)p(主分区)Partition number (1-4): 2(分区编号)First cylinder (43-44384, default 43):Using default value 43Last cylinder or +size or +sizeM or +sizeK (43-44384, default 44384): +512M(创建512M分区)Command (m for help): w(保存退出)The partition table has been altered!Calling ioctl() to re-read partition table.Syncing disks.[root@localhost ~]# partprobe /dev/hda(让内核重新扫描分区表)[root@localhost ~]# fdisk -l /dev/hda(查看/dev/hda分区情况)Disk /dev/hda: 21.4 GB, 21474836480 bytes15 heads, 63 sectors/track, 44384 cylindersUnits = cylinders of 945 * 512 = 483840 bytesDevice Boot Start End Blocks Id System/dev/hda1 1 42 19813+ 83 Linux/dev/hda2 43 1101 500377+ 83 Linux[root@localhost ~]# mke2fs -j /dev/hda1(将/dev/hda1创建为带⽇志的⽂件系统,即ext3⽂件系统)mke2fs 1.39 (29-May-2006)Filesystem label=OS type: LinuxBlock size=1024 (log=0)Fragment size=1024 (log=0)4968 inodes, 19812 blocks990 blocks (5.00%) reserved for the super userFirst data block=1Maximum filesystem blocks=204472323 block groups8192 blocks per group, 8192 fragments per group1656 inodes per groupSuperblock backups stored on blocks:8193Writing inode tables: doneCreating journal (1024 blocks): doneWriting superblocks and filesystem accounting information: doneThis filesystem will be automatically checked every 27 mounts or180 days, whichever comes first. Use tune2fs -c or -i to override.[root@localhost ~]# mke2fs -j /dev/hda2(将/dev/hda2创建为带⽇志的⽂件系统,即ext3⽂件系统)mke2fs 1.39 (29-May-2006)Filesystem label=OS type: LinuxBlock size=1024 (log=0)Fragment size=1024 (log=0)125488 inodes, 500376 blocks25018 blocks (5.00%) reserved for the super userFirst data block=1Maximum filesystem blocks=6763315262 block groups8192 blocks per group, 8192 fragments per group2024 inodes per groupSuperblock backups stored on blocks:8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409Writing inode tables: doneCreating journal (8192 blocks): doneWriting superblocks and filesystem accounting information: doneThis filesystem will be automatically checked every 27 mounts or180 days, whichever comes first. Use tune2fs -c or -i to override.[root@localhost ~]# mkdir /mnt/{boot,sysroot}(创建/mnt/boot⽬录和/mnt/sysroot⽬录,花括号{}展开)[root@localhost ~]# mount /dev/hda1 /mnt/boot/(将/dev/hda1挂载到/mnt/boot/⽬录)[root@localhost ~]# mount /dev/hda2 /mnt/sysroot/(将/dev/hda2挂载到/mnt/boot/⽬录)[root@localhost ~]# mount(查看系统所有挂载的⽂件系统)/dev/sda2 on / type ext3 (rw)proc on /proc type proc (rw)sysfs on /sys type sysfs (rw)devpts on /dev/pts type devpts (rw,gid=5,mode=620)/dev/sda1 on /boot type ext3 (rw)tmpfs on /dev/shm type tmpfs (rw)none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)/dev/hda1 on /mnt/boot type ext3 (rw)/dev/hda2 on /mnt/sysroot type ext3 (rw)[root@localhost ~]# tree /mnt/(查看/mnt⽬录树)/mnt/|-- boot| `-- lost+found`-- sysroot`-- lost+found4 directories, 0 files提供内核:[root@localhost ~]# cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz(复制vmlinuz-2.6.18-308.el5到/mnt/boot/⽬录叫vmlinuz)制作initrd⽂件:[root@localhost ~]# mkdir test(创建test⽬录)[root@localhost ~]# cd test/(切换到test⽬录)[root@localhost test]# zcat /boot/initrd-2.6.18-308.el5.img | cpio -id(不解压initrd⽂件查看内容将结果送给管道,通过cpio展开到当前⽬录)12218 blocks[root@localhost test]# ls(查看当前⽬录⽂件及⼦⽬录)bin dev etc init lib proc sbin sys sysroot[root@localhost test]# vim init(编辑init程序)mkrootdev -t ext3 -o defaults,ro /dev/hda2(以只读⽅式挂载根⽂件系统)#echo "Loading dm-mem-cache.ko module"#insmod /lib/dm-mem-cache.ko#echo "Loading dm-mod.ko module"#insmod /lib/dm-mod.ko#echo "Loading dm-log.ko module"#insmod /lib/dm-log.ko#echo "Loading dm-region_hash.ko module"#insmod /lib/dm-region_hash.ko#echo "Loading dm-message.ko module"#insmod /lib/dm-message.ko#echo "Loading dm-raid45.ko module"#insmod /lib/dm-raid45.ko#echo Waiting for driver initialization.#stabilized --hash --interval 1000 /proc/scsi/scsi(没有scsi盘,所以也注释掉)#resume LABEL=SWAP-sda3(注释掉交换分区):.,+20s@^@#@g(搜索当前⾏向下加20⾏,搜索所有⾏⾸的添加#号)提⽰:装载dm(Device Mapper逻辑卷设备)模块其实对我们都没有⽤,因为我们并没有把根⽂件系统做在⼀个所谓的逻辑卷上;[root@localhost test]# cd lib/(切换到lib⽬录)[root@localhost lib]# ls(查看当前⽬录⽂件及⼦⽬录)ahci.ko dm-mem-cache.ko dm-raid45.ko ext3.ko libata.ko mptspi.ko scsi_transport_spi.koata_piix.ko dm-message.ko dm-region_hash.ko firmware mptbase.ko ohci-hcd.ko sd_mod.kodm-log.ko dm-mod.ko ehci-hcd.ko jbd.ko mptscsih.ko scsi_mod.ko uhci-hcd.ko[root@localhost lib]# rm -f dm-*(强制删除dm开头的所有⽂件)[root@localhost lib]# lsahci.ko ehci-hcd.ko firmware libata.ko mptscsih.ko ohci-hcd.ko scsi_transport_spi.ko uhci-hcd.koata_piix.ko ext3.ko jbd.ko mptbase.ko mptspi.ko scsi_mod.ko sd_mod.ko[root@localhost test]# find . | cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.gz(查找当前⽬录的所有⽂件,将结果通过管道送给cpio归档,-H指定备份时欲使⽤的⽂件格式,newc指cpio归档⽂件⽬录结构,把当前⽬录下每⼀个⽂件包括它的⼦⽬录整个映射路径统统给它按原有的路径格式进⾏保存,并且能够⽀持多于512200个⽂件,默认情况下cpio归档所⽀持的⽂件个数⾮常少,newc表⽰新规范的⽅式来进⾏归档,⽀持更多的⽂件数量,--quie表⽰静默模式,不输出信息,-o表⽰创建归档⽂件,将结果送给管道通过gzip进⾏压缩,-9指定压缩级别,保存⾄/mnt/boot/⽬录较initrd.gz)[root@localhost lib]# ls -lh /mnt/boot/(查看/mnt/boot⽬录⽂件详细信息,并进⾏单位换算)total 2.3M-rw-r--r-- 1 root root 374K Dec 2 02:48 initrd.gzdrwx------ 2 root root 12K Dec 2 02:14 lost+found-rw-r--r-- 1 root root 1.9M Dec 2 02:17 vmlinuz安装grub:[root@localhost ~]# grub-install --root-directory=/mnt/ /dev/hda(安装grub,根⽬录/mnt,设备/dev/hda)Probing devices to guess BIOS drives. This may take a long time.Installation finished. No error reported.This is the contents of the device map /mnt//boot/grub/device.map.Check if this is correct or not. If any of the lines is incorrect,fix it and re-run the script `grub-install'.(fd0) /dev/fd0(hd0) /dev/hda(hd1) /dev/sda[root@localhost ~]# ls /mnt/boot/(查看/mnt/boot⽬录⽂件及⼦⽬录)grub initrd.gz lost+found vmlinuz提⽰:检测/mnt/boot⽬录有没有刚安装的grub;提供grub配置⽂件:[root@localhost ~]# vim /mnt/boot/grub/grub.conf(编辑grub.conf配置⽂件)default=0timeout=3title Smoke Linux(2.6.18)root(hd0,0)kernel /vmlinuzinitrd /initrd.gz提供真正的根⽂件系统:[root@localhost ~]# cd /mnt/sysroot/(切换到/mnt/sysroot⽬录)[root@localhost sysroot]# mkdir -pv etc/rc.d/init.d bin sbin proc sys dev lib root mnt media var/{log,run,lock/subsys,tmp} usr/{bin,sbin,local} tmp home opt boot(添加系统所需要的⽬录)mkdir: created directory `etc'mkdir: created directory `etc/rc.d'mkdir: created directory `etc/rc.d/init.d'mkdir: created directory `bin'mkdir: created directory `sbin'mkdir: created directory `proc'mkdir: created directory `sys'mkdir: created directory `dev'mkdir: created directory `lib'mkdir: created directory `root'mkdir: created directory `mnt'mkdir: created directory `media'mkdir: created directory `var'mkdir: created directory `var/log'mkdir: created directory `var/run'mkdir: created directory `var/lock'mkdir: created directory `var/lock/subsys'mkdir: created directory `var/tmp'mkdir: created directory `usr'mkdir: created directory `usr/bin'mkdir: created directory `usr/sbin'mkdir: created directory `usr/local'mkdir: created directory `tmp'mkdir: created directory `home'mkdir: created directory `opt'mkdir: created directory `boot'提⽰:etc/{rc.d/init.d} bin sbin proc sys dev是最核⼼的,var usr可以独⽴分区,未必是必须的,lib得有,tmp home可以单独分区,root不能单独分区,管理员家⽬录此时没有管理员的概念,所以不是核⼼的,usr可以单独分区,所以也不是核⼼的,mnt media不能分区,是挂载点,boot是在真正的根上挂载hda1的;[root@localhost sysroot]# ls(查看你当前⽬录⽂件及⼦⽬录)bin boot dev etc home lib lost+found media mnt opt proc root sbin sys tmp usr var创建配置⽂件:[root@localhost sysroot]# vim etc/inittab(编辑inittab⽂件)id:3:initdefault:(启动默认级别)si::sysinit:/etc/rc.d/rc.sysinit(初始化脚本)[root@localhost sysroot]# vim etc/rc.d/rc.sysinit(边界初始化脚本)#!/bin/bash#echo -e "\tWelcome to \033[34Smoke\033[0m Linux"(\t缩进⼀个TAB键)/bin/bash[root@localhost sysroot]# chmod +x etc/rc.d/rc.sysinit(给rc.sysinit⽂件执⾏权限)通过脚本抑制命令和命令依赖的库⽂件:[root@localhost ~]# cat bincopy.sh(查看bincopy.sh脚本)#!/bin/bash#DEST=/mnt/sysrootlibcp() {LIBPATH=${1%/*}[ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH[ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1 finished."}bincp() {CMDPATH=${1%/*}[ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH[ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATHfor LIB in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`;dolibcp $LIBdone}read -p "Your command:" CMDuntil [ $CMD == 'q' ];do! which $CMD && echo "Wrong command" && read -p "Input againe" CMD && continueCOMMAND=`which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`bincp $COMMANDecho "copy $COMMAND finishd."read -p "Continue:" CMDdone[root@localhost ~]# ./bincopy.sh(执⾏移植命令和依赖的库⽂件脚本)Your command:init/sbin/initcopy lib /lib/libsepol.so.1 finished.copy lib /lib/libselinux.so.1 finished.copy lib /lib/libc.so.6 finished.copy lib /lib/libdl.so.2 finished.copy lib /lib/ld-linux.so.2 finished.copy /sbin/init finishd.Continue:bash/bin/bashcopy lib /lib/libtermcap.so.2 finished.copy /bin/bash finishd.Continue:ls/bin/lscopy lib /lib/librt.so.1 finished.copy lib /lib/libacl.so.1 finished.copy lib /lib/libpthread.so.0 finished.copy lib /lib/libattr.so.1 finished.copy /bin/ls finishd.Continue:q[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)测试通过切换根⽂件系统:[root@localhost ~]# chroot /mnt/sysroot/(切换根⽂件系统)bash-3.2# lsbin boot dev etc home lib lost+found media mnt opt proc rc.d root sbin sys tmp usr varbash-3.2# ls /etc/inittab rc.dbash-3.2# exitexit测试:将虚拟机挂起,将制作好的⼩Linux系统的IDE的硬盘添加到新创建的虚拟机系统;通过echo⼀段话保存到/tmp/a.txt⽂件⾥⾯,提⽰只读⽂件系统,所以根⽂件系统是只读的;切换到宿主机:[root@localhost ~]# ./bincopy.sh(当前⽬录执⾏bincopy.sh脚本,复制命令及命令依赖的库⽂件)Your command:touch/bin/touchcopy /bin/touch finishd.Continue:mkdir/bin/mkdircopy /bin/mkdir finishd.Continue:rm/bin/rmcopy /bin/rm finishd.Continue:mv/bin/mvcopy /bin/mv finishd.Continue:cp/bin/cpcopy /bin/cp finishd.Continue:cat/bin/catcopy /bin/cat finishd.Continue:mount/bin/mountcopy lib /lib/libblkid.so.1 finished.copy lib /lib/libuuid.so.1 finished.copy lib /lib/libdevmapper.so.1.02 finished.copy /bin/mount finishd.Continue:umount/bin/umountcopy /bin/umount finishd.Continue:vi/bin/vicopy /bin/vi finishd.Continue:vim/usr/bin/vimcopy lib /usr/lib/libncurses.so.5 finished.copy lib /usr/lib/libgpm.so.1 finished.copy lib /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so finished.copy lib /lib/libresolv.so.2 finished.copy lib /lib/libutil.so.1 finished.copy lib /lib/libm.so.6 finished.copy lib /lib/libnsl.so.1 finished.copy lib /lib/libcrypt.so.1 finished.copy /usr/bin/vim finishd.Continue:chmod/bin/chmodcopy /bin/chmod finishd.Continue:chown/bin/chowncopy /bin/chown finishd.Continue:ping/bin/pingcopy /bin/ping finishd.Continue:ifconfig/sbin/ifconfigcopy /sbin/ifconfig finishd.Continue:insmod/sbin/insmodcopy /sbin/insmod finishd.Continue:modprobe/sbin/modprobecopy /sbin/modprobe finishd.Continue:rmmod/sbin/rmmodcopy /sbin/rmmod finishd.Continue:route/sbin/routecopy /sbin/route finishd.Continue:halt/sbin/haltcopy /sbin/halt finishd.Continue:reboot/sbin/rebootcopy /sbin/reboot finishd.Continue:shutdown/sbin/shutdowncopy /sbin/shutdown finishd.Continue:hostname/bin/hostnamecopy /bin/hostname finishd.Continue:q[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)挂载宿主机,切换到⼩Linux系统:注意:启动⼩Linux系统完成之后,它没法⾃动完成将根⽂件系统重新挂载为可读写,所以应该编写rc.sysinit配置⽂件,让它可读写;挂载为可读写:mount -o remount,rw / :读写⽅式挂载根⽂件系统,-o指定额外的挂载选项,也即指定⽂件系统启⽤的属性,⼤部分选项都可以使⽤no option进⾏关闭此功能,如果指定多个功能属性,选项之间通过逗号隔开即可,remount重新挂载当前⽂件系统,把卸载和挂载⼀块来使⽤,先卸载再挂载,重新挂载可以不指定挂载点,rw读写挂载;提⽰:报错,/etc/mtab追踪当前系统挂载每⼀个⽂件系统,不带任何选项的mount命令所显⽰的内容被保存在/etc/mtab当中,以后挂载的每⼀个⽂件系统只要挂载都会保存到/etc/mtab当中,卸载⼀个⽂件系统,它会从/etc/matb当中删除,但是此时整个根都是只读的,所以挂载⽂件系统,不能将挂载的内容写⼊到/etc/mtab当中,那怎么办,mount 有个-n选项,在挂载的时候不更新/etc/mtab⽂件,mount -n: 挂载时不更新/etc/mtab⽂件;cat /proc/mounts:mounts⽂件也会显⽰当前系统上所挂载的所有⽂件系统;通过mount -n -o remount,rw /重新挂载根⽂件系统:不让报can't create locak file /etc/mtab~520: Read-only file system (use -n flag ride)错误;提⽰:⼜报错,读取不到/etc/fastab⽂件,说明重新挂载也会读取/etc/fstab⽂件,但是挂载已经完成了;提⽰:创建/tmp/a.txt⽂件成功,但是/tmp⽬录的权限应该是1777的;测试halt命令关机:提⽰:halt命令会⾃动完成切换到级别0,只是把当前进程关掉了,它没办法完成切断电源的,如何切断电源halt有个-p选项,在执⾏关机的时候,能够直接切断电源的;但是切断电源以后,它仍然⽆法把bash进程,halt命令是在bash进程中提⽰执⾏的,那就意味着halt是bash的⼦进程,所以使⽤halt命令只能关闭⼦进程⾃⾝,对⽗进程没有关系,如果让⽗进程⼀并关掉的话,有个命令叫exec查看exec命令帮助:提⽰:执⾏Exec⽂件,⽽且执⾏的时候是以当前bash直接替换为那个进程(简单来讲,默认情况下,我们所谓在bash命令下执⾏halt进程,它就在bash下执⾏⼀个⼦进程,⽽当我们使⽤exec的时候,不是这样的,当在命令提⽰符执⾏halt命令以后,halt进程⼀起来,这个⽗进程就没有了,它以⼦进程直接替换⽗进程的,⽽不是成为⽗进程的⼦进程,exec表⽰让启动的⼦进程直接替换原有的进程,⽽不是作为它的⼦进程来执⾏的,这样⼀来halt⼀结束,这样的bash也就结束了)exec halt -p:让exec命令启动halt命令⽽且直接替换原有的bash进程;提⽰:还是不⾏,事实上当指定halt命令它会切换到0级别下去了,根当前级别没有关系,所以还要执⾏对应级别下的操作才可以,那于是应该把halt命令放到对应级别下可执⾏⽂件⾥⾯,并且执⾏halt命令的时候,或者执⾏关机命令的时候,它能够⾃动去完成那个执⾏对应级别下的K*开头的脚本和S*开头的脚本,把S*开头的脚本都start起来,把K*开头的脚本都stop掉,所以还要修改它的执⾏流⾏,由此可见使⽤命令关机是关不掉的;切换到宿主机:给⼩Linux系统提供⼀个脚本:关机:[root@localhost ~]# cd /mnt/sysroot/(切换到/mnt/sysroot⽬录)[root@localhost sysroot]# ls(查看当前⽬录⽂件及⼦⽬录)bin boot dev etc home lib lost+found media mnt opt proc root sbin sys tmp usr var[root@localhost sysroot]# vim etc/rc.d/rc.sysdone(编辑rc.sysdone脚本)#!/bin/bash#sync(当执⾏关键命令时候,如果此前写⼊⼀些内容进去,需要将这些内容从内存同步到磁盘上去)sleep 2(睡眠2秒)sync(再同步⼀次,确保所有的⽂件都同步完成)exec /sbin/halt -p(使⽤halt绝对路径,不使⽤绝对路径可能找不到,因为不登录,它可能没有path环境变量)[root@localhost sysroot]# chmod +x etc/rc.d/rc.sysdone(给rc.sysdone⽂件执⾏权限)[root@localhost sysroot]# cd(切换到根⽤户家⽬录)通过脚本移植sync和sleep命令:[root@localhost ~]# ./bincopy.sh(当前⽬录执⾏bincopy.sh脚本)Your command:sync/bin/synccopy /bin/sync finishd.Continue:sleep/bin/sleepcopy /bin/sleep finishd.Continue:q[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)提⽰:此时还没有做完整,还需要编辑etc/inittab⽂件[root@localhost ~]# cd /mnt/sysroot/(切换到/mnt/sysroot⽬录)[root@localhost sysroot]# vim etc/inittab(编辑inittab⽂件)id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc.sysdone(运⾏在0级别的时候执⾏/etc/rc.d/rc.sysdone脚本)[root@localhost sysroot]# sync(同步磁盘写⼊)[root@localhost sysroot]# sync(同步磁盘写⼊)[root@localhost sysroot]# sync(同步磁盘写⼊)测试:挂起宿主机,切换到⼩Linux系统;使⽤init 0可以正常关机;重启:[root@localhost ~]# cd /mnt/sysroot/(切换到/mntsysroot⽬录)[root@localhost sysroot]# vim etc/inittab(编辑inittab⽂件)id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc.sysdonel6:6:wait:/etc/rc.d/rc.reboot(在6级别下执⾏rc.reboot脚本)[root@localhost sysroot]# vim etc/rc.d/rc.reboot(编辑rc.reboot脚本)#!/bin/bash#syncsleep 1syncexec /sbin/reboot[root@localhost sysroot]# chmod +x etc//rc.d/rc.reboot(给rc.reboot脚本执⾏权限)[root@localhost sysroot]# sync(同步磁盘写⼊)[root@localhost sysroot]# sync(同步磁盘写⼊)[root@localhost sysroot]# sync(同步磁盘写⼊)测试:挂起宿主机,切换到⼩Linux系统;使⽤init 6可以正常重启;提⽰:如果在此处修改⼩Linux系统,再回到宿主机可能会出现⽂件系统崩溃的,因为两个主机改⼀个磁盘,⽽且那个主机是挂起的,所以刚才改的内容,宿主机不知道;实现对应级别下的服务脚本实现关机和重启:[root@localhost ~]# cd /mnt/sysroot/(切换到/mnt/sysroot⽬录)[root@localhost sysroot]# vim etc/rc.d/init.d/halt(编辑halt脚本)#!/bin/bash#case $0 in ($0取得脚本路径名称,通过脚本名称来判断重启还是关机)*reboot)COMMAND=`/sbin/reboot ;;*halt)COMMAND=`/sbin/halt -p ;;*)echo "Only call this script by *reboot OR *halt;";;esaccase $1 instart);;stop);;*)echo "Usage: `basename $0` {start|stop}" (basename $0获取脚本名称);;esacexec $COMMAND[root@localhost sysroot]# chmod +x etc/rc.d/init.d/halt(给halt脚本执⾏权限)[root@localhost sysroot]# cd etc/rc.d/(切换到etc/rc.d⽬录)[root@localhost rc.d]# mkdri rc0.d rc6.d(创建rc0.d和rc6.d⽬录)[root@localhost rc.d]# cd rc0.d/(切换到rc0.d⽬录)[root@localhost rc0.d]# ln -sv ../init.d/halt S99halt(给../init.d/halt⽂件创建软连接叫S99halt,并显⽰创建过程,99代表最后关机)create symbolic link `S99halt' to `../init.d/halt'提⽰:S99halt,S代表start在相应级别下启动该脚本,,当执⾏S99halt,脚本取得halt选择关机[root@localhost rc0.d]# ll(查看当前⽬录⽂件及⼦⽬录)total 1lrwxrwxrwx 1 root root 14 Nov 22 04:07 S99halt -> ../init.d/halt[root@localhost rc0.d]# cd ../rc6.d/(切换到rc6.d⽬录)[root@localhost rc6.d]# ln -sv ../init.d/halt S99reboot(给../init.d/halt⽂件创建软连接叫S99reboot,并显⽰创建过程,99代表最后重启)create symbolic link `S99reboot' to `../init.d/halt'提⽰:S99reboot,S代表start在像应级别下启动该脚本,当执⾏S99reboot,脚本取得reboot选择重启;[root@localhost rc6.d]# cd ..(切换到上级⽬录)[root@localhost rc.d]# rm -f rc.reboot rc.sysdone(强制删除rc.reboot和rc.sysdone脚本)[root@localhost rc.d]# ls(查看当前⽬录⽂件及⼦⽬录)init.d rc0.d rc6.d rc.sysinit[root@localhost rc.d]# sync(同步磁盘写⼊)[root@localhost rc.d]# sync(同步磁盘写⼊)[root@localhost rc.d]# sync(同步磁盘写⼊)[root@localhost rc.d]# vim rc(编辑rc脚本)#!/bin/bash#RUNLEVEL=$1(接受⼀个参数,相当于运⾏级别)for I in /etc/rc.d/rc$RUNLEVEL.d/K*;do$I stopdonefor I in /etc/rc.d/rc$RUNLEVEL.d/S*;do$I startdone提⽰:当RUNLEVEL参数为0执⾏/etc/rc.d/rc0.d/K*所有脚本停⽌,执⾏/etc/rc.d/rc0.d/S*所有脚本启动,当RUNLEVEL参数为6执⾏/etc/rc.d/rc6.d/K*所有脚本停⽌,执⾏/etc/rc.d/rc6.d/S*所有脚本启动;[root@localhost rc.d]# chmod +x rc(给rc脚本执⾏权限)[root@localhost rc.d]# cd ..(切换到上级⽬录)[root@localhost etc]# vim inittab(编辑inittab脚本)id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc 0l6:6:wait:/etc/rc.d/rc 6[root@localhost etc]# sync(同步磁盘写⼊)[root@localhost etc]# sync(同步磁盘写⼊)[root@localhost etc]# sync(同步磁盘写⼊)测试:挂起宿主机,切换到⼩Linux系统;测试重启,可以正常重启;测试关机,可以正常关机;提⽰:由于没有K*开头的脚本所以提⽰报错;如何实现在对应级别下启动服务:[root@localhost sysroot]# vim etc/inittab(编辑etc/inittab⽂件)id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc 0l6:6:wait:/etc/rc.d/rc 6l3:3:wait:/etc/rc.d/rc 3[root@localhost sysroot]# cd etc/rc.d/(切换到etc/rc.d⽬录)[root@localhost rc.d]# mkdir rc3.d(创建rc3.d⽬录)[root@localhost rc.d]# ls(查看当前⽬录⽂件及⼦⽬录)init.d rc rc0.d rc3.d rc6.d rc.sysinit[root@localhost rc.d]# vim init.d/tserver(编辑tserver脚本)#!/bin/bash#prog=`basename $0`(取得脚本路径的基名,也就是脚本名称)lockfile=/var/lock/subsys/$progstart() {echo "Starting $prog ..."touch $lockfile}stop () {echo "Stopping $prog ..."rm -f $lockfile}status() {if [ -f $lockfile ];thenecho "Running..."elseecho "Stopped..."fi}usage() {echo "Usage: $prog {start|stop|status|restart}"}case $1 instart)start ;;stop)stop ;;restart)stopstart;;status)status;;*)usageexit 1;;esac提⽰:如果tserver⽂件存在说明服务启动,不存在说明服务没启动,关闭服务删除tserver⽂件;[root@localhost rc.d]# chmod +x init.d/tserver(给tserver执⾏权限)[root@localhost rc.d]# init.d/tserver start(执⾏tserver脚本)Starting tserver ...[root@localhost rc.d]# ls /var/lock/subsys/tserver(查看/var/lock/subsys/tserver⽂件存在)/var/lock/subsys/tserver[root@localhost rc.d]# init.d/tserver stop(执⾏tserver脚本)Stopping tserver ...[root@localhost rc.d]# ls /var/lock/subsys/tserver(查看/var/lock/subsys/tserver⽂件不存在)ls: /var/lock/subsys/tserver: No such file or directory[root@localhost rc.d]# init.d/tserver status(执⾏tserver脚本)Stopped...[root@localhost rc.d]# init.d/tserver statuss(执⾏tserver脚本)Usage: tserver {start|stop|status|restart}将脚本做成chkconfig调⽤的脚本:[root@localhost rc.d]# vim init.d/tserver#!/bin/bash## chkconfig: 35 66 33 (chkconfig调⽤的服务脚本,35代表3和5级别启动,66代表启动优先次序,33代表关闭优先次序)# description: test service script (描述信息)prog=`basename $0`lockfile=/var/lock/subsys/$progstart() {}stop () {echo "Stopping $prog ..."rm -f $lockfile}status() {if [ -f $lockfile ];thenecho "Running..."elseecho "Stopped..."fi}usage() {echo "Usage: $prog {start|stop|status|restart}"}case $1 instart)start ;;stop)stop ;;restart)stopstart;;status)status;;*)usageexit 1;;esac让脚本在3级别启动起来:[root@localhost rc.d]# cd rc3.d/(切换到rc3.d⽬录)[root@localhost rc3.d]# ln -sv ../init.d/tserver S66tserver(创建软连接,并显⽰创建过程,创建为S66tserver)create symbolic link `S66tserver' to `../init.d/tserver'提⽰:S66tserver中的S代表启动,66代表启动优先次序,其中66要和服务脚本中chkconfig 35 66 33中的启动优先次序的数字要⼀样;[root@localhost rc3.d]# ll(查看当前⽬录⽂件及⼦⽬录详细信息)total 1lrwxrwxrwx 1 root root 17 Nov 22 05:08 S66tserver -> ../init.d/tserver[root@localhost rc3.d]# cd ..(切换到上层⽬录)[root@localhost rc.d]# cd rc0.d/(切换到rc0.d⽬录)[root@localhost rc0.d]# ln -sv ../init.d/tserver K33tserver(创建软连接,并显⽰创建过程,创建为K33tserver)create symbolic link `K33tserver' to `../init.d/tserver'提⽰:K33tserver中的K代表停⽌,33代表停⽌优先次序,其中33要和服务脚本中chkconfig 35 66 33中的停⽌优先次序的数字要⼀样;[root@localhost rc0.d]# cd ../rc6.d/(切换到上层⽬录下的rc6.d⽬录)[root@localhost rc6.d]# ln -sv ../init.d/tserver K33tserver(创建软连接,并显⽰创建过程,创建为K33tserver)create symbolic link `K33tserver' to `../init.d/tserver'提⽰:K33tserver中的K代表停⽌,33代表停⽌优先次序,其中33要和服务脚本中chkconfig 35 66 33中的停⽌优先次序的数字要⼀样;[root@localhost rc6.d]# ll(查看当前⽬录⽂件及⼦⽬录)total 2lrwxrwxrwx 1 root root 17 Nov 22 05:16 K33tserver -> ../init.d/tserverlrwxrwxrwx 1 root root 14 Nov 22 04:10 S99reboot -> ../init.d/halt[root@localhost rc6.d]# sync(同步磁盘写⼊)[root@localhost rc6.d]# sync(同步磁盘写⼊)[root@localhost rc6.d]# sync(同步磁盘写⼊)提⽰:此时3级别仍然没有⽤的;[root@localhost rc6.d]# cd ../../(切换到上层⽬录的上层⽬录)[root@localhost etc]# ls(查看当前⽬录⽂件及⼦⽬录)inittab rc.d[root@localhost etc]# vim inittab(编辑inittab⽂件)id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc 0l6:6:wait:/etc/rc.d/rc 6l3:3:wait:/etc/rc.d/rc 3提⽰:当执⾏到si的时候,会执⾏etc/rc.d/rc.sysinit脚本,这个脚本直接启动了/bin/bash,因此3级别的脚本不会执⾏,为什么0级别和6级别会执⾏,我们使⽤init切换过去⽽已,所以此时3级别不可能会随系统启动的,因为执⾏流程不到这⾥,到si::sysinit:/etc/rc.d/rc.sysinit已经完成系统启动了,因为在rc.sysinit脚本已经直接执⾏了/bin/bash了,那么RHEL 5的系统是如何启动的,为什么它会执⾏呢,它不是在/etc/rc.d/rc.sysinit登录的系统,⽽是在inittab⽂件⾥⾯还有⼏个tty终端,所以它们的执⾏流程是正常的,我们此时执⾏流程不正常,那该怎么办?[root@localhost etc]# man mingetty(查看mingetty的man帮助⽂档)[root@localhost etc]# cat /etc/inittab(查看inittab⽂件)## inittab This file describes how the INIT process should set up# the system in a certain run-level.## Author: Miquel van Smoorenburg, <miquels@># Modified for RHS Linux by Marc Ewing and Donnie Barnes## Default runlevel. The runlevels used by RHS are:# 0 - halt (Do NOT set initdefault to this)# 1 - Single user mode# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)# 3 - Full multiuser mode# 4 - unused# 5 - X11# 6 - reboot (Do NOT set initdefault to this)#id:3:initdefault:# System initialization.si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc 0l1:1:wait:/etc/rc.d/rc 1l2:2:wait:/etc/rc.d/rc 2l3:3:wait:/etc/rc.d/rc 3l4:4:wait:/etc/rc.d/rc 4l5:5:wait:/etc/rc.d/rc 5l6:6:wait:/etc/rc.d/rc 6# Trap CTRL-ALT-DELETEca::ctrlaltdel:/sbin/shutdown -t3 -r now# When our UPS tells us power has failed, assume we have a few minutes# of power left. Schedule a shutdown for 2 minutes from now.# This does, of course, assume you have powerd installed and your# UPS connected and working correctly.pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"# If power was restored before the shutdown kicked in, cancel it.pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"# Run gettys in standard runlevels1:2345:respawn:/sbin/mingetty tty12:2345:respawn:/sbin/mingetty tty23:2345:respawn:/sbin/mingetty tty34:2345:respawn:/sbin/mingetty tty45:2345:respawn:/sbin/mingetty tty56:2345:respawn:/sbin/mingetty tty6# Run xdm in runlevel 5x:5:respawn:/etc/X11/prefdm -nodaemon提⽰:系统的/etc/inittab⽂件在不同级别下的脚本执⾏完成以后开始执⾏1:2345:respawn:/sbin/mingetty tty1-6:2345:respawn:/sbin/mingetty tty6(在2345级别下,都启动了6个终端),使⽤/sbin/mingetty命令启动的,所以当执⾏完si::sysinit:/etc/rc.d/rc.sysinit脚本以后,它会继续往下执⾏3级别下的l3:3:wait:/etc/rc.d/rc 3这个脚本的,⽽si::sysinit:/etc/rc.d/rc.sysinit脚本⾥⾯是没有启动/bin/bash的,我们让它启动了/bin/bash这是不合理的;[root@localhost etc]# vim inittab(编辑inittab⽂件)id:3:initdefault:。

Linux内核移植与根文件系统构建

Linux内核移植与根文件系统构建

Linux内核移植
10、SCSI device support
如果有SCSI 设备(SCSI 控制卡,硬盘或光驱等)则选上这项。目前SCSI 设备类型已经比较多,要具体区分它们你得先了解他们所使用的控制 芯片类型。2.6.X 内核中对各类型SCSI设备已经有更具体详细的支持。 <*> scsi support; <*>scsi disk support;
Linux内核移植
5、Networking option
网络选项,它主要是关于一些网络协议的选项。Linux 功能也就是在于 对网络功能的灵活支持。这部分内容相当多,根据不同情况,一般我 们把以下几项选上。 5.1、 packet socket 包协议支持,有些应用程序使用Packet 协议直接同网络设备通讯, 而不通过内核中的其它中介协议。同时它可以让你在TCP 不能用时找 到一个通讯方法。 5.2、 unix domain socket 对基本UNIX socket 的支持 5.3、 TCP/IP networking 对TCP/IP 协议栈的支持,当然要。如果你的内核很在意大小,而且 没有什么网络要就,也不使用类似X Window 之类基于Unix Socket 的应用那你可以不选,可节省大约144K 空间。
二、内核与根文件系统实验
• • • • 安装完成后依次执行以下命令: [root# root] Make dep [root# root] Make [root# root] Make PREFIX=./root install
由于根文件系统是内核启动时挂载的第一个文件系统那么根文件系统就要包括linux启动时所必须的目录和关键性的文件例如linux启动时都需要有init目录下的相关文件在linux挂载分区时linux一定会找etcfstab这个挂载文件等根文件系统中还包括了许多的应用程序bin目录等任何包括这些linux系统启动所必须的文件都可以成为根文件系统

使用Buildroot制作根文件系统

使用Buildroot制作根文件系统

使用Buildroot制作根文件系统Buildroot是一个用于构建嵌入式Linux根文件系统的工具,它提供了简单易用的配置方式和快速构建系统,可以帮助用户快速构建出自己的根文件系统。

Buildroot支持许多不同的架构和硬件平台,并集成了许多开源软件包,可以根据用户的需求来进行定制。

在本文中,我们将介绍使用Buildroot制作根文件系统的步骤和注意事项。

一、安装Buildroot在开始使用Buildroot制作根文件系统之前,需要先安装Buildroot。

可以在官方网站上下载最新版本的Buildroot,然后解压缩到本地目录。

在解压缩之后,进入到Buildroot的目录,可以看到有一个名为Makefile的文件,这是Buildroot的主要配置文件。

二、配置BuildrootConfigure Buildroot的过程就是创建一个默认的配置文件,通过这个默认配置文件生成根文件系统。

执行以下命令:```make menuconfig```这个命令将打开一个配置菜单,其中包括了一些基本的选项和一些高级选项。

基本选项包括选择所需的架构、选择和配置内核和交叉编译工具链等。

此外,还可以选择要安装的软件包、文件系统类型、文件系统大小等选项。

三、编译Buildroot完成配置后,就可以开始编译Buildroot。

执行以下命令:```make```这个命令将依照之前的配置文件,将所需的软件包下载、交叉编译、配置、安装,然后将所有安装的文件打包成 rootfs.tar 文件。

四、安装根文件系统在编译成功之后,就可以将根文件系统安装到目标平台上。

在目标平台上,先将 rootfs.tar 文件解压缩,然后将解压缩后的文件拷贝到目标文件系统的根目录下。

这里需要注意的是,需要将交叉编译的库和工具链一并拷贝到目标平台上。

五、启动目标平台在将根文件系统安装到目标平台之后,就可以启动目标平台并开始使用它了。

如果一切都配置正确的话,应该可以看到一个基本的 Linux 终端界面。

linux之rootfs(UBIFS)

linux之rootfs(UBIFS)

resolve.conf dns nameserver 202.96.134.133 hostname init.d/rcS hostname mx27 passwd group shadow / / PC
1 passwd 7 6
21
32
x
MD5 DES 4 3 ID 5 4 ID 6 5
76
87
shell 9 10 Group 4 3
fstab mount -a
type options
dump pass 7 8 #for mdev 9 proc
/proc proc defaults
0 010 sysfs
/sys
sysfs defaults
0 011 12 #ma
inittab
1 # see busybox/examples/inittab 2 3 # Boot-time system configuration/initialization script. 4 # This is run first except when booting in single-user mode. 5 ::sysinit:/etc/init.d/rcS 6 7 #Start an "askfirst" shell on the console (whatever that may be) 8 #use res
-m -e
-c
barebox ubiattach
barebox erase /dev/nand0.root ubiattach /dev/nand0.root ubimkvol /dev/ubi0 root 0 dhcp tftp ubifs.img /dev/ubi0.root

白话容器基础(三):深入理解容器镜像

白话容器基础(三):深入理解容器镜像

⽩话容器基础(三):深⼊理解容器镜像在前两次的分享中,我讲解了 Linux 容器最基础的两种技术:Namespace 和 Cgroups。

希望此时,你已经彻底理解了“容器的本质是⼀种特殊的进程”这个最重要的概念。

⽽正如我前⾯所说的,Namespace 的作⽤是“隔离”,它让应⽤进程只能看到该 Namespace 内的“世界”;⽽ Cgroups 的作⽤是“限制”,它给这个“世界”围上了⼀圈看不见的墙。

这么⼀折腾,进程就真的被“装”在了⼀个与世隔绝的房间⾥,⽽这些房间就是 PaaS 项⽬赖以⽣存的应⽤“沙盒”。

在 Linux 操作系统⾥,有⼀个名为 chroot 的命令可以帮助你在 shell 中⽅便地完成这个⼯作。

顾名思义,它的作⽤就是帮你“change root file system”,即改变进程的根⽬录到你指定的位置。

实际上,Mount Namespace 正是基于对 chroot 的不断改良才被发明出来的,它也是 Linux 操作系统⾥的第⼀个 Namespace。

当然,为了能够让容器的这个根⽬录看起来更“真实”,我们⼀般会在这个容器的根⽬录下挂载⼀个完整操作系统的⽂件系统,⽐如Ubuntu16.04 的 ISO。

这样,在容器启动之后,我们在容器⾥通过执⾏ "ls /" 查看根⽬录下的内容,就是 Ubuntu 16.04 的所有⽬录和⽂件。

⽽这个挂载在容器根⽬录上、⽤来为容器进程提供隔离后执⾏环境的⽂件系统,就是所谓的“容器镜像”。

它还有⼀个更为专业的名字,叫作:rootfs(根⽂件系统)。

所以,⼀个最常见的 rootfs,或者说容器镜像,会包括如下所⽰的⼀些⽬录和⽂件,⽐如 /bin,/etc,/proc 等等对 Docker 项⽬来说,它最核⼼的原理实际上就是为待创建的⽤户进程:启⽤ Linux Namespace 配置;设置指定的 Cgroups 参数;切换进程的根⽬录(Change Root)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、什么是文件系统(Filesystem)
文件系统是包括在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区的目录结构;一个可应用的磁盘设备可以包含一个或多个文件系统;如果您想进入一个文件系统,首先您要做的是挂载(mount)文件系统;为了挂载(mount)文件系统,您必须指定一个挂载点。

二、主要嵌入式采用的文件系统
* Linux 中,rootfs 是必不可少的。

PC 上主要实现有ramdisk 和直接挂载HD(Harddisk,硬盘) 上的根文件系统;嵌入式中一般不从HD 启动,而是从Flash 启动,最简单的方法是将rootfs load 到RAM 的RAMDisk,稍复杂的就是直接从Flash 读取的Cramfs,更复杂的是在Flash 上分区,并构建JFFS2 等文件系统。

* RAMDisk 将制作好的rootfs 压缩后写入Flash,启动的时候由Bootloader load 到RAM,解压缩,然后挂载到/。

这种方法操作简单,但是在RAM 中的文件系统不是压缩的,因此需要占用许多嵌入式系统中稀有资源RAM。

ramdisk 就是用内存空间来模拟出硬盘分区,ramdisk通常使用磁盘文件系统的压缩存放在flash中,在系统初始化时,解压缩到SDRAM并挂载根文件系统, 在linux系统中,ramdisk有二种,一种就是可以格式化并加载,在linux内核2.0/2.2就已经支持,其不足之处是大小固定;另一种是2.4的内核才支持,通过,ramfs来实现,他不能被格式化,但用起来方便,其大小随所需要的空间增加或减少,是目前linux常用的ramdisk技术.
* initrd 是RAMDisk 的格式,kernel 2.4 之前都是image-initrd,Kernel 2.5 引入了cpio-initrd,大大简化了Linux 的启动过程,附合Linux 的基本哲学:Keep it simple, stupid(KISS). 不过cpio-initrd 作为新的格式,还没有经过广泛测试,嵌入式Linux 中主要采用的还是image-initrd。

* Cramfs 是Linus 写的很简单的文件系统,有很好的压缩绿,也可以直接从Flash 上运行,不须load 到RAM 中,因此节约了RAM。

但是Cramfs 是只读的,对于需要运行时修改的目录(如:/etc, /var, /tmp)多有不便,因此,一般将这些目录做成ramfs 等可写的fs。

* SquashFS 是对Cramfs 的增强。

突破了Cramfs 的一些限制,在Flash 和RAM 的使用量方面也具有优势。

不过,据开发者介绍,在性能上可能不如Cramfs。

这也是一种新方法,在嵌入式系统采用之前,需要经过更多的测试
三、建一个包含所有文件的目录
1。

建一个目录rootfs 用来装文件系统
2。

mkdir bin dev etc lib proc sbin tmp usr var
3. ln -fs bin/busybox linuxrc(使用busybox)
4. 到系统/dev 把所有的device打一个包,拷贝到dev下面(最省事的做法);
5。

将编译好的busybox拷贝到/bin下面,除了busybox外,所有其他的命令都是他的link
所有的命令你可以在busybox下面用make menuconfig来增减
6。

同样/sbin下面也是busybox的link
halt ifconfig init insmod klogd losetup lsmod mkswap modprobe reboot rmmod route swapoff swapon
7。

同样/usr/bin下面也是busybox的link
basename dirname env free id logger reset tail tr tty uptime which xargs
awk cut du expr head killall mkfifo sort test traceroute uniq wc whoami yes
上面几乎是最全的link,各个看官可以酌情删减,不过link也不占什么空间!
8。

同样/usr/sbin下面放着所有编译完的可执行文件,具体就不多说了
9。

非常重要之/lib,务必重视
找到你编译环境的target目录,把需要的lib文件先用strip压縮(非target目录下的,而已编译环境提供的strip),先把最基本的libc, ld等等,必须同样做跟target/lib里面一样的link。

然后根据特定的应用加相应的lib,不要把不用的加进去,lib比较占空间。

10。

在/etc下面加上需要的配置文件,最最重要的是rcS
四、生成一个ramdisk
五、生成一个cramfs
找到cramfs的toolchain。

/mkcramfs -r $(FS1_DIR) $(FS_NAME).1
六、生成一个mksquashfs
找到squashfs的toolchain。

/mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments -noI
做文件系统最困难和最可能出问题的地方是在/lib库和/dev方面,请大家多注意这两方面。

相关文档
最新文档