Linux磁盘管理

设备文件

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

磁盘结构

磁盘接口类型

并行

  • IDE:133MB/s

  • SCSI:640MB/s

串口

  • SATA:6Gbps

  • SAS:6Gbps

  • USB:480MB/s

rpm

  • rotationsper minute 硬盘每分钟转数

硬盘结构

Linux磁盘管理 图一 Linux磁盘管理 图二


下面我们来介绍几个磁盘存储的数据

  1. head:磁头 即 盘面

  2. track:磁道

  3. cylinder: 柱面

  4. secotr: 扇区,512bytes

每个扇区空间大小为512byte

从图上看扇区是越往内圈越小。的确,扇区面积是小了,但存储的数据量不变,只是数据存储密度增大了而已(存在浪费空间)。

机械硬盘使用8位二进制数表示磁头(head)数,所以最多可以有2^8个磁头即256个

采用10位二进制数表示磁道(track)数,所以最多可以有2^10个磁道即1024个

采用6位二进制数表示扇区(sector)数,所以每个磁道最多可以有2^6个扇区即64个

这里我们可以得到一个公式

单个磁盘最大空间=每个磁道扇区数×每个扇区大小×磁道数×磁头数=64×512(byte)×1024×256=8G

分区是按照柱面来划分的

所以同样的可以得到

一个分区的最小单位=一个磁道大小×磁头数=64×512(byte)×256=8M

所以我们的分区大小通常为8M的整倍数

但实际情况好像并不是这样?

这是因为我们的运算是按照CHS(cylinder、head、sector)的

即每个磁道的扇区数相同

现在一般采用CHS和LBA相结合的方式划分扇区即每个磁道上的扇区数可以不同、并且一个柱面可以属于多个分区

这样单个磁盘最大空间要大的多的多

Linux磁盘管理

磁盘分区

为什么是分区?

  • 优化I/O性能

  • 实现磁盘空间配额限制

  • 提高修复速度

  • 隔离系统和程序

  • 安装多个OS

  • 采用不同文件系统

分区

两种分区方式:MBR,GPT

首先介绍MBR

MBR:master boot record 使用32位(4byte)表示扇区数,所以单个分区不超过2T(2^32×512=2T)

如何分区:按柱面

0磁道0扇区:512bytes

446bytes: boot loader
64bytes:分区表
        16bytes: 标识一个分区
        4个主分区;3主分区+1扩展(N个逻辑分区)
2bytes: MBR区域的有效性标识;55AA为有效

下面我们使用命令来看下MBR的内容

[root@redhat7 ~]# hexdump -C -n 512 /dev/sda

Linux磁盘管理

一个简单实验:

1、使用dd命令备份磁盘的mbr

2、使用dd命令破坏磁盘的mbr

3、使用dd命令利用备份的mbr恢复到磁盘上

[root@redhat7 ~]# fdisk -l /dev/sdb
// 首先查看/dev/sdb  是存在的
[root@redhat7 ~]# dd if=/dev/sdb of=/root/mbr.bak bs=512 count=1
// 备份/dev/sdb的MBR 到 /root/mbr.bak
[root@redhat7 ~]# dd if=/dev/zero of=/dev/sdb bs=512 count=1
// 破坏/dev/sdb的MBR
[root@redhat7 ~]# fdisk -l /dev/sdb
// /dev/sdb的分区表 已经不复存在了
[root@redhat7 ~]# dd if=/root/mbr.bak of=/dev/sdb bs=512 count=1
// 恢复/dev/sdb 的MBR
[root@redhat7 ~]# fdisk -l /dev/sdb
// /dev/sdb的分区表又重新显示了

MBR分区结构

Linux磁盘管理

从图上我们也可以发现一个问题:

实验环境    
/dev/sda为我们正常使用的硬盘
/dev/sdb为我们新添加的一块硬盘

dd if=/dev/sda of=/dev/sdb bs=512 count=1
dd if=/dev/sda of=/dev/sdb bs=1 count=66 skip=446 seek=446
dd if=/dev/zero of=/dev/sdb bs=1 count=2 skip=510 seek=510
dd if=/dev/sda of=/dev/sdb bs=1 count=2 skip=510 seek=510

