Linux磁盘管理

1、相关知识

磁盘,是计算机硬件中不可或缺的部分磁盘,是计算机的外部存储器中类似磁带的装置,将圆形的磁性盘片装在一个方的密封盒子里,这样做的目的是为了防止磁盘表面划伤,导致数据丢失。磁盘有软磁盘,硬磁盘。硬磁盘就是机械硬盘。

硬盘是电脑主要的存储媒介之一,由一个或者多个铝制或者玻璃制的碟片组成。碟片外覆盖有铁磁性材料。硬盘有固态硬盘(SSD 盘,新式硬盘)、机械硬盘(HDD 传统硬盘)、混合硬盘(HHD 一块基于传统机械硬盘诞生出来的新硬盘)。SSD采用闪存颗粒来存储,HDD采用磁性碟片来存储,混合硬盘(HHD: Hybrid Hard Disk)是把磁性硬盘和闪存集成到一起的一种硬盘。绝大多数硬盘都是固定硬盘,被永久性地密封固定在硬盘驱动器中。

    与硬盘相关的物理名词有:扇区(sector)、磁道(track)、磁头(head)、柱面(Cylinder柱面=盘面数*磁道数)、

 

2、利用命令fdisk –l查看硬盘相关信息

[[email protected] ~]# fdisk -l

 

Disk /dev/sda: 21.5 GB, 21474836480 bytes        #硬盘大小

255 heads, 63 sectors/track, 2610 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: 0x000df0a3

 

  Device Boot      Start         End      Blocks   Id  System

/dev/sda1               1         262     2097152   82  Linux swap / Solaris

Partition 1 does not end on cylinder boundary.

/dev/sda2   *         262        2611    18873344   83  Linux

 

3、RAID磁盘阵列

    RAID磁盘阵列(Redundant Arrays of Independent Disks)有"独立磁盘构成的具有冗余能力的阵列"之意。

磁盘阵列是由很多价格较便宜的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。磁盘阵列还能利用同位检查(Parity Check)的观念,在数组中任意一个硬盘故障时,仍可读出数据,在数据重构时,将数据经计算后重新置入新硬盘中。

以4块1T的硬盘为例,常用raid

raid 0    条带卷 至少1块盘    

优点:成倍提高写入和读取速度,提高4倍,总容量4T

缺点:数据安全性较低

raid 1    镜像卷 只能两块盘    读写速度没有提升,总容量1T    

优点:安全性高    

缺点:性价比低

raid 5    至少三块盘    总容量3T,写入速度提高大概两倍,读取速度提高三倍,下图中HD4用来做校验盘

优点:比较折中,允许坏一块盘,数据安全性比raid0好

raid 1+0=10    至少需要4块盘,偶数    总容量2T,读写速度提升总盘数读取速度的一半,常用于数据库服务器

优点:同时满足速度和安全性

缺点:性价比低

 

4、LVM逻辑卷管理

LVM逻辑卷管理(Logical Volume Manager)是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现,目前最新版本为:稳定版1.0.5,开发版 1.1.0-rc2,以及LVM2开发版。Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。随着Linux的逻辑卷管理功能的出现,这些问题都迎刃而解,用户在无需停机的情况下可以方便地调整各个分区大小。

优点:可灵活调整在线分区大小

缺点:磁盘读写性能会降低

 

5、在Linux下加SCSI硬盘

SCSI硬盘被系统识别的名称为sd,IDE硬盘被系统识别的名称为hd

虚拟机添加硬盘,重新开机,执行fdisk –l查看

[[email protected] ~]# fdisk -l

 

Disk /dev/sda: 21.5 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 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: 0x00098b99

 

  Device Boot      Start         End      Blocks   Id  System

/dev/sda1               1         262     2097152   82  Linux swap / Solaris

Partition 1 does not end on cylinder boundary.

/dev/sda2   *         262        2611    18873344   83  Linux

 

Disk /dev/sdb: 1073 MB, 1073741824 bytes        #新加的硬盘

255 heads, 63 sectors/track, 130 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: 0x00000000

 

6、fdisk对硬盘进行分区

fdisk /dev/sdb

常用参数

m   print this menu            #打印帮助信息

n   add a new partition            #增加一个分区

