序言:任何工作都一样,原理弄精通了,全体的标题将变得不再神秘。

一、busybox生成的目录 Busybox编写翻译安装后,在rootfs目录下会拿走 /bin, /sbin,
/usr/bin多个目录,正是busybox生成的
可实践程序及急速情势。
rootfs/_
          |___ bin /
          |___ sbin /
          |___ usr /
          |___ linuxrc

转自:

学Computer的人都知道,在此外一样时刻,Computer只好进行一条指令,而且都是各样往下举办的(除非碰着跳转指令)。

那四个目录有多数连忙格局,都以指向了/bin/busybox。那正是busybox的表征,就可以施行顺序
只有八个,其余的都以link。举个例子,当实施/bin/mkdir时,busybox会把公文名当做第多个参数,
从文件名剖判出该调用到内部的mkdir()函数。

一般设置情状变量有二种形式:

Linux的进度运行都以基于运行脚本里的下令实行的,主要有两类:init 和bash.
init 是负有脚本的最上部,首先被试行,而bash一般是登录shell
的时候才会被调用。

二、其余目录
惟有有上述目录还不足以构成贰个可用的文件系统,必须还要手工业加一些别的的目录及布局
文本、运维脚本等。

一、有的时候设置

昨今分歧的文件系统具体的运行脚本文件名称是不平等的。以自家利用的文件系统(yaffs)为例,/etc/init.d/rcS
作为init
的剧本,倘令你想开机时进入自身的应用程序,则在rcS里面写入就足以。举个例子本人想运行/usr/qtopia/chip 
则在中间写入/usr/qtopia/chip –qws  就足以。

下边是几个必须有的目录
          |___ etc /   配置文件
          |___ dev /  设备节点目录
          |___ca88会员登录入口, lib /    库
                     |___ modules / 驱动

export PATH=/home/yan/share/usr/local/arm/3.4.1/bin:$PATH

/etc/init.d/profile 作为bash 的脚本 ,在那个剧本里的一声令下
开机时不会被施行,然则你进去shell 状态时,就能够被调用,一般的话bash
脚本大多用来存放在意况变量,记住,每三遍跻身shell 都会调用二次bash 脚本。

上边是极端有个别多少个目录
          |___ proc /  
          |___ sys /
          |___ var /
          |___ tmp /
          |___ root /
          |___ opt /
          |___ mnt /

二、当前用户的大局设置

来看看小编剖析一个例程,在/usr/qtopia 里有二个qt
程序,不使用自运营的格局,而是利用终端输入(进入终极就代表进入shell)展开,那时候没难点,程序平常化被展开,那表明里本身的qt
库lib 的情形变量设置没难点。

2.1 特殊文件系统的目录
先介绍一下多少个出色的目录,那么些目录仅仅充当二个挂载点,目录里面是置空的。在linux运营
别的后,被挂载成特列的文件系统,如tmpfs , devfs, proc,
sysfs等。那么些文件系统有一个联袂的
特性,即其剧情都以在ram里,而不是在磁盘上。

打开~/.bashrc,添加行:

不过当本身利用自运行的形式,即在/etc/init/rcS 里参预/usr/qtopia/chip –qws
时却提醒 error while loading share qtlib.so.4 ““““干什么吧?

/proc :  proc文件系统
/sys   :  sysfs 文件系统
/var   :  ramfs 文件系统
/tmp  :  ramfs 文件系统
/dev  :  ramfs 文件系统 

export PATH=/home/yan/share/usr/local/arm/3.4.1/bin:$PATH

案由是这般的:笔者的情状变量放在/etc/profile
而程序实行指令放在/etc/init.d/rcS ,这里就能够产出二个标题,rcS 初始被实行而profile 还没被施行,这样很明朗找不到lib
了呗,回头看终端输入运营,为啥就找到lib 呢
?很简短,你展开终端时,bash
已经被调用。那样,试行的次第变为首先实行/etc/profile
然后才实施你的通令。

