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) ...
随机推荐
- ajax调用webservice 跨域问题
用js或者jquery跨域调用接口时 对方的接口需要做jsonp处理,你的ajax jsonp调用才可以 egg 接口中已经做了jsonp处理,所以可以跨域调用 //$.ajax({ // url: ...
- mysql通过“延迟关联”进行limit分页查询优化的一个实例
最近在生产上遇见一个分页查询特别慢的问题,数据量大概有200万的样子,翻到最后一页性能很低,差不多得有4秒的样子才能出来整个页面,需要进行查询优化. 第一步,找到执行慢的sql,如下: SELECT ...
- MySQL(四)执行计划
转载自:Oo若离oO,原文链接 在MySQL中使用explain查询SQL的执行计划 目录 一.什么是执行计划 二.如何分析执行计划 一.什么是执行计划 要对执行计划有个比较好的理解,需要先对MySQ ...
- 【题解】洛谷P4158 [SCOI2009] 粉刷匠(DP)
次元传送门:洛谷P4158 思路 f[i][j][k][0/1]表示在坐标为(i,j)的格子 已经涂了k次 (0是此格子涂错 1是此格子涂对)涂对的格子数 显然的是 每次换行都要增加一次次数 那么当j ...
- 源码编译安装mysql-boost-5.7.16.tar.gz报错分析处理
Plugin 'FEDERATED' is disabled. mysqld: Table 'mysql.plugin' doesn't exist [ERROR] Can't open the ...
- 更改KVM虚拟机root的密码
今天在使用qemu-kvm安装一个虚拟机,因为已经有一个虚拟机的image文件(qcow2格式的),所以创建虚拟机很简单,直接通过以下命令从image启动就行了. qemu-kvm -cpu host ...
- 【转】SVG与HTML、JavaScript的三种调用方式
原文:https://www.cnblogs.com/guohu/p/5085045.html SVG与HTML.JavaScript的三种调用方式 一.在HTMl中访问SVG的DOM 1 2 3 4 ...
- 可变多隐层神经网络的python实现
说明:这是我对网上代码的改写版本,目的是使它跟前一篇提到的使用方法尽量一致,用起来更直观些. 此神经网络有两个特点: 1.灵活性 非常灵活,隐藏层的数目是可以设置的,隐藏层的激活函数也是可以设置的 2 ...
- 【转载】ArcBall二维控制三维旋转
原文:http://oviliazhang.diandian.com/post/2012-05-19/40027878859 由于目前大多的显示器是二维的,要控制三维物体的旋转就显得不那么直接了.Ar ...
- 一维码ITF 25简介及其解码实现(zxing-cpp)
一维码ITF 25又称交插25条码,常用在序号,外箱编号等应用.交插25码是一种条和空都表示信息的条码,交插25码有两种单元宽度,每一个条码字符由五个单元组成,其中二个宽单元,三个窄单元.在一个交插2 ...