linux磁盘操作

 

       文件系统组织形式

 

                 作者:下家山

一:文件系统的三个区域

 

1.1 怎么知道超级块

上面中有一个主超级快primary superblock和一个备份超级快backup superblock

1.2 如何查看节点数

1.3 如何查看磁盘空间

   

1.4 如何查看硬盘分区信息

1.5 如何查看某个文件的节点号

能看出节点数是按什么顺序排列的吗?【文件创建的顺序】

1.6 如何查看一个文件占用多少块

Aa占用192块

Bb 0字节0块

【课堂作业,写程序验证文件大小与块的关系】

压缩文件占用156256个块

二:磁盘空间与节点数的关系

http://blog.sina.com.cn/s/blog_6c9d65a10101byi6.html

文件,目录,文件系统与i节点

 

前些天, 有人问了我一个问题, 怎么确定当前文件系统能放多少文件? 

 

我的第一个反应, 就是文件大小, 紧接着, 就发现不对, 应该是i节点的数量剩余.

 

太久没用到这个知识了, 都淡忘了, 当时比较清楚的时候是2010年2月份在上RHCE的课程的时候, 老师讲过一次, 之后就没再复习过和用到过了, 因为虽然我常年使用linux, 却也没碰到极端情况导致出问题. 

 

今天五一, 又值班, 反正没什么事, 就复习一下好了.

 

想想, 当我们cd进入一个目录, 然后ls出目录里面包含的文件的名字, 然后cat加上文件名或者类似的操作去操作文件, 操作系统是怎么确定当前的文件是否能给当前的用户查看或者编辑呢? 又是怎么确定文件在什么地方呢? 还有怎么知道文件的名字呢? 

 

这就有一个概念了, i节点(i node).

 

在ext文件系统当中, 文件的唯一标识就是i节点, 每个文件都有个i节点号, 目录也是如此, 其实根据linux的风格, 就是一切都是文件, 所以所谓的"目录"也只是一个比较特殊的文件而已.

 

文件系统被创建的时候, 分区被分成3个部分, 超级块, i节点表, 还有数据区. 超级块存放文件系统本身的结构信息. 比如, 超级块记录了每个区域的大小, 超级块也存放未被使用的磁盘块的信息.  i节点表存放着文件的一些属性,如文件的大小, 文件所有者, 和创建时间等, 这些性质被记录在一个称为i节点的结构中. 所有i节点都有相同的大小, 并且i节点表是这些结构的一个列表, 文件系统中每个文件在该表中都有一个i节点, 需要注意的是, i节点并不存放文件的名字. 数据区保存了文件的实际的内容. 磁盘上所有块的大小都一样, 这个跟文件系统的块大小是可以不一样的, 文件系统的块大小可以在格式化的时候指定, 这也就是为什么众多SSD玩家买了SSD硬盘之后要4K对齐的最终原因了, 因为传统的格式化的默认的文件系统的块大小跟SSD这种新型的存储设备的块大小是不一样的(传统的是512字节, 而SSD是4096字节), 如果文件系统的块是512而SSD的默认块是4096, 那么读取文件的时候效率就是个问题了, 因为本来读取一次就可以的数据需要读取多次.  如果如果文件包含了超过一个块的内容, 则文件内容会存放在多个数据区的块中. 

 

当操作系统需要读取文件的时候, 也就是我们操作文件的时候, 它会去寻找文件的i节点, 然后根据i节点的信息去判断当前用户是否有权限访问, 如果有权限访问, 则根据i节点的信息去读取数据块. 这里再说一下, 在一个繁忙的服务器, 可以在挂载文件系统的时候使用noatime参数去挂载, 这样的话, 每次读取文件都不会有额外的一次磁盘操作去更新i节点的access time, 有时候在调优的时候还是很有用的.

 

通过i节点能找到文件, 但是我们编辑文件的时候并不是通过i节点去找文件啊, 我们是通过文件名去找文件啊, 那么这中间又是怎么回事呢?

 

这就是目录的作用了, 目录, 存储的不是实际的文件, 它存储的是文件名还有相应的i节点的号码, 仅此而已.

 

那么整个过程就明了了. 

 

有时候会看到有人在奇怪, 为什么目录里面放了很多文件, 它的大小始终是4096呢? 难道它不会变大么? 

 

它是会变大的, 根据上面的理论, 目录存储的是文件名跟i节点的号码, 那么目录的"大小"就会在文件到达一定个数的时候变化, 来看一下.

 

[root@cclove ~]# mkdir ccloveDir # 创建一个目录

[root@cclove ~]# ls -l # 看一下这个目录的大小

total 4

drwxr-xr-x. 2 root root 4096 May  1 20:47 ccloveDir # 4096个字节

[root@cclove ~]# for i in `seq 1 339`;do touch ccloveDir/$i;done # 在文件夹里面创建339个空文件

[root@cclove ~]# ls -l # 查看大小

total 4

drwxr-xr-x. 2 root root 4096 May  1 20:57 ccloveDir # 依旧是4096个字节

[root@cclove ~]# touch ccloveDir/340 # 再创建一个

[root@cclove ~]# ls -l # 查看大小

total 12

drwxr-xr-x. 2 root root 12288 May  1 20:57 ccloveDir # 目录变大了

[root@cclove ~]# rm ccloveDir/* -f # 删除目录里面的所有文件

[root@cclove ~]# ls -l # 查看大小

total 12

drwxr-xr-x. 2 root root 12288 May  1 21:00 ccloveDir # 依旧是12288个字节

[root@cclove ~]#

 

 

以上实验可以看到, 目录里面文件个数到达340个文件的时候, 目录这个"文件"占用的磁盘空间就会增大, 而且把文件删除之后, 占用的空间不会释放.

 