p   print the partition table        #打印分区表

d   delete a partition            #删除一个分区

w   write table to disk and exit    #写入分区表到硬盘并退出

q   quit without saving changes    #退出不保存

l   list known partition types        #已知分区类型列表

t   change a partition's system id    #改变系统分区的id号

Command (m for help): n

Command action

  l   logical (5 or over)            #逻辑分区

  e   extended                #扩展分区

  p   primary partition (1-4)    #主分区

fdisk非交互式分区:

echo -e "n\np\n1\n\n+10M\nn\ne\n2\n\n\nn\nl\n\n+10M\nn\nl\n\n\n\nw"|fdisk /dev/sdb

MBR    分区方案        MBR存储在0磁头(柱面)0磁道1扇区

在MBR的分区表中,逻辑分区不限数量,主分区最多4个,扩展分区只占一个主分区

4个主分区1-4,无扩展分区,扩展分区可以进行二次分区,扩展分区下进行二次划分的分区叫逻辑分区

分区类型:分区p,扩展分区e,逻辑分区l

3个主分区+1个扩展分区(3p+1e),

2个主分区+1个扩展分区(2p+1e)

1个主分区+1个扩展分区(1p+1e)

如果要分5个分区,可选分区方案

3p+2l

2p+3l

1p+4l

如果要分6个分区,可选分区方案

3p+3l

2p+4l

1p+5l

[[email protected] ~]# ls /dev/sd*

/dev/sda   /dev/sda2  /dev/sdb1  /dev/sdb3  /dev/sdb6  /dev/sdb8

/dev/sda1  /dev/sdb   /dev/sdb2  /dev/sdb5  /dev/sdb7

 

7、格式化分区

mkfs==make file system执行命令mkfs 默认磁盘格式为ext2 指定格式为mkfs.ext4 /dev/sdb1 在mkfs后跟 . + 文件系统格式

[[email protected] ~]# mkfs.ext4 /dev/sdb

mke2fs 1.41.12 (17-May-2010)

/dev/sdb is entire device, not just one partition!

Proceed anyway? (y,n) y

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks

65536 inodes, 262144 blocks

13107 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=268435456

8 block groups

32768 blocks per group, 32768 fragments per group

8192 inodes per group

Superblock backups stored on blocks:

    32768, 98304, 163840, 229376

 

Writing inode tables: done                            

Creating journal (8192 blocks): done

Writing superblocks and filesystem accounting information: done

 

This filesystem will be automatically checked every 34 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.

 

8、挂载并查看

硬盘只有在挂载之后才能访问,挂载之前如果原来的路径/mnt/下有数据,在挂载之前不做任何操作,那么挂载之后查看挂载目录下的文件时,系统会遮挡掉原来存在的文件,这样原来的文件并不会被查看到,使用命令umount /mnt 卸载硬盘之后可以重新查看

[[email protected] ~]# ls /mnt/

[[email protected] ~]# cp /etc/passwd /mnt/

[[email protected] ~]# ls /mnt/

passwd

[[email protected] ~]# mount /dev/sdb1 /mnt/

