庖丁解牛—Linux基本系统组成分析
目 录
TOC \o "1-3" \h \z \u 1. 概述
2. LFS简介
3. Linux系统基础软件
3.1 基础源码包
3.2 Linux系统命令分类
3.3 Linux命令执行过程
1. 概述
Linux系统很大,在安全操作系统上用rpm –aq | wc –l 查看,可以看到有1000多个包所组成,而每个包又包含无数个命令和文件等,给人感觉Linux系统庞大无比,本文在LFS基础上,对基本Linux系统组成元件进行分析
2. LFS简介
LFS是Linux From Scratch英文简称,它的意思是从零开始构成一个Linux系统,整个Linux系统所有的软件包都是通过手动编译,再经过相应配置,最终安装完成一个基本Linux系统。相比于安全操作系统安装过程,直接点击”下一步“来完成安装,这个工作量会大得多.
LFS构建完成的Linux,所有的软件都是通过源代码编译完成的,这就需要有编译环境,也即是需要宿主系统,通常以现有的Linux系统或是LFS的LiveCD作为宿主系统.
LFS官网: http://www.linuxfromscratch.org/
3. Linux系统基础软件 3.1 基础源码包
查看LFS中文文档,可知Linux基本系统主要有如下软件包,现在就这个软件包进行分析,主要分析这些包中所包含的命令以及库文件
1 Linux-2.6.32.8 API Headers
2 Man-pages-3.23
3 Glibc-2.11.1
4 Zlib-1.2.3
5 Binutils-2.20
6 GMP-5.0.0
7 MPFR-2.4.2
8 File-5.04
9 GCC-4.4.3
10 Sed-4.2.1
11 Pkg-config-0.23
12 Ncurses-5.7
13 Util-linux-ng-2.17
14 E2fsprogs-1.41.10
15 Coreutils-8.4
16 Iana-Etc-2.30
17 M4-1.4.13
18 Bison-2.4.1
19 Procps-3.2.8
20 Grep-2.5.4
21 Readline-6.1
22 Bash-4.1
23 Libtool-2.2.6b
24 GDBM-1.8.3
25 Inetutils-1.7
26 Perl-5.10.1
27 Autoconf-2.65
28 Automake-1.11.1
29 Bzip2-1.0.5
30 Diffutils-2.8.1
31 Gawk-3.1.7
32 Findutils-4.4.2
33 Flex-2.5.35
34 Gettext-0.17
35 Groff-1.20.1
36 GRUB-1.97.2
37 Gzip-1.4
38 IPRoute2-2.6.31
39 Kbd-1.15.1
40 Less-436
41 Make-3.81
42 Man-DB-2.5.6
43 Module-Init-Tools-3.11.1
44 Patch-2.6.1
45 Psmisc-22.10
46 Shadow-4.1.4.2
47 Sysklogd-1.5
48 Sysvinit-2.86
49 Tar-1.22
50 Texinfo-4.13a
51 Udev-151
52 Vim-7.2
以上52源码包,按顺序编译,再加上Linux内核,即构成基本Linux系统
以下对部分源码包进行分析
1 Linux API Headers ----是为了用户 Glibc 而公开的内核 API
2 Glibc-2.11.1 ----包含了主要的C库
5 Binutils-2.20 --- 包含一个链接器,一个汇编器和其他处理目标文件的工具
8 File-5.04 ---编译生成file命令,file命令的作用主要为通过执行一些测试,尝试对指定文件进行分类, 这些测试包括: 文件系统测试、幻数(magic number)测试和语言测试。
10 Sed-4.2.1 --sed为一个流编译器,在Linux系统脚本中,有广泛作用
12 Ncurses-5.7 ---程序包提供字符终端处理库以及clear等一些命令
13 Util-linux-ng-2.17
agetty
打开 tty端口,为登录名称建立命令控制符,并引出 login 程序
arch
报告机器的体系结构
ctrlaltdel
设置 Ctrl+Alt+Del 组合键的功能为硬重启或软重启
dmesg
显示内核的启动信息
fdisk
管理指定设备的分区表
fsck
用来检查,并可以修复文件系统
hwclock
查询和设置硬件时钟,也被称为实时时钟(RTC) 或 基本输入输出系统(BIOS) 时钟
mkfs
在一个设备(通常是一个硬盘分区)上建立文件系统
mkswap
初始化指定设备或文件,以用做交换区域
more
分屏显示文件
mount
把一个文件系统从一个设备挂载到一个文件系统树中的目录
rename
重命名文件,用另一个字符串代替给定字符串
swapoff
取消对指定交换设备和交换文件的使用
swapon
使指定的交换设备和交换文件生效,并列出当前使用的交换设备和交换文件
umount
卸载一个被挂载的文件系统
whereis
报告给定命令的二进制文件、源文件、手册文档的位置
14 E2fsprogs-1.41.10
chattr
在 ext2 和 ext3 文件系统上改变文件属性
e2fsck
用来检查和修复 ext2 和 ext3 文件系统
filefrag
报告一个特定文件可能被破坏的如何严重
fsck.ext2
默认检查 ext2 文件系统。它是指向 e2fsck 的一个硬链接
fsck.ext3
默认检查 ext3 文件系统。它是指向 e2fsck 的一个硬链接
fsck.ext4
默认检查 ext4 文件系统。它是指向 e2fsck 的一个硬链接
fsck.ext4dev
默认检查 ext4 开发文件系统。它是指向 e2fsck 的一个硬链接
lsattr
列出 ext2 文件系统上的文件属性
mke2fs
在给定设备上创建 ext2 或 ext3 文件系统
mkfs.ext2
默认创建ext2 文件系统,它是mke2fs 的一个硬链接。
mkfs.ext3
默认创建ext3 文件系统,它是mke2fs 的一个硬链接。
mkfs.ext4
默认创建ext4 文件系统,它是mke2fs 的一个硬链接。
15 Coreutils-8.4
这个源码包,顾名思义,包括一系列系统核心命令,以下为部分命令
basename
去掉文件名中的目录和后缀
cat
把文本文件的内容发送到标准输出
chcon
改变文件和目录的安全内容(用于SELinux)
chgrp
改变文件和目录属组
chmod
改变每个文件的权限到指定模式;该模式或者将权限改变成符号形式, 或者变成八进制数字形式
chown
改变文件和目录的属主和/或属主组
chroot
使用特定的目录作为执行某个命令的根( /) 目录
cksum
输出指定的每个文件的循环冗赘核对 (CRC) 校验和字节数
cp
拷贝文件
csplit
把一个文件按照给定的模式或者行号分成几块
cut
从指定的文件中提取特定的列送到标准输出
date
以特定的格式显示当前时间,或者设置系统日期
dd
以给定的块大小和数量拷贝文件,同时还可以对文件进行一些转换
df
报告所有挂载的文件系统或仅仅是保存选定文件的文件系统上可用(和已用) 的磁盘空间的数量。
38 IPRoute2-2.6.31 (以下为部分命令)
ip
主可执行程序,它包含一些不同的功能:
ip link <device>查看和修改设备状态
ip addr 查看地址和属性,添加新地址、删除旧地址。
ip neighbor 查看邻居的特性,添加新邻居、删除旧邻居。
ip rule 查看和修改路由规则
ip route 查看路由表和修改路由表规则
ip tunnel 查看和修改 IP 隧道及其特性
ip maddr 查看和修改多播地址及其特性
ip mroute 设置、修改、删除多播路由
ip monitor 不间断的监视设备状态、地址、路由
48 Sysvinit-2.86 (部分命令)
bootlogd
把启动信息记录到一个日志文件
halt
正常情况下等效于shutdown加上-h 参数(当前系统运行级别是 0 时除外)。 它将告诉内核去中止系统,并在系统正在关闭的过程中将日志记录到 /var/log/wtmp文件里。
init
当内核已经初始化硬件,接管引导程序,开启指令线程时, init 会被第一个启动。通过ps命令查看,该进程ID为1
killall5
发送一个信号到所有进程, 但那些在它自己设定级别的进程将不会被这个运行的脚本所中断。
last
给出哪一个用户最后一次登录(或退出登录),它搜索 /var/log/wtmp文件,出给出系统引导、关闭、运行级别改变等信息。
lastb
给出登失败的尝试,并写入日志 /var/log/btmp
mesg
控制是否允许其他用户也有向系统所有用户发送信息的权限
3.2 Linux系统命令分类
Linux系统命令,还可以分为shell内部命令以及系统命令
可通过type command方式查看一个命令是系统命令还是shell内部命令
由上可知,more为系统命令,echo为shell内建命令
3.3 Linux命令执行过程
Linux系统构成如下图所示,位于最外层的是shell,用户通过shell,将要执行的命令传递给系统,系统执行完命令,将执行结果反馈给shell.
shell
kernel
hardware
当shell接到一个用户输入的命令,首先判断该命令是否为shell内建命令,如果是,则直接执行,如果不是,则根据$PATH变量指定的路径来搜索该命令是否存在于$PATH变量定义的目录中,
[root@HSW ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
如果不存在,则提示:
[root@HSW ~]# hsw
-bash: hsw: command not found
如果存在,则执行该命令,执行时,命令会调用一系列系统共享库,可用ldd命令查看一个命令执行时共调用了哪些共享库,
[root@HSW ld.so.conf.d]# ldd /bin/more
linux-vdso.so.1 => (0x00007fff22f89000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00000030c5400000)
libc.so.6 => /lib64/libc.so.6 (0x00000030bac00000)
/lib64/ld-linux-x86-64.so.2 (0x00000030ba400000)
以上所说的是命令在执行时,调用系统默认的动态共享库,如果在我们自己在程序开发过程中,开发了一些动态库,并未放在系统指定的路径中,为了让命令在运行时,动态加载自定义的动态共享库,则可通过定义LD_LIBRAY_PATH来实现,例如,自定义了一个动态共享库libmy.so中当前目录,要使命令在运行时加载该库,则可通过
export LD_LIBRAY_PATH=$LD_LIBRAY_PATH:./来实现