那么是不是每个文件都会占用一个i节点呢? 再来做个试验.

 

[root@cclove ~]# df -i # 看一下磁盘的i节点的当前状况

Filesystem            Inodes   IUsed   IFree IUse% Mounted on

/dev/mapper/VolGroup-lv_root

                     1868640   28210 1840430    2% /

tmpfs                  31123       1   31122    1% /dev/shm

/dev/sda1             128016      38  127978    1% /boot

[root@cclove ~]# touch cclove1 # 创建一个文件

[root@cclove ~]# df -i 

Filesystem            Inodes   IUsed   IFree IUse% Mounted on # IFree少了一个

/dev/mapper/VolGroup-lv_root

                     1868640   28211 1840429    2% /

tmpfs                  31123       1   31122    1% /dev/shm

/dev/sda1             128016      38  127978    1% /boot

[root@cclove ~]# touch cclove2 # 再创建一个文件

[root@cclove ~]# df -i

Filesystem            Inodes   IUsed   IFree IUse% Mounted on # IFree又少了一个

/dev/mapper/VolGroup-lv_root

                     1868640   28212 1840428    2% /

tmpfs                  31123       1   31122    1% /dev/shm

/dev/sda1             128016      38  127978    1% /boot

[root@cclove ~]#

 

 

从上面的实验可以看到, 每个文件会占用一个i节点.

 

那么如果i节点耗尽会怎样呢? 继续实验.

 

[root@cclove ~]# dd if=/dev/zero of=ccloveBlock bs=1M count=5 # 创建一个5MB大小的文件用来格式化

5+0 records in

5+0 records out

5242880 bytes (5.2 MB) copied, 0.053163 s, 98.6 MB/s

[root@cclove ~]# mkfs.ext4 ccloveBlock # 格式化这个文件

mke2fs 1.41.12 (17-May-2010)

ccloveBlock is not a block special device.

Proceed anyway? (y,n) y # 由于它识别到这个不是真正的块设备文件, 会询问, y就可以了

Filesystem label=

OS type: Linux

Block size=1024 (log=0)

Fragment size=1024 (log=0)

Stride=0 blocks, Stripe width=0 blocks

1280 inodes, 5120 blocks

256 blocks (5.00%) reserved for the super user

First data block=1

Maximum filesystem blocks=5242880

1 block group

8192 blocks per group, 8192 fragments per group

1280 inodes per group

 

Writing inode tables: done

Creating journal (1024 blocks): done

Writing superblocks and filesystem accounting information: done

 

This filesystem will be automatically checked every 21 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.

[root@cclove ~]# mkdir ccloveMount # 创建挂载点

[root@cclove ~]# mount -o loop ccloveBlock ccloveMount/ # 挂载这个文件到挂载点

[root@cclove ~]# df -i # 查看当前i节点信息

Filesystem            Inodes   IUsed   IFree IUse% Mounted on

/dev/mapper/VolGroup-lv_root

                     1868640   28212 1840428    2% /

tmpfs                  31123       1   31122    1% /dev/shm

/dev/sda1             128016      38  127978    1% /boot

/root/ccloveBlock       1280      11    1269    1% /root/ccloveMount # 看起来, IFree有1269个, 那么理论上还可以创建1269个文件

[root@cclove ~]# for i in `seq 1 1268`;do touch ccloveMount/$i;done # 先创建1268个文件看看

[root@cclove ~]# df -i

Filesystem            Inodes   IUsed   IFree IUse% Mounted on

/dev/mapper/VolGroup-lv_root

                     1868640   28212 1840428    2% /

tmpfs                  31123       1   31122    1% /dev/shm

/dev/sda1             128016      38  127978    1% /boot

/root/ccloveBlock       1280    1279       1  100% /root/ccloveMount # Um..只剩下一个i节点了

[root@cclove ~]# touch ccloveMount/1269 # 再创建一个文件

[root@cclove ~]# df -i

Filesystem            Inodes   IUsed   IFree IUse% Mounted on

/dev/mapper/VolGroup-lv_root

                     1868640   28212 1840428    2% /

tmpfs                  31123       1   31122    1% /dev/shm

/dev/sda1             128016      38  127978    1% /boot

/root/ccloveBlock       1280    1280       0  100% /root/ccloveMount # 这下i节点耗尽了

[root@cclove ~]# touch ccloveMount/1270 # 再创建文件

touch: cannot touch `ccloveMount/1270': No space left on device # 失败了丫, 说设备没空间

[root@cclove ~]# df -h # 查看空间

Filesystem            Size  Used Avail Use% Mounted on

/dev/mapper/VolGroup-lv_root

                       29G  930M   26G   4% /

tmpfs                 122M     0  122M   0% /dev/shm

/dev/sda1             485M   30M  430M   7% /boot

/root/ccloveBlock     4.9M  1.1M  3.6M  24% /root/ccloveMount # 其实还有3.6MB剩余呢

[root@cclove ~]#

 

 

从上面的试验可以看出, 剩余多少i节点, 就可以创建多少文件, i节点用完了, 就不能创建文件了, 而这时报错是设备没空间, 这个报错并没有说明真正的问题.

 

三:如何挂载u盘

 

3.1 如何查看所插u盘容量信息

 

3.2 U盘查上了,为什么看不到?

记得连接u盘

3.3 怎么访问u盘?

3.4 如何挂载u盘?

3.5 真的挂载成功了吗?

四:挂载远程主机

mount -t nfs 192.168.0.32:/home/xiajiashan/iotek/ht1502/root_nfs ./mnt-nfs/

发布了38 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_27320195/article/details/85236279