Linux磁盘管理

从图中我们可以看到复制sda的MBR到sdb,但是它们两个显示的并不一样,sdb没有显示逻辑分区sdb5

所以可以说明MBR存储的只有主分区和扩展分区的分区表信息(最多只能复制4个分区表的信息,这点前面也介绍过);
逻辑分区的分区表信息并不存在于MBR(可以查看前面的图示,这点需要注意)

GPT分区

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

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

  • UEFI (统一扩展固件接口)硬件支持GPT,使操作系统启动

    操作系统安装在GPT分区中时,要在主板BIOS设置中将电脑设置为支持UEFI启动

GPT分区结构

Linux磁盘管理

管理分区

  • 列出块设备

    [root@redhat7 ~]# blkid 
        blkid -L <label> | -U <uuid>
  • 添加一块新的硬盘作为实验环境

    [root@redhat7 ~]# echo "- - -" > /sys/class/scsi_host/host0/scan
    [root@redhat7 ~]# echo "- - -" > /sys/class/scsi_host/host1/scan
    [root@redhat7 ~]# echo "- - -" > /sys/class/scsi_host/host2/scan
    //在不需要重启的情况下识别新添加的硬盘
  • 创建MBR分区

    fdisk创建MBR分区,也支持GPT,对于一块硬盘,最多只能管理15分区
    
    [root@redhat7 ~]# fdisk -hlep
    Usage:
        fdisk [options] <disk>change partition table
        fdisk [options] -l <disk> list partition table(s)
  • 创建MBR分区

    gdisk [ -l ] device

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

    [root@redhat7 ~]# parted --help
    Usage: parted [OPTION]... [DEVICE [COMMAND [PARAMETERS]...]...]
    Apply COMMANDs with PARAMETERS to DEVICE.  If no COMMAND(s) are given, run in
    interactive mode.

查看是MBR分区还是GPT分区的几个命令,及其混合

[root@redhat7 ~]# gdisk /dev/sdb
[root@redhat7 ~]# gdisk /dev/sdc
[root@redhat7 ~]# fdisk /dev/sdb
[root@redhat7 ~]# fdisk /dev/sdc
[root@redhat7 ~]# fdisk -l /dev/sdc
Disk label type: gpt
[root@redhat7 ~]# fdisk -l /dev/sdb
Disk label type: dos


[root@redhat7 ~]# gdisk -l /dev/sdc
[root@redhat7 ~]# gdisk -l /dev/sdb
// 注意区别

同步分区表

查看内核是否已经识别新的分区
[root@redhat7 ~]# cat /proc/partitions
[root@redhat7 ~]# lsblk
[root@redhat7 ~]# ls /dev/设备名
//以上3个命令为查看内核中的分区表

[root@redhat7 ~]# fdisk -l /dev/设备
//查看为磁盘上的分区表

如果上面和下面命令显示的设备文件不一样,则需要通知内核重新读取硬盘分区表

centos 6

新增分区用
[root@redhat7 ~]# partx -a -n M:N /dev/DEVICE

删除分区用
[root@redhat7 ~]# partx -d -nr M:N /dev/DEVICE

centos 5、7

[root@redhat7 ~]# partprobe [/dev/DEVICE]

parted命令

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

parted - a partition manipulation program
parted [options] [device [command [options...]...]]


optionss:

-l, --list   lists partition layout on all block devices


COMMANDS:

help [COMMAND]   print general help, or help on COMMAND
mklabel,mktable LABEL-TYPE   create a new disklabel (partition table)
mkpart PART-TYPE [FS-TYPE] START END   make a partition
print [...]  display the partition table,
rm NUMBER    delete partition NUMBER



# parted /dev/sdb mklabel gpt|msdos
# parted /dev/sdb print
# parted /dev/sdb mkpart primary 1 200 (默认M)
# parted /dev/sdb rm 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:Linux虚拟文件系统

Linux磁盘管理

创建文件系统

mkfs命令:
(1) # mkfs.FS_TYPE/dev/DEVICE
    ext4
    xfs
    btrfs
    vfat
