linux系统管理之磁盘分区及管理

一 设备文件

计算机五大组件

cup,内存,输入设备,输出设备,存储

接口类型:

IDE(ata):并口,133MB/s 

SCSI:并口,Ultrascsi320,320MB/s Ultrascsi640,640MB/s

SATA:串口,6gbps,6*1024/8=768MB/s 

USB:串口,480MB/s 

I/O Ports: I/O设备地址 

一切皆文件: open(), read(), write(), close() 

设备类型: 

    块设备:block,存取单位“块”,磁盘 

    字符设备:char,存取单位“字符”,键盘 

设备文件:关联至一个设备驱动程序,进而能够跟与之对应硬件设备进行通信 

设备号码: 

    主设备号:major number, 标识设备类型 

    次设备号:minor number, 标识同一类型下的不同设备

blob.png

二 设备文件

磁盘设备的设备文件命名:/dev/DEV_FILE 

IDE,SCSI, SATA, SAS, USB: /dev/sd 不同设备:a-z /dev/sda, /dev/sdb, ... 

同一设备上的不同分区:1,2, ... /dev/sda1, /dev/sda5

机械硬盘

track:磁道

sector:扇区,512bytes

cylinder:柱面

机械硬盘的结构

blob.png

盘片的逻辑结构图

blob.png

早期的磁盘遵循CHS寻址,以柱面为划分,一般分区为8M的整数倍

因此最大空间为

一个扇区512字节 

扇区63

磁道1024

盘面(磁头):256个(逻辑磁头非物理)

512*63*1024*256/1024/1024 =8064M

一个柱面的最大空间为512*63*256/1024/1024=8M左右

现在的磁盘遵循LBA寻址,以扇区为单位划分,一个扇区512字节

centos7就是以扇区为单位划分的

可以通过 fdisk -l -u=cylinders 显示柱面划分

blob.png

默认以扇区来分配的

blob.png

加载新的磁盘并使之生效

echo "- - -" >/sys/class/scsi_host/host2/scan 

三 磁盘分区

分区的好处

 可以优化I/O性能

 实现磁盘空间配额限制

 提高修复速度

 隔离系统和程序

 可以安装多个OS

现在分区方式有两种:MBR , GPT

MBR:Master Boot Record,1982年,使用32位表示扇区数,因此,分区不超过2T (2^32*512/1024/1024/1024/1024=2T)

该分区是按照柱面单位来进行分区的

0磁道0扇区:512bytes,其中446bytes用于 boot loader ; 64bytes用于分区表(16bytes标识一个分区) ;最后2bytes为 55AA

最大可以分4个主分区,包括3个主分区和一个扩展分区(N个逻辑分区)

MBR的结构图如下:

blob.png

GPT分区:

GPT:GUID patition table 支持128个分区,使用64位,支持8Z( 512Byte/block )64Z ( 4096Byte/block)

使用128位UUID 表示磁盘和分区 GPT分区表自动备份在头和尾两份,并有CRC校验位 

UEFI (统一扩展固件接口)硬件支持GPT

结构如图:

blob.png

四 分区管理

可以通过 lsblk 命令查看块设备

blob.png

创建分区使用: 

    fdisk 创建MBR分区,也支持GPT,对于一块硬盘,最多只能管理15分区 

    gdisk 创建GPT分区

    GNU parted 高级分区操作(创建、复制、调整大小等等) 

partprobe-重新设置内存中的内核分区表版本

分区创建工具:parted sfdisk ...

fdisk命令

fdisk device

fdisk 提供了一个交互接口来管理分区,它有许多子命令,所有的操作均在内存中完成,没有同步到磁盘,直到使用w命令保存至磁盘上

常用命令:

n :创建新分区

d :删除已有分区

t :修改分区类型

l :查看所有已经id

w :保存并退出

q :不保存并退出

m :查看帮助信息

p :显示现有分区信息

