Linux磁盘管理及文件系统管理
涉及到的命令:
mknod、fdisk、partx、kpartx、partprobe、ln、mkfs、mkfs.{ext2、ext3、ext4、xfs}、fsck.{ext2、ext3、ext4、xfs}、mke2fs、dumpe2fs、tune2fs、e2label、blkid、mkswap、swapon、swapoff、mount、umount、lsof、fuser、df、du、free
=======================理论部分=======================
计算机的三大部件:
CPU、Memory、I/OI/O对服务器来讲主要是指磁盘和网卡
设备类型:
块设备(block),随机访问,数据交换单位为“块”
字符设备(character),线性访问,数据交换单位为“字符”
/dev/设备 设备文件:关联至设备的驱动文件;设备有自己的设备号,分别是主设备号和次设备号
major主设备号,用来区分设备类别(用于表明不同的驱动,不同类型的设备驱动是不同的)
minor此设备号,同一种设备类别下,不同的设备
mknod命令创建设备文件
格式:mknod [OPTION]... NAME TYPE [MAJOR MINOR]
如:mknod testdev c 100 5
testdev 新建的设备名,c 表示字符设备,100为主版本号,5为次版本号
磁盘设备文件的接口类型:
IDE、SCSI接口、SATA、USB、SAS
IDE接口设备文件名:/dev/hd[a-z]#
SCSI接口、SATA、USB、SAS这些个设备文件名:/dev/sd[a-z]#
a-z 标记设备;#为磁盘分区
track 磁道
sector 每个磁道划分成扇区,512字节/扇区
sylinder 柱面,分区是按照柱面进行划分
MBR(master boot record) 主引导记录表
存在于0磁道0扇区,共512个字节,这512个字节分成三个部分:
446字节:bootloader,程序加载器
64个字节:为分区表,每16个字节表示一个分区,这就是为什么一块硬盘只能有四个主分区
无论怎样组合主分区和扩展分区,第一个逻辑分区一定是/dev/sda5,不同的磁盘或者磁盘类型导致不一定是/dev/sda,但重点是5
2个字节:55AA(16进制),当前MBR信息是否有效的标记
==============================================
fdisk命令:
查看已经识别的磁盘设备
分区标志方式
主分区或扩展分区:1-4
逻辑分区:5+
fdisk /dev/sda (举例),进入到设备分区状态,通过交互式的方式进行
常用命令:
p 显示现有分区表
n 创建新分区
d 删除现有分区
t 修改分区ID
l 查看支持那些分区ID
w 保存退出
q 不保存退出
m 查看帮助信息
fdisk -l /dev/sd[a-z]
查看磁盘分区列表,如果后面不加设备名则列出全部磁盘分区情况
使用fdisk进行分区后,需要查看内核是否已经识别新建分区
cat /proc/partitions
一般来说,一块新添加的硬盘未进行任何分区,在fdisk后,内核一般会自动识别所有分区,但如果是一块在用的硬盘再次划分分区,内核不能自动识别,需要手动添加
通知内核强制读取分区表:
centos 5 : partprobe /dev/DEVICE
centos 6 : partx ,kpartx
partx -a /dev/DEVDICE
kpartx -af /dev/DEVICE
partx -l /dev/sda 列出分区
注意: 成功读取分区,可能要执行多次才能识别
============================================
创建分区以后是不能直接存数据的,需要进行格式化指定的文件系统
元数据:每个索引项被称为一个inode(index node)
"/" 根分区是存在内核中的,开机时就要管理根文件系统(rootfs)
链接文件,分为硬连接和软连接
硬连接:
#cp -l SRC DST
#ln SRC DST
两种方法都行
目录不支持硬连接
硬连接不能跨文件系统,(源数据和目标数据在同一个分区中)
源数据和目标数据指向同一个inode,创建硬连接会增加inode的引用计数
符号链接(即软连接)
#ln -s SRC DST
符号链接文件和原文件是两个各自独立的文件
目录可以创建软连接
可以跨文件系统
删除链接文件不影响源文件,但删除源文件,符号链接指向的文件不存在,就成了无效的链接
文件系统管理工具
创建文件系统
mkfs.ext2,mkfs.ext3,mkfs.ext4,mkfs.xfs(centos6中没有,需要安装xfsprogs)
检测文件系统
fsck.ext2,fsck.ext3,fsck.ext4,fsck.xfs
查看其属性
dumpe2fs,tune2fs
日志型文件系统,加速文件系统检测和修复过程,常见的有ext3\ext4\xfs(centos7中默认就是xfs类型)
创建ext系列文件系统,mke2fs
mke2fs [option]... /dev/DEVICE
option:
-t ext2/ext3/ext4 指明要创建的文件系统类型
mk2efs -t ext4=mkfs.ext4(以此类推)
-b block size {1024|2048|4096} 最大4096,因为内存page frame最大就是4K,不能超过内存的page frame
-L label,卷标,格式化时修改卷标
-i # 指明inode与字节的比率,即每多少个字节创建一个inode(调整的意义不大,一般都采用默认)
-N # 直接指明给此文件系统创建多少个inode
-m # 指定预留空间的百分比,默认为5(5%的空间留作管理员使用)
-O [^]FEATURE (特性),指定文件系统的特性,加上^表示取消指定特性
如:has_journal(如果使用-j选项;-j是创建ext2文件系统)不常用
e2label:查看或者修改分区卷标
查看:e2label /dev/DEVICE
设定卷标: e2label /dev/DEVICE LABEL(不需要格式化,而直接修改卷标)
#blkid /DEVICE(查看分区卷标信息)
tune2fs:查看或修改ext系列文件系统的某些属性
查看超级块中的数据信息:
tune2fs -l /dev/DEVICE
修改指定文件系统的属性:
-j ext2-->ext3 无损数据情况下,ext2升级为ext3
-L LABEL 修改卷标
-m # 调整预留百分比
tune2fs -m 3 /dev/sdb1 由默认的预留的5%修改3%(无损数据)
-O [^]FEATURE 开启或关闭某种特性
tune2fs -O ^has_journal /dev/sdb1 关闭日志功能(会变成ext2系统类型)
-o [^]mount_options 开启或关闭某种默认挂载选项
tune2fs -o acl /dev/sdb1 支持facl功能
tune2fs -o ^acl /dev/adb1 关闭facl功能
dumpe2fs: (ext系列文件系统)
-h 仅显示超级块信息 结果等于tune2fs -l /dev/DEVDICE
dumpe2fs /dev/DEVICE 产看完整的信息
文件系统检测:
因进程意外终止,或系统崩溃等原因导致写入操作非正常终止时,可能会导致文件损坏,此时应该修复文件系统
注意:应该离线进行
卸载文件系统,离线进行
fsck
fsck.ext2,fsck.ext3,fsck.ext4
fsck -t TYPE = fsck.TYPE
-a (auto),自动修复所有错误(有副作用)
-r 交互式提醒修复错误(默认行为)
ext系列,文件系统专用工具:
e2fsck
-y 对所有问题自动回答yes
-f 即便文件系统处于clean状态,也要强制进行检测
windows无法识别Linux上的专用文件系统,因此,有存储设备需要两种系统之间交叉使用时,应该使用windows支持的文件系统:
#mkfs -t vfat /dev/DEVICE(不常用)
另外一种特殊的文件系统:
swap交互分区
Linux上的交换分区必须使用独立的磁盘分区
fdisk /dev/DEVICE t命令调整ID为82 注意调整swap类型
创建交换分区文件系统:
mkswap [-L LABEL] /dev/DEVICE
swapon /dev/DEVICE 启用
swapoff /dev/DEVICE 不起用
文件系统挂载
在Linux系统上,所有文件系统必须挂载才能使用
根文件系统:根关联的分区,其余所有的其他文件系统要想被访问,都只能通过关联至跟文件系统上的某个目录
注意:如果一个目录中有文件,然后把一个分区挂载至此目录,原目录中的文件会被隐藏
命令:mount、umount 挂载、卸载
挂载点:mount_point,用于作为另一个文件系统的访问入口
mount DEVICE MOUNT_POINT
挂载点:
1、事先存在
2、尽量使用空白目录
卸载:
umount DEVICE 或者 umount MOUNT_POINT
mount
常用挂载选项:
mount:显示当前系统已经挂在的所有文件系统的属性
mount [option]... [-t fstype] [ -o option] DEVICE MOUNT_POINT
命令选项:
-r 只读挂载
-w 读写挂载
-t fsTYPE,被挂在的设备上的文件系统,可省略,此时mount会自动使用blkid命令来判断类型
-L LABEL 以卷标的方式挂载设备,此时DEVICE需要省略 (上文说道blkid可以查看卷标)
-U UUID 以UUID的方式挂载设备,此时DEVICE需要省略
-a 自动挂载所有支持自动挂载的设备 (/etc/fstab文件中定义的支持自动挂载的设备)
-n 默认情况下,设备挂载与否的改变结果会保存于/etc/mtab中一份,如果不想更新此文件,可以使用-n选项
/etc/mtab 自动追踪系统已挂在的文件系统
挂载选项
-o OPTION
async 异步写入(性能好,但数据可靠性差,一般情况下都用异步模式)
sync 同步写入(性能差,但数据可靠性好)
dirtime/nodirtime 目录在访问时是否更新访问时间戳
atime/noatime 文件或目录在被访问时是否更新其访问时间戳
auto/noauto 支持/不支持自动挂载(跟前面的选项-a有关)
dev/nodev 此设备上是否允许创建设备文件
exec/noexec 是否允许执行此文件系统上的程序文件
suid/nosuid 是否支持此设备上的文件使用suid权限
acl/noacl 支持/不支持acl
remount 重新挂载
ro 只读
rw 读写
user/nouser 是否允许普通用户挂载此文件系统
defaults (不写则为defaults)
Use default options: rw, suid, dev, exec, auto, nouser, async, and relatime.
如:mount -o remount,acl /dev/sdb7 remount,acl用逗号更分割但不用空格隔开
注意:可以使用tune2fs -o acl DEVICE 来设置DEVICE的默认挂载选项(因为mount挂载时没有指定acl,则不支持acl)
mount命令的另一个使用技巧:
将某目录绑定至指定另外一个目录下
mount --bind 源目录 目标目录
如: mount --bind /usr/local /mnt
查看已经挂载设备的方法:
mount
cat /etc/mtab
cat /proc/mounts
注意:卸载设备时如果有其他进程正在访问,是不能被卸载的
报错提示:
umount: /mnt: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
可以使用lsof 或者 fuser
[root@www mnt]# lsof /dev/sdb7
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 11246 root cwd DIR 8,23 6 128 /mnt
lsof 19893 root cwd DIR 8,23 6 128 /mnt
lsof 19894 root cwd DIR 8,23 6 128 /mnt
[root@www mnt]# fuser -v /mnt
USER PID ACCESS COMMAND
/mnt: root 11246 ..c.. bash
如果想强行卸载,杀死访问挂载点进程
fuser -km MOUNT_POINT/DEVICE
然后在进行卸载就OK了
df命令
报告文件系统使用状况信息
-l 仅显示本地文件系统的相关信息
-h 单位划算
-i 显示inode信息,而非磁盘块(默认是磁盘块)
du命令
文件大小查看
-s summary,统计目录底下所有文件的总大小(目录大小跟目录底下文件的大小是没有关系的)
-h 单位划算
如:
[root@www tmp]# du -sh /*
4.0K/backup
8.4M/bin
34M/boot
204K/dev
......
swap相关
free命令,查看内存使用状况
buffer 缓冲
cache 缓存
swapon DEVICE 启用指定的交换分区
-a 启用/etc/fstab中所有定义的交换分区
swapoff DEVICE 关闭指定的交换分区
/etc/fstab
修改配置文件,开机自动挂载
共有6个字段,并用空格分隔开
第一字段:挂载设备 (设备文件名、UUID、LABEL、伪文件系统,如sysfs,proc,tmpfs等)
第二字段:挂载点(swap的挂载点就是 swap)
第三字段:文件系统类型
第四字段类型:挂载选项(defaults,表示使用默认挂载选项,多个挂载选项使用逗号分隔)
第五字段类型:转储频率,即多久备份一次,0表示从不备份,1表示每天没法,2表示隔一天备份一次(一般都为0)
第六字段类型:自检次序,0表示不自检,1表示首先自检(一般只有”/“文件系统可首先自检),2表示次级自检,然后3、4、5.......(一般为0)
#mount -a 会挂载/etc/fstab中支持自动挂载的设备
======================练习======================
练习
1、创建一个10G分区,并格式为ext4的文件系统,要求block为2048,卷标MYDATA,默认挂载属性包含acl,挂载至/data/mydata,挂载时禁止程序自动运行,且不更新文件的访问时间戳
使用/dev/sdb做实验
#fdisk /dev/sdb#创建分区
n新建
p选择类型,主分区
1分区编号
1起始柱面
+10G大小指定为10G
w保存退出
#partx -a /dev/sdb#让内核识别新分区,执行两次
# mkfs -t ext4 -b 2048 -L MYDATA /dev/sdb1
[root@localhost ~]# tune2fs -o acl /dev/sdb1
[root@localhost ~]# tune2fs -l /dev/sdb1
tune2fs 1.41.12 (17-May-2010)
Filesystem volume name: MYDATA
Last mounted on: <not available>
Filesystem UUID: 6e85fb3a-16fe-4123-9905-210a9264bc32
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 657408
Block count: 5245206
Reserved block count: 262260
Free blocks: 5123382
Free inodes: 657397
First block: 0
Block size: 2048
Fragment size: 2048
...
[root@localhost ~]# blkid /dev/sdb1
/dev/sdb1: LABEL="MYDATA" UUID="6e85fb3a-16fe-4123-9905-210a9264bc32" TYPE="ext4"
[root@localhost ~]# mount -t ext4 -o noexec,noatime /dev/sdb1 /data/mydata/
[root@localhost ~]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
/dev/sda3 on /usr type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/sdb1 on /data/mydata type ext4 (rw,noexec,noatime)
2、创建一个大小为1G的交换分区,并创建好文件系统,并启用
创建分区:
#fdisk /dev/sdb
n #新建
p #选择类型,主分区
2 #分区编号
#直接回车表示起始柱面从默认开始
+2G #指定大小为2G
t #切换分区
2#选择分区2
82 #更换类型为82(Linux swap)
w #保存退出
添加到内核
#partx -a /dev/sdb #添加到内核,一次如果不行,可以多执行一次
制作成swap类型
[root@localhost ~]# mkswap /dev/sdb2
mkswap: /dev/sdb2: warning: don't erase bootbits sectors
(dos partition table detected). Use -f to force.
Setting up swapspace version 1, size = 2104508 KiB
no label, UUID=721c7796-82c8-400a-8532-1db69114859b
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 988 146 841 0 14 52
-/+ buffers/cache: 79 908
Swap: 0 0 0
启用swap并验证
[root@localhost ~]# swapon /dev/sdb2
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 988 148 840 0 14 52
-/+ buffers/cache: 81 907
Swap: 2055 0 2055
3、练习:(脚本实现)
A、获取并列出当前系统上的所有磁盘设备
B、显示每个磁盘设备上每个分区相关空间的使用情况
#!/bin/bash
for i in $(grep '.*[^0-9]$' /proc/partitions |grep -v 'major'|tr -s ' ' |cut -d' ' -f5);do
echo "============$i============"
fdisk -l /dev/$i
df -h /dev/$i
echo
done
[root@localhost scripts]# bash 6.sh
============sdb============
Disk /dev/sdb: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 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: 0xcea36bcf
Device Boot Start End Blocks Id System
/dev/sdb1 1 1306 10490413+ 83 Linux
/dev/sdb2 1307 1568 2104515 82 Linux swap / Solaris
Filesystem Size Used Avail Use% Mounted on
- 480M 212K 480M 1% /dev
============sda============
Disk /dev/sda: 85.9 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 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: 0x0000e0a8
Device Boot Start End Blocks Id System
/dev/sda1 * 1 26 204800 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 26 2637 20971520 83 Linux
/dev/sda3 2637 5248 20971520 83 Linux
/dev/sda4 5248 10444 41737216 5 Extended
/dev/sda5 5248 6553 10488077 fd Linux raid autodetect
/dev/sda6 6554 7859 10490413+ fd Linux raid autodetect
/dev/sda7 7860 8198 2722986 fd Linux raid autodetect
/dev/sda8 8199 8537 2722986 fd Linux raid autodetect
Filesystem Size Used Avail Use% Mounted on
- 480M 212K 480M 1% /dev