【Linux@基础篇 ~】# 磁盘与文件系统

之前三篇文章我们简单介绍了Linux系统的用户管理,文件操作等,都是比较浅显的基本操作。这节我们要深入一下了,从文件系统我们要看到磁盘系统。从磁盘系统我们要看到操作系统的整体架构。废话不多少让我们开始学习吧!

 

磁盘与文件系统

 

1、磁盘系统

1.1 磁盘结构

 

技术分享

如图所示,磁盘由扇区和柱面组成,分区的最小单位是柱面(柱是有厚度的,本图是截面图),磁盘读取的最小单位是扇区。第一扇区的MBR(446bytes)分区表可以最大包含四个分区(64bytes)的信息,即从开始柱面到结束柱面4组数据,每组16个字节,每个值8个字节,即柱号最大为2^16-1。扩展分区由主分区组成,扩展分区分出的分区称为逻辑分区。主分区与扩展分区最多可以4个;扩展分区最多只能一个;能够被格式化后作为数据访问的分区为主分区和逻辑分区,扩展分区无法格式化。SATA硬盘逻辑分区从5-15,IDE硬盘逻辑分区从5-63。

1.2 查看挂载的设备

Linux分区表示可可挂载的设备,每个分区上可以挂载相应的文件系统(目录)

[david@192 ~]$ df -h [文件或目录]
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              16G  2.4G   13G  16% /
tmpfs                 935M   72K  935M   1% /dev/shm
/dev/sda1             291M   37M  240M  14% /boot

-h human read

通过df -h 我们可以查看目前文件系统挂载的设备,不加文件/目录默认列出所有的文件系统。

其中Size是指磁盘总容量,Use指已使用的,Avail指可用的剩余容量,Use%使用率 = Use/(Use+Avail)

1.3 磁盘分区

1.31 查看所有分区

[root@192 weijie]# fdisk -l #查看所有分区

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000a4289

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          39      307200   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              39         549     4096000   82  Linux swap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sda3             549        2611    16567296   83  Linux

上面信息显示,sda磁盘有21.5G大小(21474836480字节)255个磁头管理读写,每个磁头管理63个扇区,每个扇区512字节,共有5005个柱面。

Device:设备文件名,依据不同的磁盘接口/分区位置而变。

Boot:表示是否为开机引导模块 * 表示是的

Start,End:表示这个分区在哪两个柱面号码之间,可确定此分区的大小。

Blocks:就是以1K为单位的容量。

ID,System:代表分区的文件系统。

1.32 新建/删除一个分区

fdisk  /dev/sda3

操作命令:

d 删除一个分区

n 新增一个分区 新增分区的条件是由剩余未分配的空间或是有扩展分区,可分逻辑分区。

m 打印命令提示

p 在屏幕上显示分区表

q 不保存分区修改,退出程序

w 保存修改并退出

+512M 设置容量时可用+容量的方法

1.4 磁盘格式化

磁盘格式化主要使用mkfs和mke2fs两个命令

mkfs [-t 文件系统格式] 设备文件名

mke2fs [-b block大小] [-i block/node一个node分配多少block] [-L卷标] [-c检查磁盘错误] [-j 系统格式为ext3(有journeal功能),不加则为ext2]

1.5 磁盘检测

检查文件系统是否出错

fsck [-t 文件系统ext2/ext3] [-A扫描设备] [-C检查过程中 用直方图显示] [-a自动修复有问题的扇区] [-y 与a类似,用于某些文件系统] 设备名称

检查硬盘或软盘扇区是否有坏道

badblock [-s屏幕上显示进度] [-v可以在屏幕上看到进度] [-w使用写入的方式来测试] 设备名称

1.6 磁盘挂载和卸载

说到挂载首先介绍/etc/fstab配置文件,我们先用cat命令来查看一下:

[root@192 weijie]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Sun Jan 25 07:14:00 2015
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=411dd466-551a-4ef2-a9b4-682b646aa308 /                       ext4    defaults        1 1
UUID=967157df-1cd7-42a6-9b0a-56e94fce0d1a /boot                   ext4    defaults        1 2
UUID=331eec8a-c9a7-4b86-a63d-3f5e9cf64a71 swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0、

配置文件参数说明:

1=>磁盘设备文件名或该设备的卷标Label

2=>挂载目录

3=>磁盘分区的文件系统 ext3,reiserfs,nfs,vfat等

4=>文件系统参数用逗号隔开

async/sync 同步或异步

auto/noauto 是否被mount -a 主动测试挂载

rw/ro 是否只读或可读写

exec/noexec 是否用于执行,或是纯数据

user/nouser 是否允许用户使用mount来挂载(非root)

suid/nosuid 是否有suid权限,不是放执行文件则不需要这个权限

usrquta 启动文件系统支持磁盘配额

