1 命令获取信息的方法
Linux系统命令和用户程序
- 从操作系统看,在地位上相同,都属于用户态程序;
- 运行时需要获取的信息包括配置信息、处理方式(选项参数)、被处理的对象。
1.1 运行时获取信息的常见方式
易变性从小到大为
- 配置文件
- 环境变量
- 命令行参数
- 交互式键盘输入
运行时获取信息的常见方式
- 一般为较复杂的程序会提供配置文件以存储配置信息或者偏好配置信息。
- 分为系统级偏好设置和用户级偏好设置,例如 bash 的/etc/profile 和 ~/.bash_profile。
(1)配置文件
- 配置文件提供了灵活性(同一个程序文件因用户不同,读取的配置文件不同而表现不同),变更这些信息不太方便;
- 一般不需要变化的配置信息或选项信息存入配置文件,持久化存储。
(2)环境变量
- 命令 env 可以打印出当前的环境变量;
- 一般是一些与“环境”相关的配置或选项信息,信息量不大。
- 选择在一段时间内反复使用同一个命令或者不同命令时该环境变量保持不变。
- 环境变量:LANG(语言选择),HOME(主目录),TERM(终端类型),PATH(可执行文件的查找路径),CLASSPATH(类库查找路径),CVSROOT。
- 虽然运行的程序(可执行文件)是完全相同的一个文件,程序通过获得环境变量感知环境的不同,控制自己的行为。
- 环境变量值得获取与设置:C语言有库函数getenv(),用户设置环境变量的方法也很简单。
- 性能问题:比读取配置文件需要的系统开支要小。
(3)命令行参数
- 程序启动之前指定:通过命令行参数,操作员输入命令时提供处理选项和操作对象。
- 每个命令都不同,命令运行完之后,对后续命令无影响。
(4)交互式键盘输入
- 该方式在Linux命令中极少使用;
- 计算机启动后通过计算机与操作员之间的人机交互获取信息,C语言的scanf(),fget()函数。
1.2 命令行参数的三种风格
(1)类似 dd 命令的风格
特点:命令行参数采用 param=value 的风格
- dd if=sysdisk.img of=/dev/sdb
用dd命令将硬盘映像拷贝到硬盘:if指定输入文件,of指定输出文件。
- dd if=/dev/urandom of=test.dat bs=1024 count=512
用dd命令,生成512KB测试数据文件test.dat。
命令行参数中:if, of, bs, count分别指定输入文件,输出文件,块大小,以及块计数。
(2)类似find和gcc的风格
特点:以减号开头的一个由多个字符构成的单词用作选项。
例如:find src -name '*.c' -type f -exec dos2unix --keepdate {} \; # 将多有扩展名.c的普通文件由windows文本格式转为linux格式。
(3)类似ls和grep的风格:目前流行的格式
特点:长选项与短选项,有的选项同时有两种格式,也有的选项仅有长格式或仅有短格式。
例如:ls(其中 -w 选项指定一个整数参数值告知 ls 排版时屏幕的列宽度)
- ls --classify --all --size --human-readable --width=80 /home/li # 长选项
- ls -Fashw80 /home/li # 多个选项挤在一起
- ls -F -a -s -h -w 80 /home/li # 多个选项分开
- ls -F -w80 /home/li -has # 把多个选项放在后面
2 文件系统
2.1 文件系统的创建于安装
根文件系统(root filesystem):是整个文件系统的基础,不能“脱卸(umount)”。
子文件系统:包括硬盘,软盘,USB盘等。以根文件系统中某一子目录的身份出现。
mksf和mount 文件系统的创建于安装
创建文件系统
- mkfs /dev/sdb # 块设备文件/dev/sdb上创建文件系统。
- mount /dev/sdb /mnt # /mnt可以是一个事先建好的空目录名,允许处于根文件系统的任何目录中,此后,操作子目录/mnt就是对子系统的访问。对于应用程序来说,从所操作的文件或目录名,看不出和其它根文件系统的对象有什么区别。/dev/sdb为磁盘文件。
- 不带参数的mount命令,列出当前已安装的所有的子文件系统。
umount 文件系统的卸载
- umount命令,功能与mount命令相反,卸载一个已安装的子文件系统。例如:umount /dev/sdb
df 文件系统空闲空间
2.2 文件系统的存储结构
(1)文件系统的结构
把整个逻辑设备以块(扇区)为单位为划分,编号为0,1,2 ......(每块521字节或更大的2^n字节大小)
引导块 | 专用块 | i 节点区 | 文件存储区 |
引导块(0号块):用于启动系统,只有根文件系统的引导块有效。
专用块(1号块):也叫管理块,或者超级块、
- 存放文件系统的管理信息。如:文件系统的大小,i 节点区的大小,空闲空间大小,空闲块链表的头等等。
- mkfs 命令时初始化,df 命令读取部分信息,df -i 和 df
i 节点区:i节点(index node)
- i节点区由若干块构成,在mkfs命令创建文件系统时确定。
- 每个文件都对应一个i节点,i节点中的信息包括:指向文件存储区数据块的一些索引(index)
- 指针(组成文件的逻辑块与硬盘的物理块之间的映射)
文件存储区
- 用于存放文件数据的区域,包括目录表。
(2)目录的存储结构
Linux目录结构是树形带交叉勾连的目录结构。
目录表
- 每个目录表也作为一个文件来管理,存于“文件存储区”中。有其自己的i节点和数据存储块。
- 目录表由若干个“目录项”构成,目录项只含两部分信息:文件名、i节点号。
- 用ls命令列出的目录大小时目录表文件本身的长度。
目录表和i节点两级结构
2.3 硬链接
- 目录表由目录项构成,目录项时一个“文件名-i节点号”对应关系。
- 根据文件系统的存储结构,可以在同一目录或者不同目录中的两个目录项,有相同的i节点号。
- 每个目录项指定的“文件名-i节点号”映射关系,叫做1个硬链接。
- 硬链接数目(link数):同一i节点被目录项引用的次数。
ln chapt0 intro # 给chapt0建立硬链接,也就意味着一个文件具有两个名字。chapt0和intro同时存在时,地位是平等的。删除其中的一个文件时,仅仅是Link数将减一,不会影响其他。
不允许对目录用ln命令建立硬链接。
2.4 符号链接
符号链接也叫软连接
- 用符号文件“符号链接文件”来实现;
- 文件中仅包括了一个路径名;