磁盘与文件系统
1、磁盘系统
1.1 磁盘结构
如图所示,磁盘由扇区和柱面组成,分区的最小单位是柱面(柱是有厚度的,本图是截面图),磁盘读取的最小单位是扇区。第一扇区的MBR(446bytes)分区表可以最大包含四个分区(64bytes)的信息,即从开始柱面到结束柱面4组数据,每组16个字节,每个值8个字节,即柱号最大为2^16-1。扩展分区由主分区组成,扩展分区分出的分区称为逻辑分区。主分区与扩展分区最多可以4个;扩展分区最多只能一个;能够被格式化后作为数据访问的分区为主分区和逻辑分区,扩展分区无法格式化。SATA硬盘逻辑分区从5-15,IDE硬盘逻辑分区从5-63。
1.2 查看挂载的设备
Linux分区表示可可挂载的设备,每个分区上可以挂载相应的文件系统(目录)
[[email protected] ~]$ 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 查看所有分区
[[email protected] 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命令来查看一下:
[[email protected] 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
[[email protected] mnt]# fdisk -l
Disk /dev/sdb: 3711 MB, 3711959040 bytes在mnt下新增挂载目录mp3player
[[email protected] mnt]# mkdir mp3player
[[email protected] mnt]# mount -t vfat -o iocharset=cp950 /dev/sdb /mnt/mp3player/
vfat支持设置iocharset=cp950 中文语言显示
mount命令都是临时挂载,重启后失效,因此永久挂载需要修改配置文件。
同样卸载一个挂载umount [-f 强制] [-n不更新/etc/mtab] 挂载设备或挂载点
[[email protected] /]# 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来查看。
[[email protected] ~]$ 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以兆单位显示
[[email protected] ~]$ du -S
4 ./.mozilla/extensions
4 ./.mozilla/plugins
4 ./.mozilla
4 ./.gnome2
24 .
2.5 连接文件
2.51 硬连接 hard link
在root目录下新增一个/etc/crontab的硬链接
[[email protected] ~]# ln /etc/crontab ./crontab
[[email protected] ~]# 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的快捷方式
[[email protected] ~]# ln -s /etc/crontab /root/crontab2
软连接会占用自己的inode和block
[[email protected] ~]# ll -i crontab
132712 -rw-r--r--. 2 root root 457 Jun 3 2011 crontab
-s 创建一个symbolic link
-f 强制创建,如果目录下已经有这个文件则直接删除后新建
3、参考资料
《鸟哥的私房菜 Linux基础篇》