Linux 磁盘、文件系统管理
2016-08-229
本章内容
磁盘结构
分区类型
管理分区
管理文件系统
挂载设备
管理虚拟内存
第一篇:Linux磁盘管理
概述:
计算机的五大组成部件:输入设备、输出设备、存储器、运算器、控制器,其中,输入、输出设备称之为I/O设备,运算器和控制器称之为CPU ,存储器如内存、硬盘等。计算机只有CPU和内存其实就可以独立完成计算任务了,只是其输入输出都在内存中实现,但是,内存属于随机存储单元,断点就会导致数据丢失,因此,我们就通过其他辅助设备来弥补内存的不足,这些辅助设备称之为外存,如:磁盘,光驱等。
一、硬盘
1.硬盘接口类型:
2.硬盘:固态硬盘和机械硬盘
3.硬盘存储术语(CHS):
head:磁头 256个
track:磁道 1024个磁道
平均寻道时间:5400rpm,7200rpm,10000rpm,15000rpm
cylinder: 柱面 (分区划分基于柱面)
secotr: 扇区,512bytes 63个
cylinder=512*63track*256head=8M
二、设备文件
1.一切皆文件:
open(), read(), write(), close()
2.设备类型:
块设备(block):随机访问,数据交换单位是“块”;
字符设备(character):线性访问,数据交换单位是“字符”;
3.设备文件:FHS /dev
关联至一个设备驱动程序,进而能够跟与之对应硬件设备进行通信
4.设备号:
major:主设备号,区分设备类型;用于标明设备所需要的驱动程序;
minor:次设备号,区分同种类型下的不同设备;是特定设备的访问入口;
make block or character speclal files
语法:mknod [OPTION]… NAME TYPE [MAJOR MINOR]
-m MODE :创建后的设备文件的访问权限;
三、设备文件名:ICANN
1.磁盘:
IDE:/dev/hd[a-z] 例如:/dev/hda,/dev/hdb
SCSI,SATA,USB,SAS:
不同设备:/dev/sd[a-z]
2.分区:
同一设备上的不同分区:1,2…
/dev/sda#: 如:/dev/sda1…
CentOS 6和7统统将硬盘设备文件表示为/dev/sd[a-z]
3.引用设备的方式:
设备文件名、卷标(label)、
UUID(全局唯一标识符,uuidgen 命令可以生成uuid)
注意:引用设备的时候,最好用UUID,因为设备文件名可能会改变。
四、磁盘分区:MBR、GPT
MBR: 0 sector
1.Master Boot Recor,1982年,使用32位表示扇区数,分区不超过2T
2.如何分区:按柱面
3.0磁道0扇区:512bytes,分为三部分:
446bytes: bootloader,程序,引用启动操作系统程序;
64bytes:分区表,每16bytes: 标识一个分区,一共只能有4个分区;
2bytes: MBR区域的有效标识,一般55AA为有效;
4. 4个主分区;3主分区+1扩展(N个逻辑分区);
主分区和扩展分区的标识:1-4
逻辑分区只能从5开始(5+)
5.新增添磁盘,还不能直接显示出来,要想出现要对磁盘进行扫描(实际生产环境中不需要,都是热插拔技术):
命令:echo "—" > /sys/class/scsi_host/host2/scan
GPT分区:
GUID(Globals Unique Identifiers)partition table
支持128个分区,使用64位,支持8Z(512Byte/block )64Z (4096Byte/block)
使用128位UUID 表示磁盘和分区GPT分区表自动备份在头和尾两份,并有CRC校验位
UEFI (统一扩展固件接口)硬件支持GPT,使操作系统启动
五、管理磁盘:
1.列出块设备:lsblk
2.创建分区使用:
fdisk创建MBR分区,也支持GPT,对于一块硬盘,最多只能管理15分区
gdisk创建GPT分区
GNU parted高级分区操作(创建、复制、调整大小等等)
3.partprobe-重新设置内存中的内核分区表版本
磁盘分区管理工具:fidsk、parted
parted命令:
用法:parted [选项]… [设备[命令[参数]…]…]
parted /dev/sdb mklabel gpt|msdos
parted /dev/sdb print 查看分区
parted /dev/sdb mkpart primary 1 200 (默认M)创建分区
parted /dev/sdb rm1 删除分区
parted -l
注意:parted的操作都是实时生效的,一般不建议使用
fdisk命令
1.语法:fdisk -l [-u] [device…];
列出指定磁盘设备上的分区情况
2.管理分区
fdisk device
fdisk提供了一个交互式接口来管理分区,他有许多命令,分别用于不同的管理功能;所有的操作均在内存中完成,没有直接同步到磁盘;直接使用w命令保存至磁盘上;
3.常用命令:
n:创建新分区;
d:删除已有分区;(如果删除扩展分区sda4 逻辑分区都会消失)
t:修改分区类型;
l:查看所有分区ID
w:保存并退出;
q:不保存并退出;
m:查看帮助信息
p:显示现有分区表
注意:在已经分区并且已经挂载其中某个分区的磁盘设备上创建的新分区,内核可能在创建完成后无法直接识别;
同步分区表:partx,partprobe
1)查看内核是否已经识别新的分区:
# cat /proc/partations
2)通知内核重新读取硬盘分区表
新增分区用:
partx -a /dev/device
kpartx -a /dev/device -f: force
删除分区用:
partx -d –nr N /dev/DEVICE
centos6:–nr N-M(表示范围)
partprobe命令:centos5,7使用。一条命令搞定,增减删除都可以!
用法:partprobe [/dev/DEVICE]
六、创建文件系统(格式化)
相关概念:
文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统。
从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩,加密等。
1.格式化:
低级格式化(分区之前进行,划分磁道)
高级格式化(分区之后进行,创建文件系统)
2.磁盘分区划分为元数据区和数据区
元数据区:
文件元数据(inode):
包含文件的大小、权限、属主属组、时间戳、数据块指针
符号链接文件(软链接):
存储数据指针的空间当中存储的是真实文件的访问路径;
设备文件:
存储数据指针的空间当中存储的是设备号(major,minor)
3.文件系统组织结构中的常见术语:
block groups(块组),块组内分为元数据区(inode table中又存放indoe)和数据区(block)
bitmap index :位图索引 (了解哪些inode已经使用,哪些还没使用)
block bitmap:了解哪些磁盘块已经使用,哪些还没有使用;
superblock:记录当前整个分区上有哪些块组,以及块组的划分
Linux 的文件系统
1.VFS:虚拟文件系统接口,当两个层次之间不衔接时,所加的中间层。因此linux可以引入众多的文件系统类型。
2.文件系统:
linux:
ext2(Extended file system), ext3, ext4, xfs(SGI), btrfs(Oracle),reiserfs, jfs(AIX), swap(用于存放虚拟内存)
光盘:iso9660
Windows:fat32, ntfs
Unix: FFS(fast), UFS(unix), JFS2
网络文件系统:NFS, CIFS
集群文件系统:GFS2, OCFS2(oracle)
分布式文件系统:ceph, moosefs, mogilefs, glusterfs, Lustre
RAW:未经处理或者未经格式化产生的文件系统
3.根据其是否支持"journal"功能:
日志型文件系统: ext3, ext4, xfs, …
非日志型文件系统: ext2, vfat
4.文件系统的组成部分:
内核中文件系统的驱动模块(lsmod命令可查看):ext4, xfs, vfat
用户空间的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat
5.查前支持的文件系统:cat /proc/filesystems
内核及文件系统的组成部分:
文件系统驱动:由内核提供
文件系统管理工具:由用户空间的应用程序提供
七、文件系统管理工具:
mkfs,mk2fs,e2label,tune2fs,dumpe2fs,
主要都是和ext系列的文件系统有关。
注意:扩展分区是不能格式化的,因为它存放的是逻辑分区,可对逻辑分区格式化
1.创建文件系统的工具
mkfs命令:(按两次Tab键)
(1) # mkfs.FS_TYPE /dev/device
ext4,xfs,btrfs,vfat
示例:
创建ext2文件类型
在ext2基础上创建ext3文件类型(区别:多了一个创建日志的功能)
(2) # mkfs -t FS_TYPE /dev/DEVICE 如:(mkfs -t ext2=mkfs.ext2)
-L 'LABEL': 设定卷标
mke2fs的选项,mkfs也支持
mke2fs:ext系列文件系统专用管理工具
语法:mke2fs [OPTIONS] /dev/sd… 默认为ext2文件系统
-t {ext2|ext3|ext4}:指明要创建的文件系统类型;
-b {1024|2048|4096}:指明块大小,默认为4K,最大不超过4K
-L 'LABEL' :指明卷标
-j: 创建有日志功能的文件系统ext3
mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
-i#: 指明indoe与字节的比率;即每多少个字节创建一个inode;此大小不应该小于block的大小
-N #:直接指明要给此文件系统创建的inode的数量;
-I 一个inode记录大小128—4096
-m #: 默认5%,为管理人员指定预留空间占总空间的百分比
-O FEATURE[,…]:启用指定特性
-O ^FEATURE:关闭指定特性
e2label命令:卷标的查看,预设定
查看:e2label device
tune2fs:查看或修改ext系列文件系统的某些属性;
adjust tunable filesystem parameters on ext2/ext3/ext4 filesystems;注意:块大小不可修改
语法:tune2fs [options] devicd
-l:查看指定文件系统超级块信息;super block
-L 'LABEL':修改卷标
-m #:调整预留给管理员的空间百分比
-j: 将ext2升级为ext3
-O[^]FEATHER: 文件系统属性启用或禁用,–O ^has_journal
-o: 开启或关闭文件系统的默认挂载选项,–o ^acl
-U UUID: 修改UUID号
dumpe2fs命令
显示ext系列文件系统的属性信息
语法:dumpe2fs [-h] device
-h:查看超级块信息(分组信息),分区用分组管理
用于实现文件系统检测的工具:fsck,e2fsck
因进程意外中止或系统崩溃等原因导致操作非正常终止时,可能会造成文件损坏;此时应该检测并修复文件系统,建议离线进行
常发生于死机或者非正常关机之后
挂载为文件系统标记为“dirty”
fsck命令
fsck – check and repair a Linux file system
fsck.FS_TYPE
fsck -t FS_TYPE 如:fsck -t ext4=fsck.ext4
-a: 自动修复错误
-r: 交互式修复错误
注意: FS_TYPE一定要与分区上已经文件类型相同;
e2fsck:ext系列文件专用的检测修复工具
语法:e2fsck [OPTIONS] device
-y:对所有问题自动回答为yes;
-f:即使文件系统处于clean状态,也要强制进行检测;
blkid:块设备属性信息查看
语法:blkid[OPTION]…[DEVICE]
-U UUID: 根据指定的UUID来查找对应的设备
-L LABEL:根据指定的LABEL来查找对应的设备
findfs:查找分区
findfs[options] LABEL=<label>
findfs[options] UUID=<uuid>
八、其他文件系统
1.swap文件系统:
Linux上的交换分区必须使用独立的文件系统;且文件系统的System ID必须为82;
创建swap设备:mkswap命令
语法:mkswap [OPTIONS] device
-L LIBEL:指明卷标
-f:强制
2.Windows无法识别Linux的文件系统;因此存储设备需要在两种系统之间交叉使用时,应该使用windows和linx同时支持的文件系统:fat32(vfat)
# mkfs.vafat device
第二篇:文件系统的使用:挂载
磁盘的分区和格式化完成后,磁盘要想能够使用,就需要挂载,在挂载某个分区前需要先建立一个挂载点。
一、相关概念
1.首先要"挂载":mount和unmount卸载命令
2.根文件系统之外的其他文件系统要想能够被访问,都必须通过“关联”至根文件系统上的某个目录来实现,此关联操作即为“挂载”,此目录即为挂载点;
3.挂载点:mount_point,作为另一个文件系统的访问入口
1)事先存在;
2)应该使用未被或不会被其他进程使用到的目录;
3)挂载点下原有文件将会被临时隐藏;
4.卸载:为解除此关联关系的过程
卸载时:可使用设备,也可以使用挂载点
二、mount命令
挂载方法:mount DEVICE MOUNT_POINT
mount:通过查看/etc/mtab文件显示当前已挂载的所有设备
语法:mount [-fnrsvw] [-t vfstype] [-o options] device dir
device:指明要挂载的设备;
(1) 设备文件:例如/dev/sda5
(2) 卷标:-L 'LABEL', 例如-L 'MYDATA'
(3) UUID, -U 'UUID':例如-U '0c50523c-43f1-45e7-85c0-a126711d406e'
(4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs
dir:挂载点
事先存在;建议使用空目录
进程正在使用中的设备无法被卸载
mount命令用法
语法:mount [-nrw] [-t vfstype] [-o options] device dir
命令选项:
-r: readonly,只读挂载
-w: read and write, 读写挂载
-n: 在默认情况下,设备挂载或卸载的操作同时会更新至/etc/mtab文件中,-n 用于禁此特性;
-t vsftype:指定要挂载的设备上的文件系统类型;多数情况下可省略,此时mount会通过blkid来判断要挂载的设备的文件系统的类型;
-a:自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能)
-L 'LABEL': 挂载时以卷标的方式指明挂载设备
mount -L LABEL dir
-U 'UUID': 挂载时以UUID指定要挂载的设备
mount -U UUID dir
-B, –bind: 将目录绑定至另一个目录上,作为其临时访问入口
-o options:(挂载文件系统的选项),多个选项使用逗号分隔
async:异步模式
sync:同步模式,内存更改时,同时写磁盘
atime/noatime:文件或目录在被访问时是否更新其访问时间戳;
diratime/nodiratime:目录在被访问是是否更新其访问时间戳
auto/noauto:是否支持自动挂载,是否支持-a选项
exec/noexec:是否允许运行此设备上的程序文件;
dev/nodev:此设备上是否允许创建设备文件;
suid/nosuid:是否允许程序文件上的suid和sgid特殊权限生效;
remount:重新挂载
ro:只读
rw:读写
user/nouser:是否允许普通用户挂载此设备,默认管理员才能挂载
acl:启用此文件系统上的acl功能
# mount -o acl device dir
# tune2fs -o acl device
defaults:相当于rw, suid, dev, exec, auto, nouser, async
查看当前系统已挂载的所有设备:
# mount
# cat /etc/mtab
# cat /proc/mounts
挂载光盘:
mount -r /dev/cdrom mount_point
光盘设备文件:/dev/cdrom,/dev/dvd
把光盘制作成iso文件方法:
挂载U盘:
事先识别U盘的设备文件
挂载本地回环设备:
# mount -o loop /PATH/TO/SOME_LOOP_FILE MOUNT_POINT
unmount命令:
正在被进程访问到的挂载点无法被卸载
查看挂载情况:
# findmnt MOUNT_POINT
查看被那个或者哪些进程所占用:
# lsof MOUNT_POINT
# fuser -v MOUNT_POINT
终止所有在正访问指定的文件系统的进程:
# fuser -km MOUNT_POINT
卸载:
# umount DEVICE
# umount MOUNT_POINT
# umount -l
/etc/fstab 配置文件
设定除根文件系统以外的其他文件系统能够开机时自动挂载
/etc/fstab每行定义一个要挂载的文件系统及相关属性;
6个字段:
1)要挂载的设备
设备文件;
LABEL(LABEL="")
UUID(UUID="")
伪文件系统
2)挂载点
swap类型的设备的挂载点为swap;
3)文件系统类型
4)挂载选项
defaults:使用默认挂载选项
如果要同时指明多个挂载选项,彼此间逗号分隔;
5)转储频率
0:从不备份
1:每天备份
2:每隔一天备份
6)自检次序
0:不自检;
1:首先自检,通常只能是根文件系统可用;
2:次级自检
…
mount -a:可自动挂载定义在此文件中的所支持自动挂载的设备;
示例:
在/etc/fstab配置文件中添加一行来挂载分区 使用命令 df或者mount可以查看挂载情况,要想生效执行 mount -a命令,自动挂载此文件中的所有支持自动挂载的设备
如果对挂载的参数修改,要重新生效使用 mount -o remount MOUNT_POINT
注意:/etc/fstab 设备名出错,自检非0,开机会导致无法启动
排错方法:mount -o remount,rw /
四、处理swap交换文件和分区:
swap,它类似于Windows的虚拟内存,分区时一般指定虚拟内存的大小为实际内存的2倍,如果你的实际内存超过了8G,那你划分16G给虚拟内存就足够日常交换了,如果真的遇到虚拟内存不够用的情况,就必须增加哦一个虚拟磁盘,因此我们不可能重新给磁盘分区,增加虚拟内存的基本思路:建立swapfile–>格式化swap格式–>启用虚拟磁盘。
交换分区是系统RAM的补充
1.基本设置包括:
1)创建交换分区(fdisk -t 82)或者文件
2)使用mkswap写入特殊签名
4)使用swapon -a 激活交换空间
2.挂载交换分区
启用:swapon
swapon[OPTION]… [DEVICE]
-a:激活所有的交换分区;
-p PRIORITY:指定优先级
/etc/fstab:pri=value
禁用:swapoff[OPTION]… [DEVICE]
总结:
swap的创建
1)fdisk -t 82 分区
dd if=/dev/zero of=/swapfile bs=1M count=1024 文件
2)mkswap /dev/sdc1
mkswap /swapfile
3)vim /etc/fstab
/dev/sdc1 swap swap defaults,pri=100 0 0
/swapfile swap swap pri=100 0 0
4)swapon -s 查看swap分区
swapon -a 读/etc/fstab 生效
示例:创建swap文件增加虚拟内存
心得:既然可以把一个文件当做一个swap分区用,同样我们也可以创建一个文件当做分区使用,如果需要的话直接就可以把文件拷贝走,很方便。
swap的优先级
用户可以给某个swap指定一个0到32767的优先级
如果用户没有指定,那么核心会自动给swap指定一个优先级,这个优先级从-1开始,每加入一个新的没有用户指定优先级的swap,会给这个优先级减一。
先添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户指定的优先级(是正数)永远高于核心缺省指定的优先级(是负数)。
优化性能:分布存放,高性能磁盘存放
free命令:内存空间及交换分区使用状态查看:
free [OPTION]
-m: 以MB为单位
-h:以人类适宜的方式查看
Mem:物理内存的使用情况;
Swap:交换分区的使用情况 ;
-/+ buffers/cache:表示物理内存在不考虑缓存和缓存占据空间时的使用情况
cache: 缓存,迎来缓存度
df命令:查看磁盘设备的使用情况
df [OPTION]… [FILE]…
-l:仅显示本地文件的相关信息;
-H 以1000为单位
-T 文件系统类型
-h: human-readable
-i:显示inode的使用状态而非block
-P: 以Posix兼容的格式输出
du命令:查看某目录总体空间占用状态:
du [OPTION]… DIR
-h: human-readable
-s: summary
losetup命令
可以把文件关联到一个设备,从而用设备名代替文件名
centos6 实现loop 设备和文件关联
dd if=/dev/zero of=/testdir/bigfile bs=1M count=500
losetup /dev/loop7 /testdir/bigfile
mkfs.ext4 /testdir/bigfile
mount /dev/loop7 /mnt/bigfile/
losetup -a
示例:
创建一个文件,对文件进行格式化挂载到另一个目录下
下面是CentOS7版本的
dd命令:convert and copy a file
用法:
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=#:block size, 复制单元大小
count=#:复制多少个bs
of=file 写到所命名的文件而不是到标准输出
if=file 从所命名文件读取而不是从标准输入
bs=size 指定块大小(既是是ibs也是obs)
ibs=size 一次读size个byte
obs=size 一次写size个byte
cbs=size 一次转化size个byte
skip=blocks 从开头忽略blocks个ibs大小的块
seek=blocks 从开头忽略blocks个obs大小的块
count=n 只拷贝n个记录
conv=conversion[,conversion…] 用指定的参数转换文件。
转换参数:
ascii 转换EBCDIC 为ASCII
ebcdic 转换ASCII 为EBCDIC
block 转换为长度为cbs 的记录,不足部分用空格填充。
unblock 替代cbs长度的每一行尾的空格为新行
lcase 把大写字符转换为小写字符
ucase 把小写字符转换为大写字符
swab 交换输入的每对字节
noerror 出错时不停止
notrunc 不截短输出文件
sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐
1)磁盘拷贝:
dd if=/dev/sda of=/dev/sdb
2)备份MBR:
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
3)破坏MBR中的bootloader:
dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
4)有一个大与2K的二进制文件fileA。现在想从第64个字节位置开始读取,需要读取的大小是128Byts。又有fileB, 想把上面读取到的128Bytes写到第32个字节开始的位置,替换128Bytes,请问如何实现?
#ddif=fileAof=fileBbs=1 count=128 skip=63 seek=31 conv=notrunc
1)备份:
dd if=/dev/sdx of=/dev/sdy
将本地的/dev/sdx整盘备份到/dev/sdy
dd if=/dev/sdx of=/path/to/image
将/dev/sdx全盘数据备份到指定路径的image文件
dd if=/dev/sdx | gzip >/path/to/image.gz
备份/dev/sdx全盘数据,并利用gzip工具进行压缩,保存到指定路径
2)恢复:
dd if=/path/to/image of=/dev/sdx
将备份文件恢复到指定盘
gzip -dc /path/to/image.gz | dd of=/dev/sdx
将压缩的备份文件恢复到指定盘
1)拷贝内存资料到硬盘
dd if=/dev/mem of=/root/mem.bin bs=1024
将内存里的数据拷贝到root目录下的mem.bin文件
2)从光盘拷贝iso镜像
dd if=/dev/cdrom of=/root/cd.iso
拷贝光盘数据到root文件夹下,并保存为cd.iso文件
3)销毁磁盘数据
dd if=/dev/urandom of=/dev/sda1
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/sda1将无法挂载,创建和拷贝操作无法执行。
得到最恰当的block size
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小
测试硬盘读写速度
dd if=/root/1Gb.file bs=64k | dd of=/dev/null
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
通过上两个命令输出的执行时间,可以计算出测试硬盘的读/写速度
修复硬盘
dd if=/dev/sda of=/dev/sda
当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生消磁点。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生。且这个过程是安全,高效的。
原创文章,作者:zhumengxiaotao,如若转载,请注明出处:http://www.178linux.com/40299
评论列表(1条)
文章整体思路清晰,结构层次分明,对于前面的可以做成链接跳转回更好。