grpquota 启动文件系统对群组磁盘配额模式支持

mode 设置挂载点权限最大为666

uid=000 设置允许uid=000用户操作

gid=000 同上

defaults 默认设置

5=>是否被dump备份命令作用 0:不备份 1:每天dump 2:不定期dump

6=>是否以fsck检查扇区 0:不需要检查 1:最先检查 2:其次检查

 

mount命令

mount [-a]根据配置文件将没有挂载的磁盘都挂载上来

mount [-l] 显示所有挂载列表

mount [-t文件系统] [-L label 名] [-o 额外选项] [-n 写入/etc/mtab] 设备文件名 挂载目录

-o

ro,rw 挂载只读或可读写

auto,noauto 是否被mount -a自动挂载

remount 重新挂载

 

EX:我们把 mp3插入usb接口,并挂载到/mnt/mp3player

[root@192 mnt]# fdisk -l
Disk /dev/sdb: 3711 MB, 3711959040 bytes在mnt下新增挂载目录mp3player

[root@192 mnt]# mkdir mp3player

[root@192 mnt]# mount -t vfat -o iocharset=cp950 /dev/sdb /mnt/mp3player/

vfat支持设置iocharset=cp950 中文语言显示

mount命令都是临时挂载,重启后失效,因此永久挂载需要修改配置文件。

同样卸载一个挂载umount [-f 强制] [-n不更新/etc/mtab] 挂载设备或挂载点

[root@192 /]# umount -fn /media/WALKMAN/

2、文件系统

2.1 文件系统概览

Linux的文件系统是Ext2-4,即inode-block。

技术分享

每个文件和目录都有自己的inode,每个inode都有对应的block号码,通过文件的inode找到相应的block。一个文件可能由多个block组成。

技术分享

同时,每个分区又可以分为一个block 组,每个组都包含superblock,文件系统描述(File system description),块对应表(block bitmap),inode对应表(inode bitmap),inode Table和data block。因此每个挂载的文件系统都可以看成由block组成的。

2.2 文件系统详述

Superblock

superblock记录整个文件系统相关信息。inode/block总量,未使用和已使用的block和inode总量。block与inode大小(block大小为1k,2k或4k, inode为128bytes)

文件系统挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件先关信息。validbit值,若此文件系统已被挂载,则validbit为0,若没有被挂载,则为1。

File system Description

这个区段描述每个block group的开始和结束block号码,以及说明每个区段(superblock,bitmap,inode,data block)分别介于哪一个block号码之间。这部分也能够用dumpe2fs来查看。

[david@192 ~]$ sudo dumpe2fs /dev/sda1
[sudo] password for david:
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name:   <none>
Last mounted on:          /boot
Filesystem UUID:          967157df-1cd7-42a6-9b0a-56e94fce0d1a
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              76912 #inode 总数
Block count:              307200 #block 总数
Reserved block count:     15360 #保留block数量
Free blocks:              260295 #空闲block
Free inodes:              76873 #空闲inode
First block:              1 #第一个block序号
Block size:               1024 #block大小
Fragment size:            1024
Reserved GDT blocks:      256
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         2024
Inode blocks per group:   253
Flex block group size:    16
Filesystem created:       Sun Jan 25 07:12:55 2015
Last mount time:          Mon Feb 23 21:00:34 2015
Last write time:          Mon Feb 23 21:00:34 2015
Mount count:              9
Maximum mount count:      -1
Last checked:             Sun Jan 25 07:12:55 2015
Check interval:           0 (<none>)
Lifetime writes:          41 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Journal inode:            8 #指向journal块的inode号
Default directory hash:   half_md4
Directory Hash Seed:      284e552c-ef40-4b71-95e9-9b2ace7b1d52
Journal backup:           inode blocks
Journal features:         (none)
Journal size:             8M   #日志文件大小
Journal length:           8192 #日志长度
Journal sequence:         0x00000036
Journal start:            0


Group 0: (Blocks 1-8192) [ITABLE_ZEROED]
  Checksum 0x84ca, unused inodes 2006
  Primary superblock at 1, Group descriptors at 2-3
  Reserved GDT blocks at 4-259
  Block bitmap at 260 (+259), Inode bitmap at 276 (+275)
  Inode table at 292-544 (+291)
  3836 free blocks, 2006 free inodes, 2 directories, 2006 unused inodes
  Free blocks: 4357-8192
  Free inodes: 19-2024
Group 1: (Blocks 8193-16384) [INODE_UNINIT, ITABLE_ZEROED]
  Checksum 0xe5d9, unused inodes 2024
  Backup superblock at 8193, Group descriptors at 8194-8195
  Reserved GDT blocks at 8196-8451
  Block bitmap at 261 (+4294959364), Inode bitmap at 277 (+4294959380)
  Inode table at 545-797 (+4294959648)
  1346 free blocks, 2024 free inodes, 0 directories, 2024 unused inodes
  Free blocks: 11089-12288, 16239-16384
  Free inodes: 2025-4048

