Linux磁盘及文件系统
一、硬盘
硬盘接口
PATA(Paralled Advanced Technology Attachment,并行的先进技术规范),也叫IDE(Integrated Drive Eelectronics,集成电路驱动设备),是作为一种简单而廉价的接口而开发的。速度中等,容量大而且非常便宜。
串行ATA接口SATA(Serial ATA)是传统IDE的后续技术。除了支持更快的传输速率外,SATA通过清楚的连线和更长的最大电缆长度让连接更简单。SATA身支持热插拔和命令队列功能,让IDE在服务器领域成为SCSI的一种替代选择。
SCSI(Small Computer System Interface,小型计算机系统接口)支持在一条总线上安装多个硬盘,并且支持不同的速率和多种通信类型。
SAS(Serial Attached SCSI)串行连接SCSI是新一代的SCSI技术,兼容SATA。
光线通道(Fiber Channel)是在企业环境中得到广泛应用的串行接口,因为它的带宽高,一次能够连接大量的设备。
USB(Universal Serial Bus,通用串行总线)。在个人电脑上使用得非常普遍。
目前主流服务器接口为SATA和SAS。
硬盘原理与结构
典型的硬盘由镀上磁性薄膜的旋转盘片组成。数据是通过改变盘片表面的磁性微粒方向的一个小磁头来进行读取和写入的。
盘片围绕中心的主轴以恒定的速度高速旋转。将磁头移动到正确的位置读取特定的一段数据,称为寻道。当硬盘在磁头下面旋转时磁头所能达到的每个位置称为磁道。磁道还可以进一步划分为扇区,通常情况下它有512字节长。
在不同的盘片上距离旋转轴相同距离的一系列磁道称为一个柱面。如果所有的磁头都一起移动,那么不需要任何额外移动,就能读取存储在一个单独的柱面上的数据。尽管磁头的移动相当快,但相对硬盘旋转要慢的多。因此,不需要磁头寻找新的位置的硬盘访问都会更快一些。
磁盘存储术语
Head 磁头
Track 磁道
Cylinder 柱面
Sector 扇区,512Bytes
二、磁盘文件系统
在计算机上添加一块新的硬盘后,首先得进行分区(必要时先格式化),然后在分区上建立文件系统,再将此文件系统挂在某目录下才可用。
分区
硬盘分区能够把硬盘划分成一组独立的数据区域,而不是只有一个巨大的数据块,硬盘分区中还有引导块和分区表这样的结构。
分区的作用:
备份更容易;
优化I/O性能,提高修复速度;
实现磁盘空间配额限制;
隔离系统和程序;
安装多个OS;
采用不同的文件系统。
现在的系统倾向于使用更少的分区,但在大多数系统里至少有下面两种分区。
根分区:让系统所需要的所有东西都保存在这里。
交换分区:当没有足够的物理内存来保存信息时,交换分区就能存储虚拟内存中的内容。每个系统都应该至少有一个交换分区。
两种分区方式:MBR&GPT
1、MBR: Master Boot Record
特点:
使用32位表示扇区数,分区大小不超过2T。
0磁道0扇区为主引导记录:512bytes
446bytes: boot loader
64bytes:分区表
每16bytes: 标识一个分区
2bytes: 55AA,MBR区域的有效性,一般55AA为有效,否则无效。
按柱面进行分区。可建4个主分区,3主分区+1扩展分区(内可建N个逻辑分区) 。
MBR 硬盘分区结构图
2、GPT:GUID(Globals Unique Identifiers)
特点:
Partition table支持128个分区,使用64位,支持8Z(512Byte/block)64Z(4096Byte/block);
使用128位UUID 表示磁盘和分区 ,GPT分区表自动备份在头和尾两份,并有CRC校验位;
UEFI (统一扩展固件接口)硬件支持GPT,使操作系统启动。
GPT分区结构
分区管理命令
1、分区管理工具–fdisk
常用用法:
1)fdisk device 编辑磁盘分区;
2)fdisk -l [-u] [device…]查看磁盘分区信息;
Options -l:列出指定设备的分区表信息,若未指定,则列出/proc/partions里的;
-u:按扇区而非柱面显示分区信息。
3)fdisk -s partition… 显示分区的大小(按块blocks显示)
fdisk命令提供了一个交换式的接口来管理分区,用#fdisk device命令进入编辑后,它有许多子命令,用于不同的管理功能,所有的操作均在内存中完成,没有直接同步到磁盘,直到使用w命令保存。
常用子命令:
p:显示分区列表 t:更改分区类型
n:创建新分区 d:删除分区
w:保存并退出 q:不保存并退出
m:查看帮助信息 l:查看所有分区类型
2、重读分区表–partx;kpartx;partprobe
在已划分过分区别且已经挂载其中某个分区的磁盘上创建新的分区时不会立即读至内核生效,需要用命令重读分区表。用法:
1)partx
添加分区:partx -a device
删除分区:partx -d –nr N-M device(–nr:指定分区范围eg. –nr2-4)
2)partprobe (centos6 不适用)
3)Kpartx [-a|-d] device (效果不稳定一般用partx)
3、其他分区管理工具–gdisk;blkid;parted
gdisk 管理GPT设备的工具,用法基本同fidsk;
blkid 显示块设备属性;
parted非交互式分区管理命令
用法:parted [选项]… [设备[命令[参数]…]…];
eg.: parted /dev/sdb mklabel gpt|msdos:创建gpt或msdoc分区磁盘;
parted /dev/sdb print:显示分区表;
Parted /dev/sdb mkpart primary 1 200 (默认M):创建分区;
parted /dev/sdb rm1 :删除分区;
parted的操作都是实时生效的,需小心使用。
4、查看块设备:
lsblk 列出块设备;
cat /proc/partitons;
ls /dev/sd*
文件系统
即便一个硬盘已经在概念上被分成了若干个分区,它仍旧没有为保存文件做好准备,在硬盘使用做好准备前,须创建文件系统,文件系统需要添加一点自己的开销。
分区与文件系统结构
磁盘文件系统类型
Linux文件系统:ext2(Extended file system), ext3,ext4, xfs(SGI), btrfs(Oracle) , reiserfs, jfs(AIX), swap;
Windows:fat32, ntfs;
Unix: FFS(fast), UFS(unix), JFS2;
网络文件系统:NFS, CIFS;
集群文件系统:GFS2, OCFS2(oracle);
分布式文件系统:ceph, moosefs, mogilefs, glusterfs,Lustre;
光盘:iso9660;
RAW:未经处理或者未经格式化产生的文件系统。
ext文件系统目前一直是Linux文件系统的主流,虽然最新的centos7版本已经采用了xfs文件系统。ext3后开始加入了日志功能,大大增加了可靠性。此文件系统在硬盘上专门开辟了一个区域来保存日志文件。在发生系统操作时,所要求的修改首先写入日志文件。之后,才对正式的文件系统做修改。如果发生了崩溃,可以用日志记录重构出完全相同的文件系统。
文件系统管理命令
1、创建文件系统–mkfs;mke2fs
mkfs常用方法
mkfs [-t fstype] [fs-options] device
常用fstype选项:ext2;ext3;ext4;xfs;btrfs;vfat;msdos。默认ext2
mkfs实际是是各种文件系统创建命令的前端。如mkfs.ext3;mkfs.ext4…
mke2fs -j = mke2fs -t ext3 = mkfs -t ext3 = mkfs.ext3
mke2fs命令是ext系列文件系统的专用文件系统创建工具。目前最常用为ext文件系统,其命令选项也基本与mkfs相同。因此我们详细介绍下mke2fs命令。常用用法:
mke2fs [-t fstype] [fs-options] device
options: -t {ext2,ext3,ext4} :指明要创建的文件系统类型;
-b {1024|2048|4096} : 指明文件系统的块大小,不超过4096;
-L LABEL :指明卷标;
-j : journal,创建有日志功能的文件系统ext3;
-i #: bytes-per-inode,指明inode与字节的比率,即每多少字节创建一个inode;
-I #:设定每个inode的大小(128-4096bytes)
-N # : 直接指明要给此文件系统创建的Inode数量;
-O [^] FEATURES:设置某种属性,挂载时这些属性将会继承,加^表示关闭;
eg. mke2fs -O ^has_journal /dev/sda3 #关闭日志功能;
-o [^]MOUNT_OPTIONS:开启或关闭某种默认挂载选项。
-m # : 指定预留的空间百分比;不需要加百分号
其他相关命令工具–e2label;blkid;findfs
e2label
e2label device 查看设备卷标;
e2label device LABEL 设定卷标;
blkid
-U UUID: 根据指定的UUID来查找对应的设备
-L LABEL:根据指定的LABEL来查找对应的设备
findfs:查找分区
findfs LABEL=<label>
findfs UUID=<uuid>
文件系统属性修改与查看–tune2fs;dumpe2fs
tune2fs –重新设定ext系列文件系统可调整参数的值。
-l:查看指定文件系统超级块信息;super block;
-L 'LABEL':修改卷标;
-m #:修预留给管理员的空间百分比;
-j: 将ext2升级为ext3;
-O: 文件系统属性启用或禁用,–O ^has_journal;
-o: 调整文件系统的默认挂载选项,–o ^acl;
-U UUID: 修改UUID号;
dumpe2fs–查看ext系列文件系统所有文件系统信息,包括各分组。
-h:只查看超级块信息,不显示分组信息
文件系统检查与修复–fsck;e2fsck
命令–fsck;e2fsck;
fsck [-t fstype] [device]
options: -a 无须交互而自动修复所有错误;
-r 交互式修复;
e2fsck —ext系列文件系统修复,常用用法:
e2fsck [options] [device]
option:-t fstype 指明文件系统类型;
-y 非交互,所有问题自动回答为yes;
-r 交互式修复;
-f:强制修复,即使文件系统状态为clean。
注:不要在挂载情况下修复。
挂载(安装文件系统)
根之外的文件系统需要被访问,就需先关联至文件系统下的某目录来实现,此关联过程即为挂载。此目录即为挂载点Mount_point。
Mount_point当为文件的访问入口时,需注意如下特性:
目录需要事先存在的;
应该使用未被或不会被其它进程所使用的目录;
挂载的目录当有人访问时,目录不能被卸载;
/etc/mtab记录了所有的mount设备。
挂载文件系统命令工具–mount
mount [-fnrsvw] [-t vfstype] [-o options] device dir
options:
-t vsftype:指定要挂载的设备上的文件系统类型
-r: readonly,只读挂载;
-w: read and write, 读写挂载;
-n: 不更新/etc/mtab挂载;
-a:自动挂载(定义在了/etc/fstab文件中,且挂载选项中有auto功能的设备);
-L LABEL: 以卷标指定挂载设备;
-U UUID: 以UUID指定要挂载的设备;
-B, –bind: 绑定目录到另一个目录上;
-o options:指定挂载的文件系统的属性,多个选项使用逗号分隔;
async:异步模式,I/O读写异步执行;
sync:同步模式,内存更改时,同时写磁盘;
atime/noatime:文件或目录被访问时是否更形其时间戳;
diratime/nodiratime:文件或目录被访问时是否更形其时间戳;
auto/noauto:是否支持自动挂载;
exec/noexec:是否支持在文件系统上运行应用程序;
dev/nodev:是否支持在此文件系统上的设备文件可以使用;
suid/nosuid:是否支持suid和sgid权限;
remount:重新挂载;
ro:只读;
rw:读写;
user/nouser:是否允许普通用户挂载此设备,默认管理员才能挂载;
acl:启用此文件系统上的acl功能;
owner:是否应许普通用户挂载此设备如果其实设备的所有者(默认加带nodev和nosuid选项除非有其他指明);
defaults:默认挂载选项,相当于rw, nosuid, dev, exec, auto, nouser, async。
为了让系统在引导的时候自动挂载文件系统,在/etc/fstab文件中为每一个文件系统添加了一行配置。每行列出了设备名、挂载点、文件系统类型、安装选项、备份频率及自检次序。如图
查看挂载情况
1)mount;
2)cat /etc/mtab;
3)cat /proc/mounts(详细)
其他设备安装与挂载
swap设备
创建swap文件系统
mkswap [options] device
options:-L LABEL:指定设备卷标
启用:swapon
swapon [OPTION]… [DEVICE]
-a:激活所有的交换分区;
-p PRIORITY:指定优先级;
默认优先级从负1开始,每增加一个优先级减1.
禁用swap设备
swapoff [OPTION]… [DEVICE]
查看swap设备
swapon -s
cat /proc/swaps
自动挂载所有swap文件系统
swapon -a (挂载/etc/fstab中所有的swap文件系统)
U盘文件系统
U盘设备会被自动识别成scsi类似的设备名如/dev/sdd
挂载 mount -r /dev/sdd dir
退出U盘时建议先使用sync命令同步。
光盘文件系统
在图形环境下自动启动挂载/run/media/<user>/<label>
否则就必须被手工挂载 mount /dev/cdrom dir
eject命令卸载或弹出磁盘;
创建ISO文件;
eg. cp /dev/cdrom /root/centos7.iso
mkisofs -r -o /root/etc.iso /etc
刻录光盘;
wodim –v –eject centos.iso
卸载文件系统
命令umount
umount [-dflnrv] {dir|device}…
umount -a 取消挂载/etc/mtab中所有已挂载的设备
注:正在被进程访问的设备不能被卸载;
查看设备正被些进程使用
lsof MOUNT_POINT
fuser -v MOUNT_POINT
强制终止所有正在访问某挂载点的进程
fuser -km MOUNT_POINT
两种特殊的挂载
1、目录挂载
又称目录绑定,将某目录挂载到另一个目录上,其内容在两个地方皆可见;
mount –bind srv_dir dest_dir
2、文件挂载–挂载本地回环设备
1)格式化某文件为文件系统;eg. mkfs.ext4 /PATH/TO/SOME_LOOP_FILE
2)mount -o loop /PATH/TO/SOME_LOOP_FILE MOUNT_POINT(centos7可无选项);
此时用blkid命令看不到此文件系统,需用blkid FILENAME 查看;
Centos6的/dev中有7个loop设备,分别为/dev/loop0、/dev/loop2…/dev/loop7;当创建一个回环文件时则会与某个loop设备自动关联,一般从0开始,此时可直接用此loop设备名挂载;也可以自己手动指定和管理loop设备,使用losetup命令。
losetup /dev/loop2 LOOP_FILE 指定LOOP_FILE与/dev/loop2关联;
losetup -d /dev/loop2 删除此loop设备,需先取消挂载;
losetup -a 查看所有已关联loop设备情况;
losetup -f 查看第一个尚未被关联的loop设备。
其他相关常用工具–free;df;du;dd
内存空间使用状态
free [OPTION]
-m: 以MB为单位
-g: 以GB为单位
文件系统空间占用等信息的查看
df [OPTION]… [FILE]…
-H : 以1000为单位
-T : 显示文件系统类型
-h: human-readable
-i:inodes instead of blocks,显示inode节点使用状况;
-P: 以Posix兼容的格式输出
查看某目录总体空间占用状态:
du [OPTION]… DIR (默认只递归显示目录的大小)
-h: human-readable;
-s: summary只显示目录总的大小而不显示子目录;
-a:递归显示所有文件和目录而不只是目录的大小;
dd命令:convert and copy a file
常用用法:dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=#
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长度的每一行尾的空格为新行;
case 把大写字符转换为小写字符;
ucase 把小写字符转换为大写字符;
nocreat 不创建输出文件;
noerror 出错时不停止;
notrunc 不截短输出文件;
sync 把每个输入块填充到ibs个字节,不足部分用空(NULL)字符补齐;
备份MBR
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
破坏MBR中的bootloader:
dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
eg.有一个大与2K的二进制文件fileA。现在想从第64个字节位置开始读取,需要读取的大小是128Byts。又有fileB, 想把上面读取到的128Bytes写到第32个字节开始的位置,替换128Bytes,请问如何实现?
#dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc
备份
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工具进行压缩,保存到指定路径
恢复
dd if=/path/to/image of=/dev/sdx
将备份文件恢复到指定盘
gzip -dc /path/to/image.gz | dd of=/dev/sdx
将压缩的备份文件恢复到指定盘
拷贝内存资料到硬盘
dd if=/dev/mem of=/root/mem.bin bs=1024
将内存里的数据拷贝到root目录下的mem.bin文件
dd if=/dev/cdrom of=/root/cd.iso
拷贝光盘数据到root文件夹下,并保存为cd.iso文件
销毁磁盘数据
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指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小.
测试硬盘读写速度
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
dd if=/root/1Gb.file bs=64k | dd of=/dev/null
通过上两个命令输出的执行时间,可以计算出测试硬盘的写/读速度.
修复硬盘
dd if=/dev/sda of=/dev/sda
当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生消磁点。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生,且这个过程是安全高效的。
原创文章,作者:beyond,如若转载,请注明出处:http://www.178linux.com/47098