02-Linux存储管理

第二章存储管理

2.1 parted磁盘分区

2.1.1 parted简介

parted是linux下大的磁盘分区管理工具。使用parted命令可以对分区进行建立、修改、调整等操作。此外,你还可以用来检查磁盘使用状况,在不同的磁盘间复制数据,将一个磁盘完整复制到另一个磁盘的操作。

parted是一个磁盘分区管理工具,它比fdisk更加灵活,功能也更丰富,同时还支持GUID分区表(GUID Partition Table)

全局唯一标识分区表(GUID Partition Table,缩写GPT)是一个实体硬盘分区表的结构布局的标准。它是统一可扩展固件接口标准的一部分,它使用全局唯一标识来标识设备。它是新一代分区表格式,用以替代MBR分区表。它用来解决MBR分区表的缺点。

在超过2TB时,不能使用传统的交互操作很好的fdisk命令,只能把磁盘转化为GPT格式。由于GPT格式的磁盘相当于原来MBR磁盘中原来保留4个par-tition table的4*16个字节只留第一个16个字节,其它的类似于扩展分区,真正的partition tble在512字节之后,所以对GPT磁盘表来讲没有四个主分区的限制。

GPT磁盘分区样式支持最大卷为128EB(Exabytes),理论上讲每块磁盘的分区数没有上限,只受到操作系统限制(由于分区表本身需要占用一定空间,在redhat/centos系统中每块磁盘可以分配128个分区。)

对GPT磁盘分区表进行操作,我们要使用parted命令。其实parted功能很强大,它可以像fdisk一样既可以命令行也可以用于交互式,除了能够进行分区的添加、删除等常见操作外,还可以移动分区,制作文件系统,调整文件系统大小,复制文件系统。

2.1.2 parted常用命令讲解

parted –help

选项:

-h, –help 显示此求助信息

-l, –list 列出所有块设备上的分区布局

-m, –machine 机器可解析的输出显示

-s, –script 从不提示用户

-v, –version 显示版本

-a, –align=[none|cyl|min|opt] 新分区的对齐方式

命令:

mklabel,mktable LABEL-TYPE 创建一个新的标识

mkpart PART-TYPE [FS-TYPE] START END 创建一个分区

name NUMBER NAME 名称分区编号

print [devices|free|list,all|NUMBER] 显示分区表,可用设备、可用空间、所有已找到的分区或特定分区

rm NUMBER 删除分区

select DEVICE 选择要编辑的设备

disk_set FLAG STATE 更改选定设备上的标志

disk_toggle [FLAG] 切换选定的标志状态

set NUMBER FLAG STATE 更改分区编号的标志

配置实例1

创建一个普通分区:

首先添加一块新的硬盘,然后用echo “- – -” > /sys/class/scsi_host/host0/scan命令扫描新设备,让操作系统识别新添加的硬盘。使用lsblk可以看到我们新添加的硬盘sdb。

使用parted给新添加的第二块硬盘sdb分区

parted /dev/sdb

GNU Parted 1.8.1

Using /dev/sdb

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

(parted) mklabel gpt #将MBR磁盘格式化为GPT

MBR:MBR分区表(即主引导记录)大家都很熟悉。所支持的最大卷2T,而且对分区有限制:最多4个主分区或3个主分区加一个扩展分区

GPT: GPT(即GUID分区表)。是源自EFI标准的一种较新的磁盘分区表结构的标准,是未来磁盘分区的主要形式。与MBR分区方式相比,具有如下优点。突破MBR4个主分区限制,每个磁盘最多支持128个分区。支持大于2T的分区,最大卷可达18EB.

(parted) mkpart primary 1 100 #划分一个起始位置为1大小为100M的主分区

(parted) mkpart primary 100 200 #划分一个起始位置为100M大小为100M的主分区

(parted) mkpart primary 0 -1 #划分所有空间到一个分区

忽略/Ignore/放弃/Cancel? i #提示下面警告,忽略继续即可输入i或者ignore

(parted) print #打印当前分区

(parted) quit #退出parted

分好区之后使用mkfs.xfs格式化

mkfs.xfs -f /dev/sdb1

格式化完成之后使用mount命令挂载使用。也可以使用umount卸载。

2.2 LVM卷管理