[[email protected] ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda2        18G  2.2G   15G  13% /

tmpfs           931M     0  931M   0% /dev/shm

/dev/sdb1       107M  1.6M  100M   2% /mnt

[[email protected] ~]# ls /mnt/

lost+found

[[email protected] ~]# umount /mnt/

[[email protected] ~]# ls /mnt/

passwd

需要说明的是,如果不需要或者不对新添加的硬盘分区,可以跳过分区的步骤,直接进行格式化,挂载操作

 

9、不重启机添加新的硬盘

ls /sys/class/scsi_host/    查看主机总线号

echo "- - -" > /sys/class/scsi_host/host0/scan    重新扫描SCSI总线来添加设备

 

10、永久挂载磁盘的方法

方法一:

将挂载命令mount /dev/sdb /mnt写入/etc/rc.local中

[[email protected] ~]# vim /etc/rc.local  

[[email protected] ~]# cat vim /etc/rc.local

cat: vim: No such file or directory

#!/bin/sh

#

# This script will be executed *after* all the other init scripts.

# You can put your own initialization stuff in here if you don't

# want to do the full Sys V style init stuff.

 

touch /var/lock/subsys/local

mount /dev/sdb /mnt

 

方法二:(推荐使用)

第1步:编辑/etc/fstab文件

[[email protected] ~]# vim /etc/fstab

#

# /etc/fstab

# Created by anaconda on Fri Mar 23 14:44:05 2018

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

UUID=fb3deb8a-e2ad-4482-9f53-15c6a17ae84f  /          ext4     defaults            1 1

UUID=2b0d405c-7e29-4310-ae56-e6045feae03b swap      swap    defaults            0 0

tmpfs                                        /dev/shm  tmpfs   defaults           0 0

devpts                                       /dev/pts   devpts  gid=5,mode=620  0 0

sysfs                                         /sys       sysfs    defaults           0 0

proc                                          /proc      proc    defaults           0 0

说明:

第一列:指定硬盘设备名称/dev/sdb,也可以指定硬盘的UUID

建议:在实际中会随时加硬盘,盘符会改变,所以推荐使用UUID进行挂载,避免不必要的麻烦

第二列:指定挂载点

第三列:文件系统的类型

第四列:挂载的参数

第五列:是否备份    1

第六列:开机时是否检查磁盘fsck    1

第2步:将需要挂载的硬盘添加进去后执行命令mount –a    挂载成功

-a:将 /etc/fstab 中定义的所有档案系统挂上

mount -o  remount,rw  /mnt/sysimage

-o remount:将一个已经挂下的档案系统重新用不同的方式挂上

 

11、超过2T的硬盘分区方法

MBR类型的分区表最多支持2T的硬盘

parted解决分区超过2T的硬盘,用GPT类型的分区表

fdisk只支持MBR,需要w保存

parted    除了支持MBR,还支持GPT,立即生效

[[email protected] ~]# fdisk -l

 

Disk /dev/sda: 21.5 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 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: 0x00098b99

 

  Device Boot      Start         End      Blocks   Id  System

/dev/sda1               1         262     2097152   82  Linux swap / Solaris

Partition 1 does not end on cylinder boundary.

/dev/sda2   *         262        2611    18873344   83  Linux

 

Disk /dev/sdb: 3221.2 GB, 3221225472000 bytes

255 heads, 63 sectors/track, 391625 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: 0x00000000

 

12、使用parted进行分区的步骤

参数:

(parted) help

 align-check TYPE N                        check partition N for TYPE(min|opt)

       alignment

 check NUMBER                             do a simple check on the file system

 cp [FROM-DEVICE] FROM-NUMBER TO-NUMBER   copy file system to another partition

 help [COMMAND]                           print general help, or help on

       COMMAND

 mklabel,mktable LABEL-TYPE               create a new disklabel (partition

       table)

 mkfs NUMBER FS-TYPE                      make a FS-TYPE file system on

       partition NUMBER

 mkpart PART-TYPE [FS-TYPE] START END     make a partition

 mkpartfs PART-TYPE FS-TYPE START END     make a partition with a file system

 move NUMBER START END                    move partition NUMBER

 name NUMBER NAME                         name partition NUMBER as NAME

 print [devices|free|list,all|NUMBER]     display the partition table,

       available devices, free space, all found partitions, or a particular

       partition

 quit                                     exit program

 rescue START END                         rescue a lost partition near START

       and END

 resize NUMBER START END                  resize partition NUMBER and its file

       system

 rm NUMBER                                delete partition NUMBER#删除分区

 select DEVICE                            choose the device to edit

 set NUMBER FLAG STATE                    change the FLAG on partition NUMBER

 toggle [NUMBER [FLAG]]                   toggle the state of FLAG on partition

       NUMBER

 unit UNIT                                set the default unit to UNIT

 version                                  display the version number and

       copyright information of GNU Parted

parted /dev/sdb

第1步:mklabel gpt    创建分区表类型为gpt

第2步:创建一个分区mkpart,直接从%0回车,若要分多个区,则直接输入大小

[[email protected] ~]# parted /dev/sdb

GNU Parted 2.1

Using /dev/sdb

Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) mklabel gpt                                                                                                                    

(parted) mkpart                                                          

Partition name?  []? 1                                                    

File system type?  [ext2]?                                                

