【Linux系统编程】| 【10】设备、磁盘、分区

1、设备文件

设备文件一般位于/dev目录下,root可使用mknod创建设备文件;
【类型】:
	- 字符型设备,基于每个字符来处理数据(键盘、终端);
	- 块设备,则每次处理一块数据,块的大小取决于设备类型(磁盘、磁带);

【设备ID】:每个设备文件都有主、辅ID号各一,内核会使用ID号查找与该类设备相应的驱动程序;
	- 辅ID号能在一般等级中唯一标识特定设备;
	- 【设备的i节点】:记录设备文件的主、辅ID;

2、磁盘和分区

常规文件和目录通常存放在硬盘中(CD-ROM、flash内存);

磁盘驱动器

为机械装置,由一个或多个高速旋转的盘片组成,通过磁盘快速移动的读/写磁头,可获取/修改磁盘表面的磁性编码信息;
【磁道】:信息物理上存储于此同心圆上,自身被划分为若干个扇区,每个扇区包含一系列物理块(512字节);
【读写】:当读写操作时,磁头要移动到相应磁道,在相应扇区旋转到磁头下之前,驱动器必须一直等待,后从所请求的块上传输数据;
【管理】:可使用fdisk来决定磁盘分区的编号、大小、类型;
【记录】:可在/proc/pratitions中每个磁盘分区的信息;

磁盘分区

可将每块磁盘划分为一个或多个分区,内核将每个分区视为/dev下的设备;
【磁盘分区可容纳任何类型的信息】:
	- 文件系统:存储常规文件;
	- 数据区域:作为裸设备对其进行访问;
	- 交换区域:供内核的内存管理;
		可通过mkswap命令来创建;swapoff停止磁盘分区用作交换区域;

3、文件系统

文件系统时对常规文件和目录的组织集合,可用mkfs创建;
	- 可在/proc/filesystems查看当前为内核所知的文件系统类型;

Linux 2.6.14中添加用户空间文件系统,为内核添加挂钩,便于用户空间程序来完整实现文件系统,无需对内核进行修补或重新编译;
3.1 ext2文件系统
应用最为广泛,是其他几种文件系统的实现原型;
	- 可用mkfs来指定逻辑块的大小;
	- 在系统崩溃后为确保文件系统完整,重启时需要对文件系统进行一致性检查,会耗费大量时间;
3.2 文件系统结构
用来分配空间的基本单元是逻辑块;
	- 特权级程序可用ioctl的FIBMAP操作,来判定文件指定逻辑块的物理位置;

【组成】:
- 引导块:为文件系统首块,但不为文件系统所用,只是包含引导操作系统的信息;
- 超级块:紧随引导块后的独立块,包含于文件系统有关的参数信息;
- i节点表:文件系统的每个文件或目录该表中对应着唯一的记录(文件的信息);
- 数据块:用于存放数据;

在这里插入图片描述

4、i节点

【i节点维护以下信息】:
	- 文件类型;
	- 文件属主;
	- 文件属组;
	- 3类用户的访问权限;
	- 3个时间戳:最后访问、修改、改变时间;
	- 指向文件的硬链接数;
	- 文件的大小,以字节为单位;
	- 实际分配给文件的块数量;,以512字节块;
	- 指向为你教案数据块的指针;
4.1 ext2的i节点和数据块指针
在ext2中,数据块不一定连续,内核在i节点中维护一组指针;
【为什么采用无连续内存块】:
	- 提高磁盘空间的利用率,降低空闲磁盘空间的碎片程度;

在这里插入图片描述

在该系统中,每个i节点包含15个指针,前12个指向前12块在文件系统中的位置;接下来是指指针块的指针,
提供了第13个及后续数据块的位置;
【文件黑洞】:
	文件系统只需将i节点和间接指针块中的相应指针打上标记,表明该指针并未指向实际的磁盘块,无需为文件黑洞分配
	空字节数据块;

5、虚拟文件系统VFS