注意:在已经分区并已经挂载其中某个分区的磁盘设备上创建的新分区,内核可能在创建完成后无法直接识别

同步分区表

查看内核是否已经识别出新的分区 cat /proc/partitions  cat /proc/partitions  cat /proc/mounts 

可以通过内容重新读取硬盘分区表

    partx -a [device]

kpartx -af [device]

新增分区用(centos6)  partx -a -n M:N /dev/DEVICE     kpartx -a /dev/DEVICE -f: force 

删除分区用(centos6)  partx -d -n M:N /dev/DEVICE    centos6: partx -d --nr N-M /dev/DEVICE

CentOS 5,7: 使用partprobe   partprobe [/dev/DEVICE]

parted命令

注意: parted的操作都是实时生效的,小心使用

Usage: parted [OPTION]... [DEVICE [COMMAND [PARAMETERS]...]...]

parted /dev/sdb mklabel gpt|msdos     #设置分区表格式

parted /dev/sdb print         #查看硬盘信息

parted /dev/sdb mkpart primary 10 200 (默认M)  #创建分区从10M开始到200M结束

parted /dev/sdb rm 1     #删除分区号码为1的分区

parted -l            查看所有分区信息

五 文件系统

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统。 从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩,加密等。

文件系统类型:

Linux文件系统: ext2, 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:未经处理或者未经格式化产生的文件系统

文件系统分类:

根据其是否支持"journal"功能: 

    日志型文件系统: ext3, ext4, xfs, ... 

    非日志型文件系统: ext2, vfat 

文件系统的组成部分: 

    内核中的模块:ext4, xfs, vfat 

    用户空间的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat

Linux的虚拟文件系统:VFS 

查看当前系统支持的文件系统:cat /proc/filesystems

VFS结构图如下

blob.png

echo "- - -" >/sys/class/scsi_host/host2/scan  #让操作系统重读磁盘
dd if=/dev/sda of=/root/mbr bs=1 count=512  #备份mbr文件
hexdump -C mbr 查看二进制
dd if=mbr of=/dev/sdb      #将备份的mbr重新导入
dd if=/dev/zero of=/dev/sdb bs=1 count=446 #清零boot loader
dd if=/dev/zero of=/dev/sdb bs=1 count=64 skip=446 seek=446 #清零分区表
hexdump -C -n -v 512 /dev/sdb  查看分区表信息

brw-rw----. 1 root disk 8, 37 Aug 24 17:32 /dev/sdc5
mknod sdc b 8 37 

cd /misc/cd  #只要访问就自动挂载,centos 默认没有安装
yum install autofs
systemctl start autofs

创建文件系统

格式化:

    低级格式化(分区之前进行,划分磁道)

    高级格式化(分区之后进行,创建文件系统)

创建文件系统工具

  mkfs命令

mkfs.ext2,mkfs.ext3,mkfs.xfs... /dev/device

    mkfs -t FS_TYPE /dev/DEVICE

    mkfs -L 'LABEL' :设置卷标

创建ext文件系统

 mke2fs : 只用于ext系列文件系统的管理工具

    -t {ext2|ext3|ext4} 

    -b {1024|2048|4096} 

    -L 'LABEL' -j: 相当于 -t ext3 

    mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3 

    -i #: 为数据空间中每多少个字节创建一个inode;此大小不应该小于block的大小 

    -N #:为数据空间创建个多少个inode 

    -I 一个inode记录大小128---4096 

    -m #: 默认5%,为管理人员预留空间占总空间的百分比 

    -O FEATURE[,...]:启用指定特性 (可以通过/etc/mke2fs.conf文件查看)

    -O ^FEATURE:关闭指定特性

文件系统标签

 指向设备的另一种方法;并且与设备无关

 blkid :块设备属性信息查看

 blkid [OPTION]... [DEVICE] 

    -U UUID: 根据指定的UUID来查找对应的设备 

    -L LABEL:根据指定的LABEL来查找对应的设备 

blob.png