注:(1)
开始的一段时代的linux其/dev下的节点是手工业创设的,后进步形成udev(mdev)情势。udev大致是依附
sysfs里的节点来创制相应的dev节点的,所以在创立即/dev下置空。在运作起来然后,由udev/mdev
发源动在/dev下创制节点。假设/dev挂载到磁盘上,速度未有挂载到ram里。
       (2) 就好像那几个目录可以动态的创制和mount??
照旧先创立好呢,在开发银行脚本里只做挂载的动作。

使生效

注:Ubuntu 系统的bash
脚本是 ~/.bashrc 或者 /etc/bashrc

2.2 手动配置的目录
/etc 目录
    配置文件, 必须有那多少个公文 /etc/fstab, /etc/inittab,
/etc/init.d/rcS, /etc/profile
/dev 目录
   
设备节点目录,由于选用mdev来机关创建节点,/dev被挂载成ramfs,所以此目录置空就可以
/lib 目录
    busybox一般接纳动态编写翻译,所以至少供给libc和libld库
/root 目录
    由于嵌入式系统唯有二个root帐户,所以能够把root的根目录设为
“/”,从而无需root目录
/opt 目录
   
要布局本身的先后的话,能够都献身/opt目录下边。当然也足以放在/usr/local里

source .bashrc

ca88会员登录入口 1

三、配置etc
etc目录里增加配置文件,是最首要的行事。有如此多少个文件:
    fstab, inittab, profile, init.d/rcS
内需手工业增多。

三、全数用户的大局设置

  1. /etc/fstab
    足足要抬高proc文件系统
    以此文件是在kernel运维末尾使用的,有的自定义kernel只怕一贯把该mount的节点都挂载上了。

  2. /etc/inittab
    这是系统经过init的运维脚本

  3. /etc/init.d/rcS
    在inittab中内定,一般在嵌入式系统中inittab异常的粗略,正是钦赐rcS脚本,然后张开贰个登入
    终端(甚至不开终端)。所以rcS脚本里应该加上你想在系统运行之初想干的业务。

  4. /etc/profile
    用户从终端登入后,运维的本子。固然系统不加用户登入机制,这一个剧本就不会被运维了。

$ vim /etc/profile

布置文件典范
#######  /etc/inittab #######
::sysinit:/etc/init.d/rcS
::askfirst:/sbin/getty 115200 console
#tty2::askfirst:/bin/bash

在里边加入:

arkfirst表示先唤醒,当用户按回车的前边才张开调整台
/sbin/getty是有身份验证的,要是用/bin/bash就径直张开一个无身份验证的shell

export PATH=/home/yan/share/usr/local/arm/3.4.1/bin:$PATH

为了能以root登入,须要创设/etc/passwd文件,passwd文件存了系统的帐户音信。因为大家一般只必要root登陆,所以加一条root音信就可以。第二列是空,表示root无需密码。

使生效

示范
root::0:0:root:/:/bin/sh

source profile

四、制作文件系统影象
# mkfs.yaffs2  ./rootfs   yaffs.img
中间rootfs是文件系统目录树的根

测量试验当前的情况变量;

连带阅读:BusyBox各版本下载
http://www.linuxidc.com/Linux/2011-08/40704.htm

测试 echo $PATH

ca88会员登录入口 2

用户登录后加载profile和bashrc的流水生产线如下:

1)/etc/profile——–>/etc/profile.d/*.sh
2)$HOME/.bash_profile——–>$HOME/.bashrc———->/etc/bashrc

说明:
bash首先实行/etc/profile脚本,/etc/profile脚本先依次试行/etc/profile.d/*.sh
随着bash会试行用户主目录下的.bash_profile脚本,.bash_profile脚本会实践用户主目录下的.bashrc脚本,
而.bashrc脚本会实践/etc/bashrc脚本

迄今结束,全部的环境变量和初始化设定都曾经加载实现.
bash随后调用terminfo和inputrc,完结终端属性和键盘映射的设定.

里面PATH这几个变量特殊表明一下:
假定是最棒用户登入,在平素不实施/etc/profile在此之前,PATH已经设定了上边的不二等秘书诀:
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
万一是普通用户,PATH在/etc/profile施行此前设定了以下的路子:
/usr/local/bin:/bin:/usr/bin

此地要小心的是:在用户切换并加载变量,举个例子su
-,那时,假若用户自个儿切换自身,比如root用户再用su –
root切换的话,加载的PATH和下面的两样样.
标准的说,是不总是同样.所以,在/etc/profile脚本中,做了之类的安排:
if [ `id -u` = 0 ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
fi

要是是极品用户登入,在/etc/profile.d/krb5.sh脚本中,在PATH变量寻觅路线的最前头增添/usr/kerberos/sbin:/usr/kerberos/bin
一经是普通用户登入,在/etc/profile.d/krb5.sh脚本中,在PATH变量寻找路线的最前头扩展/usr/kerberos/bin

在/etc/profile脚本中,会在PATH变量的末梢增添/usr/X11汉兰达6/bin索引
在$HOME/.bash_profile中,会在PATH变量的最终扩大$HOME/bin目录

以root用户为例,最后的PATH会是那般(未有此外自定义的基础上)
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin

以alice用户(普通用户)为例
/usr/kerberos/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/alice/bin

上边是做的剧本解析:
###############################################
#strace -o su -e trace=open su – alice
#grep ^open /etc/su|grep -v null|grep “= 3″|nl
###############################################

开垦的文本如下:
1    open(“/etc/ld.so.cache”, O_RDONLY)      = 3
2    open(“/lib/libcrypt.so.1”, O_RDONLY)    = 3
3    open(“/lib/tls/libc.so.6”, O_RDONLY)    = 3
4    open(“/usr/lib/locale/locale-archive”, O_RDONLY|O_LARGEFILE) =
3
5    open(“/etc/nsswitch.conf”, O_RDONLY)    = 3
6    open(“/etc/ld.so.cache”, O_RDONLY)      = 3
7    open(“/lib/libnss_files.so.2”, O_RDONLY) = 3
8    open(“/etc/passwd”, O_RDONLY)           = 3
9    open(“/etc/shadow”, O_RDONLY)           = 3
10    open(“/etc/group”, O_RDONLY)            = 3
11    open(“/etc/ld.so.cache”, O_RDONLY)      = 3
12    open(“/lib/libtermcap.so.2”, O_RDONLY)  = 3
13    open(“/lib/libdl.so.2”, O_RDONLY)       = 3
14    open(“/lib/tls/libc.so.6”, O_RDONLY)    = 3
15    open(“/dev/tty”, O_RDWR|O_NONBLOCK|O_LARGEFILE) = 3
16    open(“/etc/mtab”, O_RDONLY)             = 3
17    open(“/proc/meminfo”, O_RDONLY)         = 3
18    open(“/etc/nsswitch.conf”, O_RDONLY)    = 3
19    open(“/etc/ld.so.cache”, O_RDONLY)      = 3
20    open(“/lib/libnss_files.so.2”, O_RDONLY) = 3
21    open(“/etc/passwd”, O_RDONLY)           = 3
22    open(“/etc/profile”, O_RDONLY|O_LARGEFILE) = 3
23    open(“/etc/profile.d/”,
O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3
24    open(“/etc/profile.d/colorls.sh”, O_RDONLY|O_LARGEFILE) = 3
25    open(“.”, O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3
26    open(“/etc/profile.d/glib2.sh”, O_RDONLY|O_LARGEFILE) = 3
27    open(“/etc/profile.d/gnome-ssh-askpass.sh”,
O_RDONLY|O_LARGEFILE) = 3
28    open(“/etc/profile.d/krb5.sh”, O_RDONLY|O_LARGEFILE) = 3
29    open(“/etc/profile.d/lang.sh”, O_RDONLY|O_LARGEFILE) = 3
30    open(“/etc/sysconfig/i18n”, O_RDONLY|O_LARGEFILE) = 3
31    open(“/usr/lib/locale/locale-archive”, O_RDONLY|O_LARGEFILE) =
3
32    open(“/usr/lib/gconv/gconv-modules.cache”, O_RDONLY) = 3
33    open(“/etc/profile.d/less.sh”, O_RDONLY|O_LARGEFILE) = 3
34    open(“/etc/profile.d/qt.sh”, O_RDONLY|O_LARGEFILE) = 3
35    open(“/etc/profile.d/vim.sh”, O_RDONLY|O_LARGEFILE) = 3
36    open(“/etc/profile.d/which-2.sh”, O_RDONLY|O_LARGEFILE) = 3
37    open(“/ceno/prod t/imeg/etc/profile”, O_RDONLY|O_LARGEFILE) =
3
38    open(“/home/alice/.bash_profile”, O_RDONLY|O_LARGEFILE) = 3
39    open(“/home/alice/.bashrc”, O_RDONLY|O_LARGEFILE) = 3
40    open(“/etc/bashrc”, O_RDONLY|O_LARGEFILE) = 3
41    open(“/home/alice/.bash_history”, O_RDONLY|O_LARGEFILE) = 3
42    open(“/home/alice/.bash_history”, O_RDONLY|O_LARGEFILE) = 3
43    open(“/etc/termcap”, O_RDONLY)          = 3
44    open(“/etc/inputrc”, O_RDONLY|O_LARGEFILE) = 3
45    open(“.”, O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3
46    open(“/home/alice/.bash_logout”, O_RDONLY|O_LARGEFILE) = 3
47    open(“/home/alice/.bash_history”,
O_WRONLY|O_APPEND|O_LARGEFILE) = 3
48    open(“/home/alice/.bash_history”, O_RDONLY|O_LARGEFILE) = 3

########################################################
首先某些:
从1-21行为主是开荒动态链接库文件和身份验证的文件.
########################################################

########################################################
其次有些:
第22行是开垦/etc/profile文件,如下:
########################################################
# /etc/profile

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

########################################################
#定义pathmunge函数
#echo $PATH | /bin/egrep -q
“(^|:)$1($|:)”是过滤$PATH中的可试行目录,如若egrep到批配项,再次来到真但取反
#也正是不扩张实行目录到$PATH中,选项-q禁止全体的出口到正式输出,不管相称行。假设选中输入行,以
0 状态退出
#此地由 |
(竖线)大概换行符隔绝的多少个正则表达式会合作与此外三个正则表达式所相称的字符串
#三个正则表明式能够被总结在“()”(括弧)中开始展览分组
########################################################

pathmunge () {
if ! echo $PATH | /bin/egrep -q “(^|:)$1($|:)” ; then
if [ “$2” = “after” ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
fi
}

###########################################
#譬喻uid为0的用户,将要$PATH变量上进入/sbin/,/usr/sbin,/usr/local/sbin八个目录-q
“(^|:)($|:)”
#因为调用pathmunge函数,未有投入after参数,所以上述多个目录都加在了$PATH变量的最前边
###########################################
# Path manipulation
if [ `id -u` = 0 ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
fi

##########################################
#调用pathmunge函数,在$PATH前面扩大/usr/X11Lacrosse6/bin
##########################################
pathmunge /usr/X11R6/bin after

unset pathmunge

##########################################
#ulimit设定-S为软调整,-c为core file文件大小,这里是不做限定
##########################################
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1

##########################################
#id -un是打印输出当前的用户名,比如:root
#概念了LOGNAME变量和MAIL变量,会有先后用到这么些变量
##########################################
USER=”`id -un`”
LOGNAME=$USER
MAIL=”/var/spool/mail/$USER”

##########################################
#透过/bin/hostname获取主机名
#定义history的记录数为1000
##########################################
HOSTNAME=`/bin/hostname`
HISTSIZE=1000

##########################################
#要是未有定义$INPUTRC并且不存在$HOME/.inputrc文件
#概念变量INPUTRC的值为/etc/inputrc
##########################################
if [ -z “$INPUTRC” -a ! -f “$HOME/.inputrc” ]; then
INPUTRC=/etc/inputrc
fi

export REMOTE_JAVA_DEBUG=on
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

##########################################
#实施/etc/profile.d/下的具备脚本,-r是认可它们可读
##########################################
for i in /etc/profile.d/*.sh ; do
if [ -r “$i” ]; then
. $i
fi
done

unset i
. /ceno/prod t/imeg/etc/profile

export
PS1=”\[\e[32;1m\][\u@\h]\[\e[33;1m\]:\[\e[31;1m\]\w>\\$
\[\e[0m\]”

########################################################
其三有的:
从24行到36行是推行/etc/profile.d/下的具备脚本,那一个实行进度在/etc/profile中定义.
见前面/etc/profile中的脚本剖判.

上边是对/etc/profile.d/下脚本做的简要表达,首要设定了意况变量(比方:PATH),alias等
/etc/profile.d/colorls.sh:对/etc/DIR_COLO奇骏S的领取,并用dircolors实行设定,最终定义了部分ls的alias
/etc/profile.d/glib2.sh:设定G_BROKEN_FILENAMES=1
/etc/profile.d/gnome-ssh-askpass.sh:设定SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
/etc/profile.d/krb5.sh:增加/usr/kerberos/bin或/usr/kerberos/sbin到PATH变量中
/etc/profile.d/lang.sh:设定语言景况,首先会加载/etc/sysconfig/i18n中的境况变量(LANG,SUPPORTED,SYSFONT)到shell中,
依赖上述的变量再定义语言情状扶助子集,最后再依照LANG设定终端
/etc/profile.d/less.sh:设定LESSOPEN=”|/usr/bin/lesspipe.sh
%s”,LANGVAR=$LANG
/etc/profile.d/qt.sh:设定QTDIR=”/usr/lib/qt-3.1″
/etc/profile.d/vim.sh:设定alias vi=vim
/etc/profile.d/which-2.sh:设定alias which=’alias | /usr/bin/which
–tty-only –read-alias –show-dot –show-tilde’
########################################################

########################################################
第四有个别:
第37行open(“/ceno/prod t/imeg/etc/profile”, O_RDONLY|O_LALacrosseGEFILE) =
3,这里加载了用户自身的条件设定脚本.
########################################################

########################################################
第五部分:
第38行open(“/home/alice/.bash_profile”, O_RDONLY|O_LARGEFILE) = 3
第39行open(“/home/alice/.bashrc”, O_RDONLY|O_LARGEFILE) = 3
第40行open(“/etc/bashrc”, O_RDONLY|O_LARGEFILE) = 3

第一步:bash打开/home/alice/.bash_profile文件,
第二步:.bash_profile文件再判定有无/home/alice/.bashrc,假使有加载.bashrc文件
其三步:最终通过.bashrc文件加载/etc/bashrc文件
########################################################

########################################################
第六有的:
在41行open(“/home/alice/.bash_history”, O_RDONLY|O_LARGEFILE) = 3
在42行open(“/home/alice/.bash_history”, O_RDONLY|O_LARGEFILE) = 3
在43行open(“/etc/termcap”, O_RDONLY)          = 3
在44行open(“/etc/inputrc”, O_RDONLY|O_LARGEFILE) = 3

第一步张开.bash_history文件绸缪记录命令
其次步展开termcap文件
terminfo
数据库用于定义终端和打印机的习性及成效,包蕴各配备(举例,终端和打字与印刷机)的行数和列数以及要发送至该设施的公文的属性
其三步展开inputrc
inputrc 文件为一定的场馆管理键盘映射,那个文件被 Readline
用作运行文件,Readline 是 Bash 和其余大好多 shell 使用的与输入相关的库
########################################################

########################################################
第七片段:
第46行open(“/home/alice/.bash_logout”, O_RDONLY|O_LARGEFILE) = 3
第47行open(“/home/alice/.bash_history”,
O_WRONLY|O_APPEND|O_LARGEFILE) = 3
第48行open(“/home/alice/.bash_history”, O_RDONLY|O_LARGEFILE) = 3

那边是用户用logout或exit退出的表现.倘诺直接关门掉terminal,则不会试行.bash_logout和写回.bash_history文件
.bash_logout脚本暗中同意是调用clear清一下荧屏
########################################################

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注