VFS针对文件系统定义了一套通用接口;
open()、read(、write()、lseek()、close()、truncate()、stat()、mount()、umount()、mmap()、mkdir)、link()、unlink(、symlink()以及rename();

在这里插入图片描述

6、日志文件系统

解决了ext2系统崩溃后,重启一致性检查耗费的大量时间;
在更新时,将更新操作记录于专业的磁盘日志文件中,对元数据更新的记录是按其相关性分组进行;
若系统崩溃,重启时可利用日志重做,任何不完整的更新;

7、单根目录层级和挂载点

可使用mount将指定的文件系统进行挂载;使用unmount即卸载文件系统;
如:mount device directory 将device挂载到directory

若直接使用mount即可查看当前已挂载的文件系统;

8、文件系统的挂载和卸载

- 通过/proc/mounts,可查看当前已挂载文件系统的列表;
- mount和unmount会自动维护/etc/mtab文件,该文件包含的信息于/proc/mounts内容类似,但更为详细;
- /etc/fstab包含了对系统支持的所有文件系统的描述;

【/proc/mounts记录】:一条记录共6个字段
- 已挂载设备名;
- 设备的挂载点;
- 文件系统类型;
- 挂载标志;
- 载/etc/fstab才会用到该字段和第6个字段,在/proc/mounts和/etc/mtab中字段为0;
- 在系统引导时,用于控制fsck对文件系统的检查顺序;
8.1 挂载文件系统:mount
#include <sys/mount.h>

int mount(const char *source, const char *target, const char *fstype,
			unsigned long mountflags, const void *data);
/**
@func: 将source指定设备包含的文件系统,挂载到由target目录下;
@param fstype: 用来标识设备所含文件系统类型;
@param mountflags: 为一位掩码;
	MS_BIND:建立绑定挂载(始于Linux 2.4)
	MS_DIRSYNC:同步更新路径(始于Linux 2.6)
	MS_MANDLOCK:允许强制锁定文件
	MS_MOVE:以原子操作将挂载点移到新位置
	MS_NOATIME:不更新文件的最后访问时间
	MS_NODEV:不允许访问设备
	MS_NODIRATIME:不更新目录的最后访问时间
	MS_NOEXEC:不允许程序执行
	Ms_NOSUID:禁用set-user-ID和 set-group-ID程序
	MS_RDONLY:以只读方式挂载;不能修改或创建文件
	MS_REC:递归挂载(始于Linux 2.6.20)
	MS_RELATIME:只有当最后访问时间早于最后修改时间或最后状态变更时间时,才对前者进行更新(始于Linux 2.4.11)
	MS_REMOUNT:使用新的mountflags和 data重新挂载
	MS_STRICTATIME:总是更新最后访问时间(始于Linux 2.6.30)
	MS_SYNCHRONOUS:使得所有文件和目录同步更新;
@param data: 指向信息缓冲区;

*/
8.2 卸载文件系统
#include <sys/mount.h>

int unmount(const char *target);
/**
@func: 用于卸载已挂载的文件系统;
@param target: 指定卸载文件系统的挂载点;
*/

int unmount(const char *target, int flags);
/**
@param flags: 
	MNT_DETACH:执行lazy卸载;
	MNT_EXPIRE:将挂载点标记为到期;
	MNT_FORCE:强行卸载,可能会造成数据丢失;
	UNMOUT_NOFOLLOW: 若target为符号链接,则不对其进行解引用;
*/

9、高级挂载特性

9.1 在多个挂载点挂载文件系统
从Linux2.4开始一个文件系统挂载于文件系统内的多个位置;
9.2 多次挂载同一挂载点
从Linux2.4,Linux允许针对同一个挂载点执行多次挂载,每次新挂载都会隐藏之前可见于挂载点下的目录子树;
	卸载最后一次挂载时,挂载点下上次挂载的内容会再次显示;
9.3 绑定挂载
指在文件系统目录层级的另一处挂载目录或文件,将导致文件或目录在两处同时可见;
【挂载类似硬链接,但存在差异】:
- 绑定挂载可跨越多个文件系统挂载点;
- 可针对目录执行绑定挂载;

10、虚拟内存文件系统:tmpfs

是Linux内核的可选组件,通过CONFIG_TMPFS选项加以配置;
【命令】:mount -t tmpfs source target;
默认情况下,允许将tmpfs文件系统大小提高至RAM容量一般;
	会根据当前持有的文件来消耗内存和交换空间;
一旦卸载tmpfs文件系统,或系统奔溃,该文件学系统的所有数据都将丢失;

【特殊用途】:
- 由内核内部挂载的隐形tmpfs文件系统,用于实现System V共享内存和共享匿名内存映射;
- 挂载于/dev/shm的tmpfs文件系统,为glibc用以实现POSIX共享内存和POSIX信号量;

11、获得与文件系统有关的信息

#include <sys/statvfs.h>

int statvfs(const char *pathname, struct statvfs *statvfsbuf);
/**
@func: 需使用pathname指定文件系统任一文件的名称;
	
*/

int fstatvfs(int fd, struct statvfs *statvfsbuf);
/**
@func: 需打开文件描述符,来指代文件系统中的任一文件
*/

struct statvfs {
unsigned long f_bsize; /*File-system block size (in bytes) */
unsigned long f_frsize; /*Fundamental file-system block size(in bytes)*/
fsblkcnt_t f_blocks;	/*Total number of blocks in file system (in units of 'f_frsize') */
fsblkcnt_t f_bfree;		/* Total number of free blocks */
fsblkcnt_t f_bavail;		/* Number of free blocks available to unprivileged process */
fsfilcnt_t f_files;		/*Total number of i-nodes*/
fsfilcnt_t f_ffree;		/*Total number of free i-nodes*/
fsfilcnt_t f_favail;	/*Number of i-nodes available to unprivileged process (set to 'f_ffree' on Linux)*/
unsigned long f_fsid; 	/*File-system ID */
unsigned long f_flag;	/* Mount flags*/
unsigned long f_namemax;	/*Maximum length of filenames on this file system*/
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jxiepc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值