block bitmap

block bitmap中记录那些block是空的,哪些block是不可用的,同样释放空间后也会修改block bitmap。

inode bitmap

记录未使用/已使用的inode号码。

inode table

记录文件属性和文件实际数据放置的第几号block内。

主要记录内容有:文件的访问权限(read/write/execute),文件的所有者和组(owner/group),文件的大小,创建时间和状态改变时间(change time),最近访问时间(access time),最近修改时间(modify time),定义文件特性的标志,如SetUID;该文件真正内容指向

(pointer)——block 序号

 

技术分享

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

如图所示,记录block号码的结构又可分为12个直接指向,1个间接号,1个双间接号,1个三间接号。

假设1个block大小为1k,因此一个inode能够指向的block总额为12+256+256*256+256*256*256=16G。

2.3 查看inode

ls -i [目录/文件] 查看inode

783363 dr-xr-xr-x.   2 root root  4096 Jan 31 04:26 bin
     2 dr-xr-xr-x.   5 root root  1024 Jan 25 07:45 boot
     4 drwxr-xr-x.  18 root root  3900 Feb 23 21:01 dev
130562 drwxr-xr-x. 101 root root 12288 Feb 23 21:01 etc
783364 drwxr-xr-x.   4 root root  4096 Feb  1 05:03 home
522247 dr-xr-xr-x.  10 root root  4096 Jan 25 07:28 lib
522244 dr-xr-xr-x.   9 root root 12288 Jan 31 04:26 lib64
    11 drwx------.   2 root root 16384 Jan 25 07:13 lost+found
783365 drwxr-xr-x.   4 root root  4096 Feb 22 21:50 media
783366 drwxr-xr-x.   3 root root  4096 Jan 25 07:47 mnt
522250 drwxr-xr-x.   3 root root  4096 Jan 24 23:49 opt
     1 dr-xr-xr-x. 152 root root     0 Feb 23 20:59 proc
652802 dr-xr-x---.   3 root root  4096 Feb  7 05:38 root
783367 dr-xr-xr-x.   2 root root 12288 Jan 31 04:26 sbin
     1 drwxr-xr-x.   7 root root     0 Feb 23 20:59 selinux
522251 drwxr-xr-x.   2 root root  4096 Jun 28  2011 srv
     1 drwxr-xr-x.  13 root root     0 Feb 23 20:59 sys
522242 drwxrwxrwt.  14 root root  4096 Feb 23 21:50 tmp
652805 drwxr-xr-x.  13 root root  4096 Jan 25 07:15 usr
261121 drwxr-xr-x.  21 root root  4096 Jan 25 07:35 var

我们可以看到sys selinux proc 都指向1号的inode说明这三个文件内容完全一模一样。

2.4 查看文件系统容量

1.2中已经介绍过用df来查看文件系统的容量了,还有一个命令du可以查看文件系统的容量,主要区别是这个命令会到系统中查找所有的文件数据。默认以kb显示

-m以兆单位显示

[david@192 ~]$ du -S
4       ./.mozilla/extensions
4       ./.mozilla/plugins
4       ./.mozilla
4       ./.gnome2
24      .

 

2.5 连接文件

2.51 硬连接 hard link

在root目录下新增一个/etc/crontab的硬链接

[root@192 ~]# ln /etc/crontab ./crontab

[root@192 ~]# ll -i /etc/crontab /root/crontab
132712 -rw-r--r--. 2 root root 457 Jun  3  2011 /etc/crontab
132712 -rw-r--r--. 2 root root 457 Jun  3  2011 /root/crontab

我们可以看到硬链接的inode是一样的,硬链接的两个文件删除任何一个,则他们的inode和block仍然存在,编辑任何一个文件,最终结果都会被写入相同的inode和block中。

因此我们称硬链接是安全的!但是hard link有两个缺点1、不能跨文件系统2、不能连接到目录。

2.52 软连接 symbolic link

软链接我们又可以成为符号链接,即像windows中的快捷方式。很容易理解,当源文件被删除后,点击快捷方式时,就会显示无法打开文件了。

我们在root目录下新增一个/etc/crontab的快捷方式

[root@192 ~]# ln -s /etc/crontab /root/crontab2

软连接会占用自己的inode和block

[root@192 ~]# ll -i crontab
132712 -rw-r--r--. 2 root root 457 Jun  3  2011 crontab

-s 创建一个symbolic link

-f 强制创建,如果目录下已经有这个文件则直接删除后新建

3、参考资料

《鸟哥的私房菜 Linux基础篇》

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。