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)简介的更多相关文章

  1. Linux磁盘和文件系统简介

    Linux磁盘和文件系统简介 1.文件系统:存储设备上存储数据的方式方法 磁盘主要由盘片.机械手臂.磁头和主轴马达组成,而数据的写入实际是写在盘片上,磁盘的最小存储单位为扇区,每个扇区为512字节,扇 ...

  2. linux磁盘与文件系统的管理

    本文涉及命令:dumpe2fs.df.du.fdisk.mkfs.mke2fs.fsck.badblocks.mount.umount.e2label.tune2fs.hdparm.parted 概念 ...

  3. Linux磁盘与文件系统概念理解

    磁盘级别概念     这里讲的主要是网上所谓的老式磁盘,它是由一个个盘片组成的,我们先从个盘片结构讲起.如图1所示,图中的一圈圈灰色同心圆为一条条磁道,从圆心向外画直线,可以将磁道划分为若干个弧段,每 ...

  4. 漫谈Linux标准的文件系统(Ext2/Ext3/Ext4)

    Ext 全称Linux extended file system, extfs,即Linux扩展文件系统,Ext2就代表第二代文件扩展系统,Ext3/Ext4以此类推,它们都是Ext2的升级版,只不过 ...

  5. Linux磁盘及文件系统(三)Linux文件系统

    一.文件系统的组成 Linux常见的文件系统类型有ReiserFS,ext2,ext3,ext4,vfat,XFS等,文件系统是对一个存储设备上数据和元数据进行组织的机制.他的最终目的是把大量数据有组 ...

  6. linux磁盘以及文件系统

    df 查看磁盘总容量 -i 显示inodes号 -h 使用合适的单位显示磁盘大小 -m 以M为单位显示 -k 以K为单位显示 默认K显示 du 用来查看某个目录或者文件所占空间大小 参数:-abckm ...

  7. 鸟哥的私房菜:Linux磁盘与文件系统原理

    1 硬盘物理组成     //原理 磁头负责读写     磁道(硬盘同半径的一圈) 磁柱(所有盘磁道叠加起来的柱)     扇区(2条半径将磁道分开的一个扇形区域,是磁盘的最小存储单位) ------ ...

  8. Linux磁盘及文件系统(二)Linux下磁盘命名和分区

    在为主机添加硬盘之前,首先需要了解Linux系统下对硬盘和分区的命令方法 一.磁盘命名 Linux下对SCSI和SATA设备是以sd命名的,第一个SCSI设备是sda,第二个是sdb....以此类推. ...

  9. Linux磁盘及文件系统(一)

    一.磁盘 1.IO接口类型 (1)传输类型分类 并口:同一个线缆可以接多块设备 IDE口:两个,一个主设备,一个从设备 SCSI:宽带:16-1:窄带:8-1 串口:同一个线缆只可以接一个设备 (2) ...

随机推荐

  1. 1875. [SDOI2009]HH去散步【矩阵乘法】

    Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又 ...

  2. PhotoSwipe-一个好用的图片放大缩小插件

    通过GitHub 下载PhotoSwipe https://github.com/dimsemenov/PhotoSwipe 相关的库 <link rel="stylesheet&qu ...

  3. 【node.js】Stream(流)

    Stream 有四种流类型: Readable - 可读操作. Writable - 可写操作. Duplex - 可读可写操作. Transform - 操作被写入数据,然后读出结果. 所有的 St ...

  4. [luogu3943] 星空

    题面 ​ 这个题目大意上是这样的:给定一个长度为n的01串, 其中只有k个0, 每次操作时, 从给定的m种长度中选择一种, 选择序列上长度为这种的进行反转操作, 求至少需要多少次操作使得整个串全变为1 ...

  5. Zookeeper入门(四)之Leader选举

    让我们分析如何在ZooKeeper集合中选举leader节点.考虑一个集群中有N个节点.leader选举的过程如下: 所有节点创建具有相同路径 /app/leader_election/guid_ 的 ...

  6. oracle数据库之操作总结

    ## 连接数据库: sqlplus test/test##@localhost:/ORCL ## 查询数据库所有的表: select table_name from user_tables; ## 查 ...

  7. python js 处理弹窗图片

    内置函数 : driver.execute_script() 2.自定义弹窗 由于alert弹窗不美观,现在大多数网站都会使用自定义弹窗,使用Selenium自带的方法就驾驭不了了,此时就要搬出JS大 ...

  8. ZOJ3202-Second-price Auction(根据输入输出判断是队列还是栈)

    A Stack or A Queue? Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu S ...

  9. ruby puts, print, p方法比较

    1.puts([obj[, obj2[, ....]]] ) 依次将obj和换行符输出到$>.若没有参数的话则只会输出换行符. 若参数是数组,则依次输出数组元素和换行符.若将既非数组又非字符串的 ...

  10. Go语言中的常量

    1 概述 常量,一经定义不可更改的量.功能角度看,当出现不需要被更改的数据时,应该使用常量进行存储,例如圆周率.从语法的角度看,使用常量可以保证数据,在整个运行期间内,不会被更改.例如当前处理器的架构 ...