嵌入式ROOTFS transplantation
作一个嵌入式Linux rootfs,并且实现 web 服务
1. 文件系统简介
•主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。
【1】文件系统
挂载文件系统
mount -t vfat /dev/mmcblk1p1 /mnt
挂载 指定需要挂载的文件系统的类型 设备节点(文件) 挂载点(文件系统挂载到rootfs的地方)
【2】内核调试
1)点灯是用 GPIO 作为输出,观察程序运行阶段和状态的方法
2)printk
内核解压后
信息输出显示是在 console 初始化之后
printascii
console初始化前
printk打印级别:数字越低,级别越高
- #define KERN_EMERG "<0>" /* system is unusable */
- #define LERT "<1>” /* action must be taken immediately */
- #define KERN_CKERN_ARIT "<2>" /* critical conditions */
- #define KERN_ERR "<3>" /* error conditions */
- #define KERN_WARNING "<4>" /* warning conditions */
- #define KERN_NOTICE "<5>" /* normal but significant condition */
- #define KERN_INFO "<6>" /* informational */
- #define KERN_DEBUG "<7>" /* debug-level messages
ubuntu系统:
通过proc在运行时查看和修改日志级别
cat /proc/sys/kernel/printk
4 4 1 7
echo “7 4 1 7” >/proc/sys/kernel/printk
cat /proc/sys/kernel/printk
7 4 1 7
3)OOPS
pc寄存器保存内核崩溃时,运行的地址
定位 系统崩溃时的地址
linux@ubuntu:~/work/day_2/linux-3.14-fs4412$ arm-none-linux-gnueabi-addr2line 0xc0278e1c
-e vmlinux -f
指定定位镜像文件 指定出错的文件以及行号
dm9000_probe
/home/linux/work/day_2/linux-3.14-fs4412/drivers/net/ethernet/davicom/dm9000.c:1414
调试信息一般显示在两个地方 :终端、log日志
klogd进程:执行系统调用,去访问内核的打印消息
syslog进程:记录非内核打印的消息
void openlog(const char *ident, int option, int facility);
功能:打开日志
参数:ident 日志的标志
option LOG_PID Include PID with each message. 打印的消息附加上进程ID
把消息显示到log日志
facility 表示的是消息出自于什么类型的进程
LOG_DAEMON system daemons without separate facility value
void syslog(int priority, const char *format, ...);
功能:将消息显示到日志中
参数:priority 级别
LOG_WARNING warning conditio
LOG_INFO informational message
LOG_DEBUG debug-level message
void closelog(void);
功能:关闭日志
查看日志消息: var/log/syslog日志
【3】文件系统
文件系统:文件存储的格式
文件系统的类型:
磁盘文件系统:驻留在磁盘上的文件系统
FAT16、FAT32、NTFS、EXT2、EXT3、EXT4
网络文件系统:可以远程访问的文件系统
nfs(network filesystem)
内存文件系统:存在内存上的文件系统
tmpfs
只读文件系统:
cramfs
根文件系统(root filesystem)是存放运行、维护系统所必须的各种工具软件、库文件、脚本、
配置文件和其他特殊文件的地方,也可以安装各种软件包。
根文件系统是内核运行之后,加载的第一个文件系统,是其他文件系统的根,可用来挂载其他类型的文件系统,也可视其为特殊的文件系统
必须存在,不存在内核无法运行
文件系统的目录结构:
/etc 存放内核所需要的配置文件(启动文件)
====================================================================
/bin: 普通用户和root用户都能执行的基本程序
ping, mknod, mount, tar, grep, gzip, etc
/sbin: root用户能执行的基本程序
int, insmod, route, mkfs, rmmod, ifconfig
====================================================================
/usr/bin: 更多非必须的用户程序
autorun, bibtex, latex, biff, ftp, wc, whereis, whoami
/usr/sbin: 更多非必须的root工具程序
automount, httpd, in.telnetd, in.talkd, sendmail
====================================================================
/proc 挂载proc文件系统,记录进程的信息
/sys 挂载sysfs文件系统,记录内核所需的特殊文件,设备,总线等信息
/mnt 临时挂载点,挂载其他文件系统使用
/tmp 临时挂载点,挂载其他文件系统使用
====================================================================
/dev 设备节点(文件)
【4】根文件系统的制作
1)make
生成bin sbin usr/bin usr/sbin linuxrc
2)mkdir dev etc mnt proc var tmp sys root
3)/etc
inittab fstab init.d/rcS profile
inittab
|
|
fstab
|
|
init.d ---- rcS
|
|
profile
1)initab 内核在加载rootfs的时候,解析该文件
- ::sysinit:/etc/init.d/rcS 文件系统中运行第一个脚本
- :askfirst:-/bin/sh 指定脚本的类型
- ::restart:/sbin/init 文件系统运行的第一个进程(sbin/init) init=/linuxrc 守护进程
- 开启当前的shell环境,服务其他进程,打开其他进程
- ::ctrlaltdel:/sbin/reboot reboot系统重启
2)init.d/rcS
- #!/bin/sh
- # This is the first script called by init process
- /bin/mount -a 执行挂载,与之匹配的是fstab中设置好的挂载点
- echo /sbin/mdev > /proc/sys/kernel/hotplug 生效热插拔机制
- /sbin/mdev -s
3)fstab 设置不同的文件系统的挂载点
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
4)申明库文件,以及进程的路径
export HOSTNAME=farsight
export USER=root
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
嵌入式ROOTFS transplantation的更多相关文章
- 构建 ARM Linux 4.7.3 嵌入式开发环境 —— BusyBox 构建 RootFS
上一篇我们已经成功将 ARM Linux 4.7.3 的内核利用 U-BOOT 引导了起来.但是细心的你会发现,引导到后面,系统无法启动,出现内核恐慌 (Kernel Panic). 原因是找不到文件 ...
- 嵌入式 emmc 中 安装 烧录 内核 kernel,设备树 devicetree ,根文件系统 rootfs
一般调试嵌入式开发板喜欢选择 利用 TFTP 传送 内核与 设备树, 利用 nfs 加载根文件系统. uboot 环境变量 设置如下: bootargs=root=/dev/nfs rw nfs ...
- 嵌入式开发软件环境:uboot、kernel、rootfs、data布局分析
uboot+linux的整体方案 开发板的datasheet中都有详细的地址空间的划分,其中比较重要的两块是:DDR地址空间和Flash地址空间.DDR空间是系统和应用的运行空间,一般由linux系统 ...
- 制作自己的嵌入式Linux电脑_转
制作自己的嵌入式Linux电脑 http://os.51cto.com/art/201409/450334.htm 原文链接:http://blog.jobbole.com/75414/ 包含器件选择 ...
- 构建 ARM Linux 4.7.3 嵌入式开发环境 —— U-BOOT 引导 Kernel
经过若干天的反复测试,搜索.终于成功利用 Qemu 在 u-boot 下引导 ARM Linux 4.7.3 内核.如下详细解释整个构建过程. 准备环境 运行环境:Ubuntu 16.04 需要的虚拟 ...
- 【4412嵌入式开发板学习笔记】认识uboot
转自迅为讨论群:http://www.topeetboard.com 重要说明:这份笔记不是4412开发配套的,是我在网上看视频的时候下载上课老师的笔记后修改的.所以我试了一下笔记上的uboot命令, ...
- 嵌入式Linux内核制作【转】
本文转载自:http://blog.csdn.net/coding__madman/article/details/51291316 1. Linux体系结构 从整体上来分,linux可以分为User ...
- linux rootfs制作
http://blog.sina.com.cn/s/blog_6795385f01011ifg.html 作一个嵌入式Linux rootfs,并且实现 web 服务 1. 文件系统简介 •理论上说一 ...
- 三种嵌入式web服务器(Boa / lighttpd / shttpd)的 linux移植笔记
一:移植Boa(web服务器)到嵌入式Linux系统 一.Boa程序的移植 1.下载Boa源码 下载地址: http://www.boa.org/ 目前最新发行版本: 0.94.13 ...
随机推荐
- c++ 的类 和 类继承, 什么是c++中的基类和派生类?
闲云潭影日悠悠,物换星移几度秋 你既然已经做出了选择, 又何必去问为什么选择.鬼谷绝学的要义, 从来都不是回答, 而是抉与择 普通类 #ifndef TABTENN0_H_ #define TABTE ...
- (笔记)Linux常用命令大全
系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...
- MyBatis打印输出SQL语句
Hibernate是可以配置 show_sql 显示 自动生成的SQL 语句,用 format_sql 可以格式化SQL 语句,但如果用 mybatis 怎么实现这个功能呢?如果你搜索看一下,基本都是 ...
- e799. 限制JSlider的数值在标记以内
By default, the slider can take on any value from the minimum to the maximum. It is possible to conf ...
- jQuery 文件上传插件:uploadify、swfupload
jQuery 文件上传插件: uploadify.swfupload
- Linux可视化服务器管理工具webmin
webmin是一个可视化的linux服务器管理工具,可以帮助我们实现很多功能. Webmin官网: http://www.webmin.com/ 下载地址:http://prdownloads.sou ...
- CentOS6.8下安装MySQL5.6
一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm -qa | grep mysql 有的话通过下面的命令来卸载掉 rpm -e mysql //普通删除模式 rpm -e ...
- C# 获取本机的所有ip地址,并过滤内网ip
private void Initialization_Load(object sender, EventArgs e) { cboxip.Items.Add("请选择IP地址") ...
- linux 下启动tomca慢问题
编辑文件vim /etc/profile 后面加入一句:export JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom" 设置立 ...
- 【转】MongoDB学习笔记(查询)
原文地址 MongoDB学习笔记(查询) 基本查询: 构造查询数据. > db.test.findOne() { "_id" : ObjectId("4fd58ec ...