Linux 中,一切(或几乎一切)都是文件。
一、Linux 磁盘分区与文件系统
1.1 磁盘分区
磁盘的分区主要分为主分区和扩展分区
1)主分区:总共最多只能有四个主分区;
2)扩展分区:只能有一个,也算是主分区的一种,即:主分区 + 扩展分区最多只能有四个。但是扩展分区不能存储数据和格式化,必须将其再划分为逻辑分区才能使用;
3)逻辑分区 :逻辑分区是在扩展分区中划分的,如果是 IDE 硬盘,Linux 最多支持 59 个逻辑分区,如果是 SCSI 硬盘,Linux 最多支持 11 个逻辑分区
1.2 设备文件名
Linux 中一切都是文件,包括硬盘、鼠标、打印机等硬件设备也通常被表示(映射)为文件,用来表示这些硬件设备的文件的名字即为“设备文件名”。一般,设备文件名保存在 /dev/ 目录下,Linux 中常见的硬件设备的设备文件名如下:
以 SATA 硬盘为例,sda 表示计算机的第一块硬盘,sdb 表示计算机的第二块硬盘,sdc 表示第三块硬盘。如果对硬盘进行了分区,以 sda 为例,则,sda1、sda2、sda3 和 sda4 分别用来表示该硬盘的四个主分区,sda5、sda6、... 、sda15 则用来表示逻辑分区(SATA硬盘最多支持 11 个逻辑分区)。
用 ls 命令查看 /dev/ 目录下的具体文件,如下:
在上图中,黄色字体即为设备文件。可以看到有:sda、sda1、sda2,这里,sda 表示计算机的第一块硬盘、sda1、sda2 分别代表第一块硬盘的两个主分区。
1.3 Linux 文件系统的类型
1)EXT 文件系统:
EXT -- 扩展文件系统,是于 1992 年 4 月发表的一种文件系统,是为 Linux 核心所做的第一个文件系统,最大可支持 2GB 的文件系统。
EXT2:是 EXT文件系统的升级版,最大支持 16TB 的分区和最大 2TB 的文件;
EXT3:是 EXT2文件系统的升级版,最大的区别是带有日志功能,以在系统突然崩溃时提高文件系统的可靠性,最大支持 16TB 的分区和最大 2TB 的文件;
EXT4:是 EXT3文件系统的升级版,EXT4在性能、伸缩性、可靠性上进行了大量的改进。它向下兼容 EXT3,最大支持 1EB(1024 * 1024TB) 的分区和 16TB 文件,更快,更安全。
2)XFS 文件系统:
XFS 是一种高性能的日志文件系统 ,CentOS 7 默认使用的就是 XFS 文件系统。
3)如何查看文件系统的类型:
可以使用 df -T 指令来查看文件系统的类型:
笔者所用的是 Centos 7 系统,可以看到 /dev/sda1 是 XFS 文件系统。
二、简单了解一下 Linux 的 EXT2 文件系统
EXT2 -- 第二代扩展文件系统,是 Linux 内核使用的一种以 inode 为基础的一种文件系统。在 EXT2 文件系统中,我们需要要了解几个概念:
2.1、block
我们知道,文件是存储在硬盘上的,硬盘的最小存储单位是“扇区(sector)”,每个扇区可以存储 512 个字节(0.5KB)。但操作系统在读取硬盘的时候,不是一个扇区一个扇区地读取,这样效率会很低,而是会一次性连续读取多个扇区,即一个“块(block)”,这种由多个扇区组成的“块”是文件存取的最小单位。在 EXT2 文件系统中,使用 data block 来记录文件的实际内容。
1)每个 block 都有编号,方便 inode 记录查找;
2)一个文件可能占用多个 block,没读取一个 block 就会消耗一个磁盘 I/O;
3)如果 block 太大,则存放小文件时会造成磁盘空间的浪费;如果 block 太小,则存取文件的效率会变低(消耗更多的磁盘 I/O);
4)EXT2 文件系统支持的 block 有 1KB、2KB、4KB三种,默认一个 block 为 1KB;
5)block 的大小是在格式化时就已经确定了的,除非重新格式化(或者使用 resize2fs 等命令改变文件系统大小),否则 block 的大小固定后就不再改变;
6)block 大小的不同,会导致文件系统能够支持的最大磁盘容量及最大单一文件容量不相同,在 EXT2 文件系统中:
7)EXT2 文件系统在格式化时,会将磁盘分为多个块组(block group),每个 block group 都有独立的inode/block/super block 。
2.2、inode(索引节点)
既然我们已经知道文件数据存放在 block 中,那么如何找到所需的 block 呢,这就需要用到 inode 了。 inode 是文件系统中的一个特殊的数据块,存放了文件属性相关的信息,包括文件的创建/修改日期、文件的创建者、文件的大小、文件在磁盘上的存放位置以及文件的访问权限等。在 Linux kernel 2.6.34 版本, /include/linux/fs.h 文件中有对 inode 结构体的定义,可以作为参考:
struct inode {
struct hlist_node i_hash;
struct list_head i_list; /* backing dev IO list */
struct list_head i_sb_list;
struct list_head i_dentry;
unsigned long i_ino;
atomic_t i_count;
unsigned int i_nlink;
uid_t i_uid;
gid_t i_gid;
dev_t i_rdev;
unsigned int i_blkbits;
u64 i_version;
loff_t i_size;
#ifdef __NEED_I_SIZE_ORDERED
seqcount_t i_size_seqcount;
#endif
struct timespec i_atime;
struct timespec i_mtime;
struct timespec i_ctime;
blkcnt_t i_blocks;
unsigned short i_bytes;
umode_t i_mode;
spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */
struct mutex i_mutex;
struct rw_semaphore i_alloc_sem;
const struct inode_operations *i_op;
const struct file_operations *i_fop; /* former ->i_op->default_file_ops */
struct super_block *i_sb;
struct file_lock *i_flock;
struct address_space *i_mapping;
struct address_space i_data;
#ifdef CONFIG_QUOTA
struct dquot *i_dquot[MAXQUOTAS];
#endif
struct list_head i_devices;
union {
struct pipe_inode_info *i_pipe;
struct block_device *i_bdev;
struct cdev *i_cdev;
};
__u32 i_generation;
#ifdef CONFIG_FSNOTIFY
__u32 i_fsnotify_mask; /* all events this inode cares about */
struct hlist_head i_fsnotify_mark_entries; /* fsnotify mark entries */
#endif
#ifdef CONFIG_INOTIFY
struct list_head inotify_watches; /* watches on this inode */
struct mutex inotify_mutex; /* protects the watches list */
#endif
unsigned long i_state;
unsigned long dirtied_when; /* jiffies of first dirtying */
unsigned int i_flags;
atomic_t i_writecount;
#ifdef CONFIG_SECURITY
void *i_security;
#endif
#ifdef CONFIG_FS_POSIX_ACL
struct posix_acl *i_acl;
struct posix_acl *i_default_acl;
#endif
void *i_private; /* fs or device private pointer */
};
可以看到,inode 结构体中有许多文件属性相关的变量,关于 inode,有:
1)inode 是一种用于存放文件属性信息的特殊数据块;
2)每个文件仅占有一个 inode,因此,文件系统所能够创建的文件数量与 inode 的数量有关;
3)每个 inode 都有一个编号,实际上,操作系统就是使用这个 inode 编号来识别不同的文件的。对于操作系统来说,文件名只是 inode 编号的一个别称,便于用户识别;
4)inode 的数量与大小在格式化时就已经确定了,不能再做更改;
5)EXT2 中,inode 的大小默认为 128Byte;
6)系统在读取文件时,先找到 inode 编号,然后获取 inode 里面的文件属性和权限,匹配正确后才能够开始读取 block 的内容。
可以使用 ls -i 命令来查看文件名对应的 inode 编号:
如图,第一列即为文件名所对应的 inode 号。
2.3、super block(超级块)
Super block 用于记录文件系统的整体信息,其大小为 1024Byte,主要包括:
1)block/inode 的总量;
2)block/inode 的使用量;
3)block/inode 的剩余量;
4)block/inode 的大小;
5)文件系统的挂载时间、最后一次写入数据的时间等文件系统相关信息
2.4、File System Description(文件系统描述)
这个区段可以描述每个 block group 的开始与结束的 block 号码,并说明每个区段分别介于哪个 block 号码之间。
2.5、block bitmap(块对照表)
由于一个 block 只能被一个文件使用,因此新添加一个文件时,就会用到新的 block 来记录文件数据。可以使用 block bitmap 来确认哪些 block 是空的,哪些是被使用了的,这样系统就可以快速的找到可使用的 block 来处理文件。同样,当删除某个文件时,该文件原本占用的 block 号码就会被释放,并在 block bitmap 中把该 block 号码所对应的标志更新为未使用状态,然后释放 block、
2.6、inode bitmap (inode 对照表)
功能与 block bitmap 类似,用于记录 inode 号码的使用与未使用。