findfs :查找分区

    findfs [options] LABEL=<label> 

    findfs [options] UUID=<uuid>

tune2fs 命令:重新设定ext系列文件系统可调整参数的值 

    -l:查看指定文件系统超级块信息;super block 

    -L 'LABEL':修改卷标 

    -m #:修预留给管理员的空间百分比 

    -j: 将ext2升级为ext3 

    -O: 文件系统属性启用或禁用, 

    –O ^has_journal 

    -o: 调整文件系统的默认挂载选项,

    –o ^acl 

    -U UUID: 修改UUID号 

dumpe2fs: -h:查看超级块信息(分组信息),分区用分组管理

超级块和inode table如图所示:

blob.png

六 文件系统检测和修复

常发生于死机或者非正常关机之后

挂载为文件系统标记为“dirty” 

fsck: File System Check 

    fsck.FS_TYPE 

    fsck -t FS_TYPE 

    -a: 自动修复错误 

    -r: 交互式修复错误 

注意: FS_TYPE一定要与分区上已经文件类型相同;

e2fsck:ext系列文件专用的检测修复工具     

    -y:自动回答为yes 

    -f:强制修复

比如:

[root@centos7 ~]# dd if=/dev/zero of=/dev/sdc5 bs=1M count=20
[root@centos7 ~]# tune2fs -l /dev/sdc5
tune2fs 1.42.9 (28-Dec-2013)
tune2fs: Bad magic number in super-block while trying to open /dev/sdc5
Couldn't find valid filesystem superblock.
[root@centos7 ~]# fsck /dev/sdc5
[root@centos7 ~]# tune2fs -l /dev/sdc5
tune2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   nihao
Last mounted on:          /mnt/sdc5
Filesystem UUID:          453072c9-0464-4cd2-9af5-901fef8df161
Filesystem magic number:  0xEF53

六 挂载mount命令

挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为 

卸载:为解除此关联关系的过程 

把设备关联挂载点:mount Point 

卸载时:可使用设备,也可以使用挂载点 umount 

挂载点下原有文件在挂载完成后会被临时隐藏 

挂载点目录一般为空,否则会看不到挂载点原目录的内容