LVM是逻辑卷管理(LogicalVolumeManager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。通过LVM系统管理员可以轻松管理磁盘分区,如:将若干个磁盘分区连接为一个整块的卷组 (volumegroup),形成一个存储池。管理员可以在卷组上随意创建逻辑卷组(logicalvolumes),并进一步在逻辑卷组上创建文件系统。管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配,例如按照使用用途进行定义:"development"和"sales",而不是使用物理磁盘名"sda"和"sdb"。而且当系统添加了新的磁盘,通过LVM管理员就不必将磁盘的文件移动到新的磁盘上以充分利用新的存储空间,是直接扩展文件系统跨越磁盘即可。

LVM结构图如下:

Pv(物理卷) –vg(卷组) –lv(逻辑卷)

配置实例1

如果你的卷组中有空闲空间,可以直接扩大现有的逻辑卷,以扩大home为例。

lvextend –L 2G /dev/mapper/JUNXI-home

扩大逻辑卷之后需要整理文件系统,这里需要注意,如果你的逻辑卷文件系统类型是ext4的,使用resize2fs /dev/mapper/JUNXI-home命令调整文件系统大小。如果你的逻辑卷文件系统类型是xfs的使用 xfs_growfs /dev/mapper/JUNXI-home 命令扩大文件系统。

配置实例2

创建新的卷组并在新创建的卷组中创建新的逻辑卷

首先添加新的磁盘,然后给新添加的磁盘分区,把新的分区创建成物理卷,使用的命令是pvcreate /dev/sdb1。

创建好pv之后,创建卷组,使用的命令是vgcreate –s 32M leilei /dev/sdb1

-s 可以指定PE(PE(Physical Extents 物理块)是pv的基本单元,具有唯一编号的PE,是LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。物理卷的大小等同的基本单元PE组成。每个卷组最多有65535个PE, 默认是4MB的话,卷组大小可以这样计 4*65535)所以pe越大卷组越大,修改PE大小时须注意它是2的幂次方,目前单个PE最大为128。这样的话,卷组越多(最多65535),pe越小,磁盘利用就会率越高。

创建好卷组之后,创建逻辑卷,命令为lvcreate –L 4G –n web leilei

-L指定逻辑卷的大小, -n 指定逻辑卷的名称。

接下来格式化逻辑卷,命令为mkfs.xfs /dev/junxi/web

创建挂载点,mkdir /web

把逻辑卷挂载使用,mount /dev/junxi/web /web

df –T /dev/junxi/web 可以查看文件系统类型。

配置实例3

逻辑卷的动态缩小

缩小有风险,在工作中不建议缩小,xfs文件系统只支持扩大,不支持缩小,只有ext4的文件系统支持缩小。

缩小逻辑卷分以下几个步骤(注意先后顺序)

首先卸载逻辑卷,使用的命令为umount /dev/mapper/JUNXI-home

然后使用e2fsck –f /dev/mapper/JUNXI-home 命令检查分区

然后使用 resize2fs /dev/mapper/JUNXI-home 2G 命令把文件系统缩减到2G

最后使用 lvreduce –L 2G /dev/mapper/JUNXI-home 命令把逻辑卷缩减到2G

缩减完成之后使用mount –a 重新挂载测试。

2.3开机自动挂载

获取/dev/leilei/web 设备的uuid,使用的命令是 blkid。

然后编辑/etc/fstab

添加如下选项:

vi /etc/fstab

UUID="472b68d4-dea9-4ee1-880a-e943a0d9f834"/opt xfs defaults

0 0

mount -a #测试挂载

2.3 逻辑卷创建快照

创建快照的命令为 lvcreate –L 2G –n homes –s /dev/JUNXI-home

-L 指定创建快照的大小,-n 指定快照的名称,-s 给哪个逻辑卷做快照。

2.4 Lvm之数据迁移

日常运维当中,建议使用lvm作为磁盘管理的工具,在这里介绍两个linux磁盘管理的使用技巧使大家了解lvm的强大。

pv迁移

在机房中,通常都会有一些比较老旧的存储服务器,利用pv迁移可以在线将旧存储上的数据迁移到新存储上,避免硬件故障导致数据丢失。

配置实例:

需求:把/dev/sdb 中的数据迁移到/dev/sdc中。/dev/sdb属于database卷组。

首先添加一块新的磁盘作为迁移的目标,添加好磁盘之后使用pvcreate /dev/sdc命令把新添加的磁盘创建成pv。

然后把pv 加入到database卷组中,使用vgextend database /dev/sdc 命令。

使用pvs查看,确认/dev/sdc已经属于database卷组。

然后使用pvmove /dev/sdb1 /dev/sdc命令进行数据迁移,迁移过程中可以正常读写数据。

迁移完成之后,再使用pvs 查看,你会发现,/dev/sdc剩余空间为16G,而/dev/sdb 剩余空间为20G。证明数据迁移成功。

然后就可以把旧的设备移除,使用的命令是vgreduce database /dev/sdb1。

2.5.1 SSM管理工具管理lvm卷

只适用于rhel7 centos7系统。

LVM逻辑卷的管理

需求描述:

当我们需要在一个100G的磁盘中存储120G的数据时,空间不够用,这时我们应该怎么办?

一般方法时,重新分区或者是在购买一个大点磁盘

但是,在服务器中,这是不现实的,如果该磁盘上运行着非常重要的服务呢?

传统磁盘管理的限制,因为其不能够进行动态的磁盘管理。

这时就用到了我们的LVM逻辑卷

LVM(Logical volume Manager)是逻辑卷管理的简称。

它是Linux环境下对磁盘分区进行管理的一种机制。

现在不仅仅是Linux系统上可以使用LVM这种磁盘管理机制,

对于其它的类UNIX操作系统,以及windows操作系统都有类似与LVM这种磁盘管理软件。

LVM逻辑卷可以对磁盘的大小实现动态调整。

lvm 逻辑卷的原理:它就是通过将底层的物理硬盘进行封装,然后以逻辑卷的形式呈现给上层应用。

当我们对磁盘进行操作时,实际上不是对分区进行操作,而是通过一个叫做逻辑卷的东西对其进行底层磁盘的操作

PE(Physical Extend),我们的LVM磁盘管理中PE的默认大小是4M大小,其实PE就是我们逻辑卷管理的最基本单位。

比如说我有一个400M的硬盘,那么在将其格式化成PV的时候,其实际就是将这块物理硬盘划分成了100个的PE,因为PE默认的大小就是4M。

PV(Physical Volume),物理卷 ,作用就是用来装PE的,普通磁盘被分割成多个PE块,最终形成PV(物理卷)

VG即卷组 作用就是用来装PV的,我们可以把一个或者多个PV加到VG当中

LV(Logical Volume),就是基于VG来创建我们最终要使用的LV。

2.5.2 SSM管理工具的使用

系统存储管理器(system-storage-manager) SSM ,是RHEL7新增加的功能,它是一种可以管理格式格式存储设备的命令。目前,有三种可以供SSM使用的卷管理后端:LVM、brtfs和crypt。

现在源里查找有没有这个安装包,如果有直接安装

安装ssm系统存储管理器 yum -y install system-storage-manager.noarch

使用ssm list命令检查关于可用硬驱和lvm卷的信息。这个命令将显示关于现有磁盘存储设备、存储池、LVM卷和存储快照的信息。以下输出结果是CentOS 7,自定义的LVM和XFS文件系统信息。

在这个实例中,有1物理设备/dev/sda、一个存储池(“JUNXI”),以及存储池中创建的3个LVM卷(“/dev/JUNXI/swap” “/dev/JUNXI/root” “/dev/JUNXI/home”)。

ssm list dev 或者 ssm list devices #显示设备

ssm list pool #显示卷组

ssm list vol 或者 ssm list volumes #则是只显示逻辑卷

将物理磁盘添加到LVM池不妨将一个新的物理磁盘(比如/dev/sdb)添加到现有的存储池JUNXI。将新的物理磁盘添加现有存储池的命令如下:

ssm add -p <pool-name> <device>

移除磁盘的命令是不需要加-p选型的

ssm remove <pool-name> <device>

首先给新设备分区

现在从传统的BIOS+MBR模式升级到UEFI+GPT模式,现在购买的主流服务器,为了更好的支持大于2TB硬盘,预装系统都采取了GPT分区的格式,并且主板bios支持UEFI启动。(UEFI统一扩展固件接口)

BIOS Basic Input/Output System,翻译成中文是“基本输入/输出系统”,是一种所谓的“固件”,负责在开机时做硬件启动和检测等工作,并且担任操作系统控制硬件的中介角色。

因为硬件发展迅速,传统式(Legacy)BIOS 成为进步的包袱,现在已经发展最新的UEFI(Unified Extensible Firmware Interface)统一可扩展固件接口,相比传统BIOS的来说,这将是一个“没有特定BIOS”的电脑时代

bios+mbr msdos 4个主分区 ext4 单个最大文件16TB 单个最大分区1EB

uefi+gpt gpt 不受限制 xfs 单个最大文件容量9EB 单个最大分区18EB

但是收到操作系统限制(由于分区表本身需要占用一定空间,最初规划硬盘分区时,留给分区表的空间决定了最多可以有多少分区目前linux128个)

XFS 是一个全64-bit的文件系统,它可以支持上百万T字节的存储空间。对特大文件及小尺寸文件的支持都表现出众,支持特大数量的目录。最大可支持的文件大小为263 = 9 x 1018 = 9 exabytes,最大文件系统尺寸为18 exabytes。他是取代ext4的下一代文件系统。

ssm list pools 查看卷组

ssm list dev 查看分区

ssm list vol 查看逻辑卷

创建一个分区sda3

parted /dev/sda

pvcreate /dev/sda3 创建Pv

通过ssm工具管理

ssm add -p JUNXI /dev/sda3 把pv添加JUNXI 的卷组中

ssm remove /dev/sda3 #把pv移除出JUNXI的卷组

ssm remove web #删除卷组

2.5.3扩大逻辑卷

扩大之前要保证JUNXI卷组中有空闲空间

ssm resize -s +2G /dev/mapper/JUNXI-home 扩大逻辑卷/减小逻辑卷

这并不意味着你立即就可以使用在卷中创建的文件系统里面增加的额外空间。你会发现,文件系统大小(“FS size”)仍然是3.99GB。为了让文件系统识别增加后的卷大小,你需要“扩大”现有的文件系统本身。有不同的工具可用来扩大现有的文件系统,这取决于你使用哪种文件系统。比如说,有面向EXT2/EXT3/EXT4的resize2fs、面向XFS的xfs_growfs以及面向Btrfs的btrfs,不一而论。

由于在centos7 中。XFS文件系统在默认情况下创建。因而,我们使用xfs_growfs来扩大现有的XFS文件系统。

扩大XFS文件系统后,核实文件系统完全占用了整个磁盘卷的5.99G,

方法如下:

xfs_growfs /dev/JUNXI/home

2.5.4 收缩lvm逻辑卷

缩小/home分区,resize 选后跟一个绝对值即可lvm就会调整到固定大小。目前xfs文件系统无法实现。只有ext4文件系统可以收缩。

ssm resize -s 3G /dev/JUNXI/home

2.5.5创建新卷组并格式化

在这个示例中,如何在物理磁盘驱动器上创建新的存储池和新的LVM卷。如果使用传统的LVM工具,整个过程相当复杂,需要准备分区,需要创建物理卷、卷组、逻辑卷,最后还要建立文件系统。不过,若使用ssm,整个过程就一蹴而就!

下面这个命令的作用是,创建一个名为dbs的存储池(卷组vg),在卷组中创建名为web大小为500MB的LV逻辑卷,使用XFS文件系统格式化卷,并将他挂载到/mnt/test下。立即就能领略到ssm的强大功能。

pvcreate /dev/sdb2 #添加新的分区,并创建成pv。

mkdir /mnt/test

ssm create -s 500M -n web –fstype xfs -p dbs /dev/sdb2 /mnt/test

-p 卷组名 -n 逻辑卷名 –s 大小 –fstype 文件系统类型。

实例讲解:ssm创建新的卷组dbs,并在新卷组中创建新逻辑卷web,完成各式化将其挂载到/mnt/目录下

ssm create -s 1G -n web –fstype xfs -p dbs /dev/sdb1 /mnt/。

实例讲解:创建新的逻辑卷web2格式化,并挂载到/opt目录下。

ssm create -n web2 -s 1G -p dbs –fstype xfs /opt/

ssm remove /dev/dbs/web2 #删除逻辑卷

2.5.6移除卷组的方法,首先要卸载挂载的设备。

umount /mnt/test/

ssm remove dbs #移除卷组即可,是不是很简单

2.5.7ssm管理lvm快照

使用ssm工具,你还可以对现有的磁盘卷拍取快照。注意:只有含有卷的后端支持快照机制,快照才适用。LVM后端支持联机快照功能,这意味着我们没必要在离线状态下对卷拍取快照。另外,由于ssm的LVM后端支持LVM2,快照具有读取/写入功能。

ssm snapshot -s 1G /dev/abc/web -n abc #为逻辑卷web创建快照名为abc,如果不制定名称与大小的话会产生随机快照名。-s指定快照大小 –n指定快照的名字。

ssm snapshot /dev/JUNXI/home

ssm list snapshots 或者 ssm list snap #查看当前卷组快照

ssm snapshot /dev/JUNXI/home #创建快照

储快照后,你可以删除原始卷,并挂载快照卷,以访问快照中的数据。

使用umount /home/ 卸载原始卷

使用mount /dev/JUNXI/snap20151021T224228 /home/ 挂载快照

删除LVM卷

删除现有的磁盘卷或存储池就跟创建磁盘卷或存储池一样容易。如果你试图删除已挂载的卷,ssm会自动先将它卸载。这方面没有麻烦。

删除LVM卷

ssm remove <volume>

想删除存储池(卷组):

ssm remove <pool-name>

至此应领略了ssm的强大功能。在企业存储环境中,处理一大批的存储设备、磁盘卷和文件系统是相当常见的事。现在你可以运用单单一个命令行工具ssm,让其后端为你完成任务,而不是操心运用许多不同的工具管理一整套存储配置。对任何置身于复杂存储管理环境的系统管理员来说,ssm绝对是一款必备工具。

Lvm常见故障排除:

很多新手学员在添加一个pv到vg后,误删新加入的pv,报 pv * not found or rejected by a filter错误。

使用lvdisplay报警告

[root@localhost ~]# lvdisplay 或 vgscan

WARNING: Device /dev/xvdb1 has size of 6291456 sectors which is smaller than corresponding PV size of 20969472 sectors. Was device resized?

One or more devices used as PVs in VG cl have changed sizes.

PV Name [unknown] #这里显示未知说明有问题

解决方法如下

方法1:从lvdisplay那里我们可以推测,vg有问题

所以我们来看一下卷组有哪些

可以看到vgs,vgscan都可以用来检查vg,其中vgremove和vgreduce和删除和缩减选项,所以我们重点关注vgreduce命令

尝试用removemissing选项删除错误信息 cl为卷组名称

vgreduce –removemissing cl

重启系统 再次使用vgdisplay可以恢复正常

方法2: 把卷组中报错的uuid复制出来 再次添加一个新的分区 在创建pv时指定uuid为丢失报错uuid "iUJdjw-C9S6-bRE7-jIdl-6kQ6-esLL-5vDGYE" 如下/dev/sdb1所示:

pvcreate /dev/sdb1 –u iUJdjw-C9S6-bRE7-jIdl-6kQ6-esLL-5vDGYE –norestorefile

也可以恢复正常

2.6 扩展swap分区

swap分区是虚拟内存对swap消耗比较大的应用有很多,例如:web服务器 数据库服务器 虚拟化与云计算等。运维有时需要对swap进行扩展的操纵。

首先使用free –m 查看我系统中swap分区的大小。

扩大swap分区的方法有两种,一种是以分区的方式扩大swap分区,一种是以镜像文件的方式扩大swap分区。首先介绍第一中方法:

需要有一个分区,来扩大swap分区的大小。创建好分区之后,使用mkswap命令格式化新的分区

mkswap /dev/sdb1

使用swapon /dev/sdb1 命令开启/dev/sdb1 swap分区,开启之后使用free –m 查看swap 分区的大小

也可以使用swapoff /dev/sdb1关闭。

可以使用cat /proc/swaps 查看新的分区启动情况。

如果想开机自动挂载的话需要编辑/etc/fstab中添加如下内容

/dev/sdb1 swap swap defaults 0 0

第二中扩大swap分区的方法:

因为服务器在某些特殊状态下不能再添加新的分区。也可以镜像文件的方式来添加swap分区。

先使用dd 命令创建一个大小为2G的镜像文件

dd if=/dev/zero of=/home/swap bs=2048MB count=1

镜像文件创建在/home/下,名称为swap,bs=2048M 一次写入2048MB,count=1只写一次,镜像文件的大小是2G。

创建好镜像文件之后把它格式化为swap文件系统类型。用mkswap /home/swap 命令,然后激活swap分区,使用swapon /home/swap。使用free –m查看swap的大小。

这里提到一个镜像文件,那什么是镜像文件?镜像文件是一种稀疏文件,在unix文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成空洞。位于文件中但没有写过的字节都被设为0。如果offset比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”在文件里创建“空洞(hole)”。没有被实际写入文件的所有字节由重复的0表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。

2.7 Loop设备及losetup命令讲解

losetup命令用于循环设备。

循环设备可把文件虚拟成区块设备,籍以模拟整个文件系统,让用户得以将其视为硬盘驱动器,光驱或软驱等设备,并挂入当作目录来使用。

Loop设备介绍

在类unix系统里,loop设备是一种伪设备(pseudodevice),或者也可以说是仿真设备。它能使我们像块设备一样访问一个文件。

在使用之前,一个loop设备必须要和一个镜像文件进行连接。这种结合方式给用户提供了一个替代块特殊文件的接口。因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被mount起来。

在上面说的文件格式,我们经常见到的是CD或DVD的ISO光盘镜像文件或者是软盘(硬盘)的*.img镜像文件。通过这种loop mount(回环mount)的方式,这些镜像文件就可以被mount到当前文件系统的一个目录下。

Loop的含义

对于第一层文件系统,它直接安装在我们计算机的物理设备之上;而对于这种被mount起来的镜像文件(它引入包含有文件系统),它是建立在第一层文件系统上,这样看来,它就像是在第一层文件系统之上再绕了一圈的文件系统,所以称为loop。或者叫二层伪设备。

losetup命令讲解

losetup [-d][-e <加密方式>][-o <平移数目>][循环设备代号][文件]

参数:

-d 卸除设备

-e<加密方式> 启动加密编码

-o<平移数目> 设置数据平移的数目

使用dd命令创建一个镜像dd if=/dev/zero of=/twoing.img bs=1024MB count=2

bs=1024MB一次读写1024G ,count=2一共读写两次。所以是2G镜像文件。

用dd创建好镜像文件后,使用losetup /dev/loop0 /twoimg.img命令将创建的镜像文件映射成loop0。映射成功之后可以使用losetup –a命令查看映射关系。

要想挂载使用,需要格式化,命令为mkfs.ext4 /dev/loop0 。格式化完成之后在centos7系列的操作系统中,它会自动被挂载。我们也可以手动挂载到自己指定的目录中。

如下所示为手动挂载到自己指定的/mnt目录中:

[root@192 ~]# losetup /dev/loop0 /swaps

[root@192 ~]# losetup

NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE

/dev/loop0 0 0 0 0 /swaps

[root@192 ~]# mount /dev/loop0 /mnt/

[root@192 ~]# df -h /mnt/

文件系统 容量 已用 可用 已用% 挂载点

/dev/loop0 2.0G 6.1M 1.8G 1% /mnt

[root@192 ~]# umount /mnt/

[root@192 ~]# losetup

NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE

/dev/loop0 0 0 0 0 /swaps

[root@192 ~]# losetup -d /dev/loop0

[root@192 ~]# losetup

如果不使用了可以用umount /mnt (/mnt为挂载点) 卸载伪设备。然后用losetup -d /dev/loop0 命令关闭镜像映射。

2.8 dd命令详解

dd与cp的区别

dd:块界别拷贝

cp:文件目录界别拷贝

dd将原始数据(raw data)按照数据源的格式原封不动的拷贝到目的地;cp将文件和目录拷贝到目的地后按照目的地的格式排列新数据。注意:对于不能以文件或目录格式呈现的数据(如引导启动块的数据),cp无能为力。

2.8.dd命令选项注解

dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。注意:指定数字的地方若以下列字符结尾则乘以相应的数字:b=512;c=1;k=1024;w=2

参数:

1. if=文件名:输入文件名,缺省为标准输入。

2. of=文件名:输出文件名,确定缺省为标准输出。即指定目的文件。

3. ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。

obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。

bs=bytes:同时设置读入/输出的块大小为bytes个字节。

4. cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。

5. skip=blocks:从输入文件开头跳过blocks个块后再开始复制。

6. seek=blocks:从输出文件开头跳过blocks个块后再开始复制。

注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。

7. count=次数:copy几次以bs为单位。

8. conv=conversion:用指定的参数转换文件

ascii:转换ebcdic为ascii

ebcdic:装换ascii为ebcdic

ibm:装换ascii为alternate ebcdic

block:把每一个转换为长度为cbs,不足部分用空格填充

unblock:使每一行的长度都为cbs,不足部分用哪个空格填充

lcase:把大写字符转换成小写字符

ucase:把小写字符装换成大写字符

swab:交换输入的每对字节

noerror:出错是不停止

notrunc :不截短输出文件

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

2.9 dd应用实例

1、将本地的/dev/sda整盘备份到/dev/sdb

dd if=/dev/sda of=/dev/sdb conv=notrunc,noerror

noerror出错时不停止 notrunc:不间断输出文件

2、将/dev/sdb全盘数据备份到指定路径的image文件

dd if=/dev/sdb of=/root/image

3、将备份文件恢复到指定盘

dd if=/root/image of=/dev/sdb

4、备份/dev/sdb全盘数据,并利用gzip工具进行压缩,保存到指定路径

dd if=/dev/sdb | gzip > /root/image.gz

5、将压缩的备份文件恢复到指定盘

gzip -dc /root/image.gz | dd of=/dev/sdb

6、备份磁盘开始的512个字节大小的MBR信息到指定文件

dd if=/dev/sda of=/root/image count=1 bs=512

count=1指仅拷贝一个块bs=512指块大小为512个字节

恢复:dd if=/root/image of=/dev/sda

7、拷贝内存内容到硬盘

dd if=/dev/mem of=/root/mem.bin bs=1024(指定块大小为1 K)

8、拷贝光盘内容到指定文件夹,并保存为cd.iso文件

dd if=/dev/sr0 of=/root/cd.iso bs=1024

9、销毁磁盘数据

dd if=/dev/urandom of=/dev/sda1

注意:利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。

10、测试硬盘的读写速度

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

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

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

14、修复硬盘:

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

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

15、把分区制作成镜像裸设备予以KVM虚拟机转移

dd if=/dev/VolGroup00/lv001 of=lv001.img bs=1M

16、测试磁盘读能力

time dd if=/dev/sdb1 of=/dev/null bs=8k

因为/dev/sdb1是一个物理分区,对它的读取会产生IO,/dev/null是伪设备

相当于黑洞,of到该设备不会产生IO,所以,这个命令的IO只发生在/dev/sdb1

上,也相当于测试磁盘的读写能力。

测试同时读写能力

time dd if=/dev/sdb1 of=/test1.dbf bs=8k

这个命令一个是物理分区,一个是实际的文件,对它们的读写都会产生IO(对/dev/sdb1是读。对/test1.db是写),假设他们都在一个磁盘中,这个命令就相当于测试磁盘的同时读写能力。

得到最恰当的block.size,通过比较dd指令输出中所显示的命令执行时间(选时间最少的那个),即可确定系统最佳的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

2.10 lusk加密卷

2.10.1 luks简介

LUKS(Linux Unified Key Setup)为Linux硬盘加密提供了一种标准工具cryptsetup(centos与RHEL 默认已经安装。Debian/ubuntu 需另行安装,安装命令为aptitude install cryptsetup libcryptsetup-dev)

常用参数:luksFormat、luksOpen、luksClose、luksAddKey

使用cryptsetup对分区进行了加密后,这个分区就不再允许直接挂载。LUKS也是一种基于device mapper 机制的加密方案。如果要使用这个分区,必须对这个分区做一个映射,映射到/dev/mapper这个目录中,我们只能挂载这个映射设备才能使用。然而做映射的过程中需要输入解密密码。
首先,你将需要确认安装cryptsetup软件包,如果没有安装可以使用yum install cryptsetup命令进行安装。

配置实例1

使用ssm工具配置luks磁盘加密。在JUNXI卷组中创建一个大小为1G的luks加密卷组,并挂载到/opt下。

ssm create -s 1G -n luks -p junxi –fstype xfs –encrypt luks /opt/

C:\Users\李雪蕾\Documents\Tencent Files\1547462309\Image\C2C\{B4EE279B-4D69-1533-7360-2D9BA0AB9924}.png

也可以手动挂载luks加密设备,先把设备卸载,使用umount /opt

然后使用命令cryptsetup luksOpen /dev/JUNXI/luks open 映射加密设备为open。

然后挂载设备 mount /dev/mapper/open /opt

卸载加密设备的方法

[root@localhost ~]# umount /opt/

关闭映射设备

[root@localhost ~]# cryptsetup luksClose /dev/mapper/open

配置实例2

使用cryptsetup工具一步一步创建磁盘加密(这种方法适用于centos6之前版本的系统,centos7建议使用ssm创建磁盘加密)

必须首先对加密的卷进行解密,才能进行挂载文件系统
(1) dd if=/dev/zero of=/luks.img bs=1G count=1 #创建伪设备

losetup /dev/loop0 /luks.img #把镜像映射成块设备

(2)cryptsetup luksFormat /dev/loop0 #格式化加密层(提示大写的YES并输入密码)


(3) cryptsetup open /dev/loop0 junxi    #开启加密层(设置虚拟设备名为junxi)

(4)ll /dev/mapper/junxi #查看加密的虚拟设备
lrwxrwxrwx. 1 root root 7 4月 29 00:12 /dev/mapper/junxi -> ../dm-5

(5)mkfs.xfs /dev/mapper/junxi  #格式化虚拟设备

(6)mount /dev/mapper/junxi /opt/ #挂载虚拟加密设备

[root@node1 ~]# df -h /opt/

文件系统 容量 已用 可用 已用% 挂载点

/dev/mapper/junxi 1019M 33M 987M 4% /opt


(7) touch /opt/files-{1..10} #使用加密设备
(8) umount /opt/ #卸载设备
(9) cryptsetup close junxi  #关闭加密虚拟设备(/dev/mapper/下不会查看到junxi虚拟设备)

(10)losetup -d /dev/loop0 #关闭映射
(11)
注意:以后使用就需要进行open打开进行读写操作,结束之后使用close进行关闭。

自动挂载加密设备,下例中是使用分区的方法创建加密分区。

例:

lvcreate -L 4G -n luks junxi #创建逻辑卷lusk

aptitude install cryptsetup libcryptsetup-dev #debian8安装cryptsetup

cryptsetup luksFormat /dev/junxi/luks #格式化成加密设备

WARNING!

========

This will overwrite data on /dev/loop0 irrevocably.

Are you sure? (Type uppercase yes): YES #此处必须为大写YES

Enter passphrase: #输入8位长度密码,密码无回显

Verify passphrase: #输入8位长度密码,密码无回显

Cannot format device /dev/loop0 which is still in use.

如果你的实验环境是centos7系统此处会弹出的密码框,如下图需要点击取消(Cancel)。否则centos7会自动挂载。

开启加密层(根据应用命名为web)

cryptsetup open /dev/junxi/luks web

格式化加密设备

mkfs.xfs /dev/mapper/web

格式化完成之后可以使用 mount /dev/mapper/web /mnt/命令挂载并访问加密设备

用touch命令创建文件进行测试touch /mnt/files{1..10}

最安全的密码是什么? 是连管理员自己都不知道的密码。使用/dev/random创建的随机密码是一个不错的选择。

/dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流。很多解密程序与安全应用程序(如SSH Keys,SSL Keys等)需要它们提供的随机数据流。

首先生成一个4096比特的随机二进制密码并重复10次,文件名为/root/passwd

dd if=/dev/random of=/root/passwd bs=4096 count=10

编辑/etc/crypttab配置文件。
# vim /etc/crypttab

打开后的卷名 原设备名 密钥文件 加密选项

# <target name> <source device> <key file> <options>

web /dev/junxi/luks none #(注:none表示密码为空) luks

或者自动应答密码,none的部分添加密码文件绝对路径/root/passwd:

# <target name> <source device> <key file> <options>

web /dev/junxi/luks /root/passwd luks

调整密钥文件权限

chmod 600 /root/passwd

在设备中添加key文件,使用密码文件生效。

cryptsetup luksAddKey /dev/junxi/luks /root/passwd

下面设置开机自动挂载:

# vim /etc/fstab
/dev/mapper/web /mnt xfs defaults 0 0


#reboot #重新启动系统

cryptsetup status /dev/mapper/junxi #查看加密状态