Start? 0%                                                                

End? 1000G                                                                

(parted) mkpart                                                      

Partition name?  []? 2                                                    

File system type?  [ext2]?                                                

Start? 1000G                                                              

End? 2000G                                                                

(parted) mkpart

Partition name?  []? 3                                                    

File system type?  [ext2]?                                                

Start? 2000G                                                              

End? 100%                                                                

(parted) P                                                                

Model: VMware, VMware Virtual S (scsi)

Disk /dev/sdb: 3221GB

Sector size (logical/physical): 512B/512B

Partition Table: gpt

 

Number  Start   End     Size    File system  Name  Flags

1      1049kB  1000GB  1000GB               1

2      1000GB  2000GB  1000GB               2

3      2000GB  3221GB  1221GB               3

可以非交互式分区,直接在命令行执行命令及所有参数,便于多台服务器批量分区

parted /dev/sdb mkpart a ext4 0% 200

第3步:格式化

mkfs.ext4 /dev/sdb

[[email protected] ~]# ls /dev/sd

sda   sda1  sda2  sdb   sdb1  sdb2  sdb3  

[[email protected] ~]# mkfs.ext4 /dev/sdb1        #中间过程省略

[[email protected] ~]# mkfs.ext4 /dev/sdb2        #中间过程省略

[[email protected] ~]# mkfs.ext4 /dev/sdb3        #中间过程省略

[[email protected] ~]# parted /dev/sdb

GNU Parted 2.1

Using /dev/sdb

Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) p                                                                

Model: VMware, VMware Virtual S (scsi)

Disk /dev/sdb: 3221GB

Sector size (logical/physical): 512B/512B

Partition Table: gpt

 

Number  Start   End     Size    File system  Name  Flags

1      1049kB  1000GB  1000GB  ext4         1

2      1000GB  2000GB  1000GB  ext4         2

3      2000GB  3221GB  1221GB  ext4         3

 

(parted) q                                                                

[[email protected]~]#

第4步:挂载使用

mount /dev/sdb /mnt

mount /dev/sdb /mnt

[[email protected] ~]# ls /mnt/

a  b  c

[[email protected] ~]# mount /dev/sd

sda   sda1  sda2  sdb   sdb1  sdb2  sdb3  

[[email protected] ~]# mount /dev/sdb1 /mnt/a

[[email protected] ~]# mount /dev/sdb2 /mnt/b

[[email protected] ~]# mount /dev/sdb2 /mnt/c

[[email protected] ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda2        18G  2.2G   15G  13% /

tmpfs           931M     0  931M   0% /dev/shm

/dev/sdb1       917G   72M  870G   1% /mnt/a

/dev/sdb2       917G   72M  870G   1% /mnt/b

/dev/sdb2       917G   72M  870G   1% /mnt/c

 

13、parted对MBR格式进行分区

第1步: parted /dev/sdb进入分区工具 ,mklabel创建分区表类型为msdos

第2步:创建一个分区mkpart,直接从%0回车,若要分多个区,则直接输入大小

[[email protected] ~]# parted /dev/sdb

GNU Parted 2.1

Using /dev/sdb

Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) mklabel msdos                                                                                                                  

(parted) mkpart                                                          

Partition type?  primary/extended? p                                      

File system type?  [ext2]?                                                

Start? 0%                                                                

End? 1000G                                                                

(parted) mkpart                                                      

Partition type?  primary/extended? p                                      

File system type?  [ext2]?                                                

Start? 1000G                                                              

End? 2000G                                                                

(parted) mkpart

Partition type?  primary/extended? p                                      

File system type?  [ext2]?                                                

Start? 2000G                                                              

End? 100%                                                                

(parted) p                                                                

Model: VMware, VMware Virtual S (scsi)

Disk /dev/sdb: 3221GB

Sector size (logical/physical): 512B/512B

Partition Table: msdos

 

Number  Start   End     Size    Type     File system  Flags

1      1049kB  1000GB  1000GB  primary  

2      1000GB  2000GB  1000GB  primary  

3      2000GB  3221GB  1221GB  primary

第3步:格式化(同上)

mkfs.ext4 /dev/sdb

第4步:挂载使用(同上)

mount /dev/sdb /mnt