用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-43f145e7-85c0-a126711d406e' 

    (4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs 

    dir:挂载点 事先存在;建议使用空目录,进程正在使用中的设备无法被卸载

mount常用命令选项:

-t vsftype:指定要挂载的设备上的文件系统类型 

-r: readonly,只读挂载 

-w: read and write, 读写挂载 

-n:不更新/etc/mtab,相当于#mount

-a:自动挂载所有支持自动挂载的设备,定义在/etc/fstab文件中,且挂载选项中有auto功能

-L 'label':以卷标指定挂载设备

-U 'uuid':以uuid指定要挂载的设备

-B, --bind:绑定目录到另一个目录上

查看内核追踪到的已经挂载的所有设备: cat /proc/mounts

mount常用命令选项

-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功能

Defaults:相当于rw,nosuid,dev,exec,auto,nouser,async

卸载命令:

查看挂载情况: findmnt MOUNT_POINT 

查看正在访问指定文件系统的进程: lsof MOUNT_POINT 或者 fuser -v MOUNT_POINT

终止所有正在访问指定的文件系统的进程: fuser -km MOUNT_POINT

卸载:umount DEVICE  或者 umount MOUNT_POINT

挂载点和/etc/fstab

配置文件系统体系

被mount,fsck和其他程序使用

系统重启时保留文件系统体系

可以在设备栏使用文件系统卷标

使用mount -a 命令挂载/etc/fstab中的所有文件系统

文件挂载配置文件:/ec/fstab

  • 要挂载的设备或伪文件系统

  • 挂载点

  • 文件系统类型

  • 挂载选项

  • 转储频率

  • 自检次序 

要挂载的设备或伪文件系统: 设备文件,LABEL,UUID,伪文件系统名称(proc,sysfs)

挂载选项:defaults

转储频率: 0 :不做备份  1 :每天转储  2 :每隔一天转储

自检次序: 0 :不自检   1 :首先自检;一般只有rootfs才用1

格式如下:

blob.png

六 处理交换文件和分区  swap

交换分区是系统RAM的补充

设置交换分区包括以下几项

1,创建交换分区或文件

2,使用mkswap写入特殊签名

3,在/etc/fstab文件中添加适当的条目

4,使用swapon -a 激活交换空间

启用:swapon swapon [OPTION]... [DEVICE] 

    -a:激活所有的交换分区; 

    -p PRIORITY:指定优先级 /etc/fstab:pri=value #value越大,优先级越高

禁用:swapoff [OPTION]... [DEVICE]

(分区启用swap)操作如下

1,我们先分区比如用/dev/sdb磁盘

[root@centos6 ~]# fdisk /dev/sdb
Command (m for help): n    #创建一个新的分区
First cylinder (1238-2610, default 1238):  #回车相当于默认选项 1238
Using default value 1238
Last cylinder, +cylinders or +size{K,M,G} (1238-2610, default 2610): +4G         
Command (m for help): l     #列出所有分区类型
 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
 1  FAT12           39  Plan 9          82  Linux swap / So c1  DRDOS/sec (FAT-
...
Command (m for help): t      #修改分区类型
Partition number (1-6): 6
Hex code (type L to list codes): 82  
Changed system type of partition 6 to 82 (Linux swap / Solaris)
Command (m for help): p    #显示所有硬盘信息
...
/dev/sdb6            1238        1760     4200966   82  Linux swap / Solaris
Command (m for help): w      #将配置信息存到磁盘上

2,让操作系统重新读取分区信息:

[root@centos6 ~]# partx -a /dev/sdb

3,格式化分区信息

[root@centos6 ~]# mkswap -L SWAP_SDB6 /dev/sdb6    # -L 是卷标,swap分区格式化需要用mkswap 命令

Setting up swapspace version 1, size = 4200960 KiB

LABEL=SWAP_SDB6, UUID=4a62dae6-8923-4934-8f97-e2dd9ea43f7a

4,将分区配置写到/etc/fstab 文件内

blob.png

5,激活分区

swapon -s #查看所有swap信息
swapon -a #激活swap分区

blob.png

6,可以通过 free命令查看swap变大了

blob.png

文件启用swap 和分区类似

分区启用swap
fdisk /dev/sdb
mkswap -L SWAP_SDB1 /dev/sdb1
vi /etc/fstab
LABEL=SWAP_SDB1 swap swap defaults 0 0
swapon -s
swpaon -a
文件启用swap
dd if=/dev/zero of=/testdir/swapfile bs=1M count=1024
mkswap  /testdir/swapfile 
vi /etc/fstab
/testdir/swapfile   swap swap defaults 0 0
swapon -s cat /proc/swaps
swpaon -a

 

删除 swap

操作如下:

1,swapoff /dev/sdb1 或swapoff /testdir/swapfile

2,删除/etc/fstab相应记录

3,删除分区和文件

blob.png

swap的优先级:

  • 可以指定swap分区0到32767的优先级,值越大优先级越高 

  • 如果用户没有指定,那么核心会自动给swap指定一个优先级 ,这个优先级从-1开始,每加入一个新的没有用户指定优先级的swap,会给这个优先级减一。 

  • 先添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户指定的优先级(是正数)永远高于核心缺省指定的优先级(是负数)。 

  • 优化性能:分布存放,高性能磁盘存放

七 移动介质

光盘,U盘等一些移动存储设备

挂载意味着使外来的文件系统看起来如同是主目录树的一部分 

访问前、介质必须被挂载 

摘除时,介质必须被卸载 

按照默认设置,非根用户只能挂载某些设备(光盘、DVD、软 盘、USB等等)

挂载点通常在/media 或/mnt下

如何使用光盘

在图形环境下自动启动挂载/run/media/<user>/<label> 

否则就必须被手工挂载 mount /dev/cdrom /mnt/ 

eject命令卸载或弹出磁盘 eject -t 弹入光驱

创建ISO文件 

    cp /dev/cdrom /root/centos7.iso 

    mkisofs  -r  -o  /root/etc.iso /etc

刻录光盘 wodim –v –eject centos.iso

创建iso文件

cp /dev/sr0  /testdir/centos7.iso

挂载iso文件

mount -o loop /testdir/centos7.iso /mnt/iso

将目录打包成iso文件

mkisofs -r -o etc.iso /etc/

如何使用USB介质

被内核探测为SCSI设备 :  /dev/sdaX、/dev/sdbX、或类似的设备文件 

在图形环境中自动挂载 : 图标在[计算机]窗口中创建 ;挂载在/run/media/<user>/<label> 

手动挂载 : mount /dev/sdb1 /mnt

一些常见的工具

内存空间使用状态: 

free [OPTION] 

    -m: 以MB为单位 

    -g: 以GB为单位 

我感觉-h比较好使

文件系统空间占用等信息的查看工具: 

df [OPTION]... [FILE]... 

    -H 以1000为单位 

    -T 文件系统类型 

    -h: human-readable 

    -i:inodes instead of blocks 

    -P: 以Posix兼容的格式输出 

查看某目录总体空间占用状态: 

du [OPTION]... DIR 

    -h: human-readable 

    -s: summary

一般 du -sh DIR 这样使用


工具dd(这个我感觉好有用)

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  :把小写字符转换为大写字符

    nocreat  :不创建输出文件

    noerror  :出错时不停止

    notrunc  :不截短输出文件

    sync  :把每个输入块填充到ibs个字节,不足部分用(NUL)字符补充

磁盘拷贝: dd if=/dev/sda of=/dev/sdb

备份MBR: dd -f=/dev/sda of=/root/mbr.bak bs=512 count=1

破坏MBR中的分区表: dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446

例如:

有一个大与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/from/image of=/dev/sdx :将备份文件恢复到指定盘

gzip -dc /path/from/image.gz | dd of=/dev/sdx :将压缩的备份文件恢复到指定盘

dd if=/dev/mem of=/root/mem.bin bs=1024  :拷贝内存资料到硬盘(提示权限不足)

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大小

blob.png


测试硬盘读写速度:

dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000 

dd if=/root/1Gb.file bs=64k | dd of=/dev/null 

通过上两个命令输出的执行时间,可以计算出测试硬盘的写/读 /速度

blob.png


修复硬盘 

dd if=/dev/sda of=/dev/sda 

当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生消磁点。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时, 可能导致硬盘报废。上边的命令有可能使这些数据起死回生,且这个过程是安全高效的。


练习:

1、创建一个2G的文件系统,块大小为2048byte,预留1%可用空间,文件系统ext4,卷标为TEST,要求此分区开机后自动挂载至/test目录,且默认有acl挂载选项 

[root@centos6 ~]# mkfs.ext4 -b 2048 -m 1 -L TEST /dev/sdb5
[root@centos6 ~]# mkdir /test
[root@centos6 ~]# mount /dev/sdb5 /test
[root@centos6 ~]# vim /etc/fstab 
[root@centos6 ~]# mount -a

可以通过:此命令查看分区信息

[root@centos6 ~]# tune2fs -l /dev/sdb5

blob.png

2、写一个脚本,完成如下功能: (1) 列出当前系统识别到的所有磁盘设备 (2) 如磁盘数量为1,则显示其空间使用信息 否则,则显示最后一个磁盘上的空间使用信息

#!/bin/bash
list=/dev/sd?
if [ $(echo $list|wc -w)  -eq 1 ];then
        fdisk -l $(echo $list|cut -d' ' -f1)
else
        fdisk -l $(echo $list|cut -d' ' -f$(echo $list|wc -w))
fi

blob.png