Linux 磁盘与文件系统(EXT2)简介
Linux 中,一切(或几乎一切)都是文件。
一、Linux 磁盘分区与文件系统
1.1 磁盘分区
磁盘的分区主要分为主分区和扩展分区
1)主分区:总共最多只能有四个主分区;
2)扩展分区:只能有一个,也算是主分区的一种,即:主分区 + 扩展分区最多只能有四个。但是扩展分区不能存储数据和格式化,必须将其再划分为逻辑分区才能使用;
3)逻辑分区 :逻辑分区是在扩展分区中划分的,如果是 IDE 硬盘,Linux 最多支持 59 个逻辑分区,如果是 SCSI 硬盘,Linux 最多支持 11 个逻辑分区
1.2 设备文件名
Linux 中一切都是文件,包括硬盘、鼠标、打印机等硬件设备也通常被表示(映射)为文件,用来表示这些硬件设备的文件的名字即为“设备文件名”。一般,设备文件名保存在 /dev/ 目录下,Linux 中常见的硬件设备的设备文件名如下:
硬件设备 | 设备文件名 |
IDE硬盘 | /dev/hd[a-d] |
SCSI/SATA/USB硬盘 | /dev/sd[a-p] |
光驱 | /dev/cdrom 或 /dev/hdc |
软盘 | /dev/fd[0-1] |
打印机(25针) | /dev/lp[0-2] |
打印机(USB) | /dev/usb/lp[0-15] |
鼠标 | /dev/mouse |
以 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 文件系统中:
block大小 | 1KB | 2KB | 4KB |
最大单一文件大小 | 16GB | 256GB | 2TB |
最大文件系统容量 | 2TB | 8TB | 16TB |
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 号码的使用与未使用。
写的比较乱,还请见谅。
参考资料:
《鸟哥的 Linux 私房菜 第三版》
《Linux 程序设计 第四版》
Linux 磁盘与文件系统(EXT2)简介的更多相关文章
- Linux磁盘和文件系统简介
Linux磁盘和文件系统简介 1.文件系统:存储设备上存储数据的方式方法 磁盘主要由盘片.机械手臂.磁头和主轴马达组成,而数据的写入实际是写在盘片上,磁盘的最小存储单位为扇区,每个扇区为512字节,扇 ...
- linux磁盘与文件系统的管理
本文涉及命令:dumpe2fs.df.du.fdisk.mkfs.mke2fs.fsck.badblocks.mount.umount.e2label.tune2fs.hdparm.parted 概念 ...
- Linux磁盘与文件系统概念理解
磁盘级别概念 这里讲的主要是网上所谓的老式磁盘,它是由一个个盘片组成的,我们先从个盘片结构讲起.如图1所示,图中的一圈圈灰色同心圆为一条条磁道,从圆心向外画直线,可以将磁道划分为若干个弧段,每 ...
- 漫谈Linux标准的文件系统(Ext2/Ext3/Ext4)
Ext 全称Linux extended file system, extfs,即Linux扩展文件系统,Ext2就代表第二代文件扩展系统,Ext3/Ext4以此类推,它们都是Ext2的升级版,只不过 ...
- Linux磁盘及文件系统(三)Linux文件系统
一.文件系统的组成 Linux常见的文件系统类型有ReiserFS,ext2,ext3,ext4,vfat,XFS等,文件系统是对一个存储设备上数据和元数据进行组织的机制.他的最终目的是把大量数据有组 ...
- linux磁盘以及文件系统
df 查看磁盘总容量 -i 显示inodes号 -h 使用合适的单位显示磁盘大小 -m 以M为单位显示 -k 以K为单位显示 默认K显示 du 用来查看某个目录或者文件所占空间大小 参数:-abckm ...
- 鸟哥的私房菜:Linux磁盘与文件系统原理
1 硬盘物理组成 //原理 磁头负责读写 磁道(硬盘同半径的一圈) 磁柱(所有盘磁道叠加起来的柱) 扇区(2条半径将磁道分开的一个扇形区域,是磁盘的最小存储单位) ------ ...
- Linux磁盘及文件系统(二)Linux下磁盘命名和分区
在为主机添加硬盘之前,首先需要了解Linux系统下对硬盘和分区的命令方法 一.磁盘命名 Linux下对SCSI和SATA设备是以sd命名的,第一个SCSI设备是sda,第二个是sdb....以此类推. ...
- Linux磁盘及文件系统(一)
一.磁盘 1.IO接口类型 (1)传输类型分类 并口:同一个线缆可以接多块设备 IDE口:两个,一个主设备,一个从设备 SCSI:宽带:16-1:窄带:8-1 串口:同一个线缆只可以接一个设备 (2) ...
随机推荐
- P3565 [POI2014]HOT-Hotels
题目描述 There are nn towns in Byteotia, connected with only n-1n−1 roads. Each road directly links two ...
- 看到了一个pipeline例子,
pipeline { agent any options { timestamps() } parameters { string(name: 'GIT_BRANCH', defaultValue: ...
- js之点击值发生变化
点击值发生变化,应用场景,比如像阿里云那样我通常密码是以******的形式存在,我必须要点击查看,它才会以明文显示. 在实际开发中,比如以智能门锁为例,安装门锁时,有个叫密码输入框的表单,这个是选填项 ...
- PAT乙级1016
1016 部分A+B (15 分) 正整数 A 的“DA(为 1 位整数)部分”定义为由 A 中所有 DA 组成的新整数 PA.例如:给定 A=3862767,DA=6,则 ...
- 测试oracle表空间自动扩展
2019-04-1116:01:25 表空间分配10m自动扩展,向表中插入数据,看表空间达到10m以后是否会报错. 测试过程如下: 1.创建表空间 CREATE TABLESPACE TEST DAT ...
- 名字&值
1)名字VS值 名字和内存(存储)位置相关联. 名字—(环境)———>位置——(状态)——>值 这两个映射都在随着程序的运行而改变. 2)环境VS状态 环境是指一个名字到存储位置映射,也可 ...
- laravel 的用户认证
1.简介 Laravel 中实现用户认证非常简单.实际上,几乎所有东西都已经为你配置好了.配置文件位于config/auth.php,其中包含了用于调整认证服务行为的.文档友好的选项配置. 在底层代码 ...
- Dll中调用dcpcrypt
可先在EXE中加入控件来参考,如要导出给其它语言调用参数得用PChar,XE以上的估计得再调整,待实用时再测试 如下代码在2007中可直接导出使用 uses Windows, SysUtils, DC ...
- Kafka基础认识
1):Apache kafka介绍及架构详解 假设一个场景: 数据源: 应用系统A 产生的用户访问数据和订单数据 10000 条一秒钟 push:推送数据 消息系统:队列 产生的数据量>数据量 ...
- 2017-2018-1 20155320 第五周 加分题-mybash的实现
2017-2018-1 20155320 第五周 加分题-mybash的实现 使用fork,exec,wait实现mybash 写出伪代码,产品代码和测试代码 发表知识理解,实现过程和问题解决的博客( ...