(2) # mkfs-t FS_TYPE /dev/DEVICE
    -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[,...]:启用指定特性
    -O ^FEATURE:关闭指定特性

文件系统属性

文件系统标签

  • 指向设备的另一种方法

  • 与设备无关

    blkid:块设备属性信息查看 blkid[OPTION]… [DEVICE] -U UUID: 根据指定的UUID来查找对应的设备 -L LABEL:根据指定的LABEL来查找对应的设备

    e2label:管理ext系列文件系统的LABEL # e2label DEVICE [LABEL]

    findfs:查找分区 findfs[options] LABEL=

tune2fs

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

Linux磁盘管理

文件系统检测和修复

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

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

fsck: File System Check
fsck.FS_TYPE
fsck-t FS_TYPE
-a: 自动修复错误
-r: 交互式修复错误

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

e2fsck:ext系列文件专用的检测修复工具
-y:自动回答为yes
-f:强制修复

挂载mount

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

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

把设备关联挂载点:mount Point # mount

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

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

挂载点目录一般为空

挂载方法: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:挂载点
事先存在;建议使用空目录
进程正在使用中的设备无法被卸载


[option]
    -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



-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, suid, dev, exec, auto, nouser, async

卸载命令

查看挂载情况:
#findmntMOUNT_POINT
查看正在访问指定文件系统的进程:
#lsofMOUNT_POINT
#fuser -v MOUNT_POINT
终止所有在正访问指定的文件系统的进程:
# fuser -km MOUNT_POINT
卸载:
# umountDEVICE
# umountMOUNT_POINT

挂载点和/etc/fstab

配置文件系统体系
被mount、fsck和其它程序使用
系统重启时保留文件系统体系
可以在设备栏使用文件系统卷标
使用mount -a 命令挂载/etc/fstab中的所有文件系统

原创文章,作者:sixijie,如若转载,请注明出处:http://www.178linux.com/41821

(0)
sixijiesixijie
上一篇 2016-08-30
下一篇 2016-08-30

相关推荐

  • Linux-start

    学习计划:参见N24学习时间与线路图. 目标:完成作业,考试过关。 宣言:人但有追求,世界亦会让路。

    Linux干货 2016-10-24
  • 3rd work

    1、列出当前系统上所有已经登陆的用户名,注意同一个用户登陆多次,则只显示一次即可。 [root@localhost ~]# w 11:50:45 up 24 min,  3 users,  load average: 0.04, 0.04, 0.10 USER     TTY      FROM             LOGIN@   IDLE   JCP…

    Linux干货 2017-10-08
  • 学习一个星期的沿途体会

    人生处处都是坑,只看跳的深不深。下面就来介绍介绍我跳的坑吧!当然我可没打算在此长眠 既然选择了Liunx,那对它的历史就得了解清楚。就如同我们结婚,既然选择了对方,那就要了解他的过去,包容他的未来。           Linux操作系统是一个叫Linus Torvalds的大学生在1991年开发而来。当然,…

    2017-07-16
  • 第二周博客作业

    1.linux上的文件管理类命令都用哪些,其常用的使用方法及其相关示例演示。 常用命令有:cp, mv, rm 复制命令:cp cp [OPTION]… [-T] SOURCE DEST                 cp [OPTION]… SOURC…

    Linux干货 2016-06-23
  • N25第5周作业(grep和find使用)

    显示当前系统上root, fedora 或user1的默认shell 找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello(); 使用echo命令输出一个绝对路径,使用grep取出基名,扩展取出其路径名 找出IFCONIFG命令结果的1-255之间的数字 挑战题:写一个模式,能匹配出合理的IP地址 挑战题…

    Linux干货 2016-12-30
  • 从需求和安全角度开始linux(一)-20151211

    突然想从需求和安全的角度来展开各种命令。因为我觉得linux中所有的常用命令基本都是需求和安全的产物。 当我打开一个CLI(command line interface)界面的linux操作系统时: 一、我希望能够看到里面有什么,因此有了ls的命令。      ls – list&nbs…

    Linux干货 2015-12-15

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-01 13:23

    图片看起来是很直观,建议加上文字描述,这样别人才看的东,总体来说总结的还不错,有自己独特的地方。