磁盘和移动存储常用命令

2022-09-28 20:27:20 浏览数 (2)

  1. [TOC]
0x00 快速入门

描述:主要针对于硬盘进行挂载/格式化、查看等等的命令;

挂载命令:相当于win中的分配盘符,只不过linux中叫挂载,查询与自动挂载。

硬盘分区与格式化概述 总结:主分区(primary partition)和扩展分区(extended partition)总是不能超过4个,扩展分区只有一个/扩展分区不能直接存储数据,最好是保持原有的Disk,添加新的Disk.

@在Vmware中添加硬盘(注:必须power off,因为VM不支持热启动) 编辑虚拟机 > 添加硬盘 > 创建新虚拟磁盘 > SCSI(接口)

MBR分区与GPT分区的差异:

  • 分区模式之MBR:主分区不超过4个 / 单个分区容量最大2TB
  • 分区模式之GPT:主分区个数『几乎』没有限制单个分区容量『几乎』没有限制但,GPT主分区中不适合安装X86构架的系统

磁盘大小转换: 1 EB = 1024 PB = 1024X1024 TB = 1024x1024X1024 GB

0x01 磁盘查看与挂载
blkid 命令

描述:查看当前分区的文件系统(xfs、ext2/3/4)格式,是定位或打印块设备属性的命令行实用工具。

它利用 libblkid 库在 Linux 系统中获得到磁盘分区的 UUID。

实际案例:

代码语言:javascript复制
$ blkid
/dev/vda1: UUID="59d9ca7b-4f39-4c0c-9334-c56c182076b5" TYPE="ext4"

$ blkid /dev/vda1
/dev/vda1: UUID="59d9ca7b-4f39-4c0c-9334-c56c182076b5" TYPE="ext4"
lsblk 命令

描述: lsblk命令用于列出所有有关可用或指定块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息;它还会进行命令读取 sysfs 文件系统和 udev 数据库以收集信息。

块设备有硬盘,闪存盘,cd-ROM

lsblk命令包含在util-linux-ng包中,现在该包改名为util-linux是生成UUID的包;

代码语言:javascript复制
yum instakk util-linux   #centos
sudo yum install util-linux-ng #Fedora

#参数
-a, --all            显示所有设备。
-b, --bytes          以bytes方式显示设备大小。
-d, --nodeps         不显示 slaves 或 holders。
-D, --discard        print discard capabilities。
-e, --exclude <list> 排除设备 (default: RAM disks)。
-f, --fs             显示文件系统信息。
-h, --help           显示帮助信息。
-i, --ascii          use ascii characters only。
-m, --perms          显示权限信息。
-l, --list           使用列表格式显示。
-n, --noheadings     不显示标题。
-o, --output <list>  输出列。
-P, --pairs          使用key="value"格式显示。
-r, --raw            使用原始格式显示。
-t, --topology       显示拓扑结构信息。

实际示例:

代码语言:javascript复制
#示例1.显示系统中的磁盘硬件设备挂载点
$lsblk
# NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
# sda               8:0    0   40G  0 disk
# ├─sda1            8:1    0    1G  0 part /boot
# └─sda2            8:2    0   39G  0 part
#   ├─centos-root 253:0    0   37G  0 lvm  /
#   └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
# sr0              11:0    1  4.5G  0 rom
NAME:这是块设备名。
MAJ:MIN:本栏显示主要和次要设备号。
RM:本栏显示设备是否可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备。
SIZE:本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB。
RO:该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。
TYPE:本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。
MOUNTPOINT:本栏指出设备挂载的挂载点。


#示例2.显示所有磁盘和不显示标题并以列表方式打印
$lsblk -aln
vda  253:0    0  40G  0 disk
vda1 253:1    0  40G  0 part /


#示例3.指定打印的列
$lsblk -o name,mountpoint,size,uuid
NAME            MOUNTPOINT  SIZE UUID
sda                          40G
|-sda1          /boot         1G b379c221-7e3d-42ff-b5ae-bf1d2dfe9ffb

注意事项:

  • 如果udev 数据库不可用或者编译的 lsblk 不支持 udev,它会试图从块设备中读取卷标、UUID 和文件系统类型
    • 这种情况下必须以 root 身份运行,该命令默认会以类似于树的格式打印出所有的块设备(RAM 盘除外)。
df 命令

描述:查看磁盘分区的使用状况;

代码语言:javascript复制
#语法
df [选项]
-l 仅显示本地磁盘(默认)
-a 显示所有文件系统的磁盘使用情况,包含比如/proc/
-h 以1024进制计算最合适的单位显示磁盘容量(以人类方式展现)
-H 以1000进制计算最合适的单位显示磁盘容量
-T 显示磁盘分区类型
-t 显示指定类型文件系统的磁盘分区,如df -t ext4
-x 不显示指定类型文件系统的磁盘分区

实际案例:

代码语言:javascript复制
#示例1.查看本地磁盘信息已显示分区类型
df -alhT
# Filesystem     Type      Size  Used Avail Use% Mounted on
# /dev/vda1      ext4       43G  5.4G   35G  14% /
# devtmpfs       devtmpfs  953M     0  953M   0% /dev
# tmpfs          tmpfs     964M     0  964M   0% /dev/shm

#示例2.显示指定类型和不显示指定类型
df -t xfs #显示指定分区类型的磁盘
df -x tmpfs

WeiyiGeek.示例2.

du 命令

描述:统计磁盘上的文件大小 基础语法:

代码语言:javascript复制
du 【选项】

#选项:
-b 以byte为单位统计文件
-k 以KB为单位统计文件 (DEFAULT)
-m 以MB为单位统计文件
-h 按照1024进制以最合适的单位统计文件
-H 按照1000进制以最合适的单位统计文件
-s 指定统计目标,如du -s ~/desktop,可以查看destop目录的大小

实际案例:

代码语言:javascript复制
#示例1.指定目录显示大小
du -s /home
du -sm /home #以兆为单位

#示例2.统计目录中文件的大小(默认是KB)
$du -h Github/

#实例3.指定深度i检测并显示其大小
du -h --max-depth=1 webapp/
/nfs/data$ du -h --max-depth=1 *
  # 4.0K    archived-log-efk-weblog-web-0-pvc-ae27452b-94fc-4423-8f9a-df9cca49ef63
  # 4.0K    archived-log-efk-webroot-web-0-pvc-73e2be1e-6657-4adc-bccf-9e90e947dac9
  # 610M    default-elasticsearch-master-elasticsearch-master-0-pvc-8a991669-60c0-48c6-9879-5b4fa9d481c3/nodes
  # 610M    default-elasticsearch-master-elasticsearch-master-0-pvc-8a991669-60c0-48c6-9879-5b4fa9d481c3
ncdu 命令

描述:它是基于ncurses库开发的,因此还支持很多丰富的交互式命令; ncdu命令是对传统du命令功能上的增强(替代du命令的工具),不需要像du那样输入大量的命令,就可以计算文件及目录大小并可以按照大小或文件名进行排序;它还提供了许多操作文件和文件夹的选项-导航,排序甚至删除:

安装ncdu:

代码语言:javascript复制
$yum install ncdu

基础语法(使用贴近VIM):

代码语言:javascript复制
# 按钮功能
up,k - 用于向上移动光标
down,j - 用于向下移动光标
右键,l> - 打开所选目录
left,<,h - 这将打开父目录
c - 切换子项目计数的显示
e - 显示/隐藏隐藏或排除的文件
n - 按名称排序(再次按降序排列)
m - 切换最新时间显示(-e标志)
s - 按文件大小排序(再次按降序排列)
d - 删除所选文件或目录
g - 显示百分比和/或图表
t - 排序时在文件之前切换dirs
b - 当前目录中的Spawn shell
i - 显示有关所选项目的信息
r - 刷新/重新计算当前目录
q - 退出ncdu

# 文件大小参数
一个整数和可选的单元(例如:10K是10 * 1024)。单位是`K,M,G,T,P,E,Z,Y(1024功率)或KB,MB,...`(1000功率)。

基础实例:

代码语言:javascript复制
$ncdu 1.14.2 ~ Use the arrow keys to navigate, press ? for help
--- /root 
    1.5 MiB [ 88.9% ##########] /.cache
  116.0 KiB [  6.7%           ] /.nvm
   24.0 KiB [  1.4%           ]  .bash_history
   12.0 KiB [  0.7%           ]  .viminfo
    4.0 KiB [  0.2%           ]  anaconda-ks.cfg
mount 命令

描述:用于加载文件系统到指定的加载点。 此命令的最常用于挂载cdrom,使我们可以访问cdrom中的数据,因为你将光盘插入cdrom中,Linux并不会自动挂载,必须使用Linux mount命令来手动完成挂载。

基础语法:

代码语言:javascript复制
# 命令格式:
mount【-t 文件系统】【-o 特殊选项】设备文件名 挂载点
-t 文件系统 加入文件系统类型来指定挂载的类型,可以ext3,ext4,iso9660等文件系统
-o 特殊选项 可以指定挂载的额外选项有各种参数,可多个一起,用逗号隔开特别看下这个exec/noexec,代表执行/不执行,设定是否允许在文件系统中执行可执行文件,默认是exec文件

# 选项参数
-V:显示程序版本;
-l:显示已加载的文件系统列表;
-h:显示帮助信息并退出;
-v:冗长模式,输出指令执行的详细信息;
-n:加载没有写入文件“/etc/mtab”中的文件系统;
-r:将文件系统加载为只读模式;
-a:加载文件“/etc/fstab”中描述的所有文件系统。

_ 实际案例:_

代码语言:javascript复制
#示例1.查看挂载的路径
$ mount
$ df | mount -l | cat /etc/mtab   #都可以查看挂载
# sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
# proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
# devtmpfs on /dev type devtmpfs (rw,nosuid,size=930560k,nr_inodes=232640,mode=755)
# securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
# 显示的都是~ on ~ type ~这样的结构
# - 如/dev/sda5 on / type ext4 (rw)
# - 其中sda5代表第一块SATA硬盘的第五个分区,/代表这是根分区,ext4代表文件系统是ext4,权限是读写;
# - 类似的/dev/sda1 on /boot type ext4 (rw)代表第一块SATA硬盘的第一个分区是boot分区,文件系统是ext4权限是读写


#示例2.自动类型挂载/dev/crdom到/mnt/cdrom
$ mount -t auto /dev/cdrom /mnt/cdrom  #/mnt/cdrom目录不存在,需要先创建。

#示例3.挂载指定格式的U盘有的是NTFS格式
mount -t vfat /dev/sdb1 /mnt/usb       # 挂载U盘,再次申明sdb1不是固定的,这里的vfat指的是win中的FAT32
mount -t nfs 192.168.1.1:/nfs /files   # NFS 挂载
mount -t swap
mount -t cifs
mount -t iso9660

#示例4.重新生效将/etc/fstab中的配置重新挂载(自动生效)
mount -a # 手动重新挂载 /etc/fstab 文件中的分区
#/,/boot,/home,swap这些分区都在文件里,所以系统才会在每次开机时自动挂载这些分区.
#Tips:手动挂载的分区不是永久的,一关机重启就没有了.分区默认挂载目录是/mnt,挂载点必须先存在
echo "/dev/sdb1 /nfs-file ext4 defaults 0 0" >> /etc/fstab
设备名称   挂载目录  文件系统  挂载参数(rwx) 备份信息  启动顺序      #注意后面的数字修改成0 0含义是服务器在启动的时候就会检测磁盘是否正常
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/sdb /mnt/imooc ext3 defaults 0 0                               #在末尾添加(注意目录必须存在)
UUID=b379c221-7e3d-42ff-b5ae-bf1d2dfe9ffb /boot   xfs  defaults 0 0 #将UUID的设备开机自动挂载到/boot上
/dev/hda1  /   ext3   errors=remount-ro   0 1                       #
192.168.172.65:/files /mnt/share  cifs defaults,username=test,password=test 0 0


#示例5.额外权限指定远程本地以及是否可执行,以及权限挂载
mount -o remount,noexec /home/       #表示重新挂载/home分区,并且不允许执行可执行文件此时如果再去/home/hello.sh会显示权限不够
mount -o remount,acl /      #重新挂载根分区,并挂载加入acl权限
mount -o remount,ro /dev/partition   #重新挂载分区只读模式


#示例5.挂载ISO与物理光盘
mount -o loop kali.iso /media/cdrom  #kali.iso操作系统挂载到/media/cdrom目录中、
$lsblk
# NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
# sr0              11:0    1  4.5G  0 rom
#建立挂载点(可以在任何空目录下建立挂载点,在/目录下有/mnt,/media,/misc分别用来挂可移动设备,光盘和磁带机)
mkdir /mnt/cdrom/ && mount -t iso9660 /dev/sr0 /mnt/cdrom 
#挂载光盘(sr0就是光盘设备名,是固定的,记下即可,也可以是cdrom,不过它和sr0是软链接,相当于同一个文件;另外-t iso9660可以省略,因为光盘的默认文件系统就是iso9660)
ls /mnt/cdrom #读取光盘下的内容


#示例7.使用mount挂载smb服务得共享目录
#其中-t参数指示了文件系统的类型,username是用户名,password是密码,218.*.*.*是你的IP,Share你在配置文件中已经指明的段名,/mnt是你要挂载所到的文件夹,当然你可以自己修改。 
$sudo mount -t smbfs -o username=user,password=123456 //218.*.*.*/Share /mnt

!()[https://images2017.cnblogs.com/blog/1216496/201708/1216496-20170826153450824-1775132428.png]

补充说明:

(1) fstab文件内容解释:

代码语言:javascript复制
# /dev/hda5       /home/new               ext3    default   0       1
第一列是实际分区名,也可以是实际分区的卷标(Lable)。
第二列是挂载点,挂载点必须为当前已经存在的目录。
第三列为此分区的文件系统类型(auto ext4 xfat xfs(推荐))。
第四列是挂载的选项,用于设置挂载的参数。(请注意光驱和软驱只有在装有介质时才可以进行挂载因此它是noauto)
  # auto: 系统自动挂载,fstab默认就是这个选项
  # defaults: rw, suid, dev, exec, auto, nouser, and async.
  # noauto 开机不自动挂载
  # nouser 只有超级用户可以挂载
  # ro 按只读权限挂载
  # rw 按可读可写权限挂载
  # user 任何用户都可以挂载
第五列是dump备份设置,当其值设置为1时将允许dump备份程序备份;设置为0时,忽略备份操作;
第六列是fsck磁盘检查设置,其值是一个顺序。当其值为0时永远不检查;而 / 根目录分区永远都为1。其它分区从2开始,数字越小越先检查,如果两个分区的数字相同则同时检查。

(2) 问题.mount挂载时候提示文件系统类型错误、选项错误0.0.0.0:/nfs 上有坏超级块、缺少代码页或助手程序,或其他错误(对某些文件系统(如 nfs、cifs) 您可能需要一款 /sbin/mount.<类型> 助手程序)

问题原因: 由于机器中没安装nfs-utils包

解决方法: 安装nfs-utils即可

代码语言:javascript复制
# 查看错误信息
dmesg | tail
[  149.601016] IPv6: ens192: IPv6 duplicate address fe80::8ae7:67b:34bf:f26a used by 00:50:56:bb:ba:3d detected!
[  461.751995] xfs filesystem being remounted at /tmp supports timestamps until 2038 (0x7fffffff)
[  461.752428] xfs filesystem being remounted at /var/tmp supports timestamps until 2038 (0x7fffffff)
[  997.498655] FS-Cache: Loaded
[  997.509196] RPC: Registered named UNIX socket transport module.
[  997.509198] RPC: Registered udp transport module.
[  997.509199] RPC: Registered tcp transport module.
[  997.509199] RPC: Registered tcp NFSv4.1 backchannel transport module.
[  997.524510] FS-Cache: Netfs 'nfs' registered for caching
[  997.526422] NFS: mount program didnt pass any mount data

# 安装与启用
yum -y install nfs-utils
systemctl start nfs-utils && systemctl enable  nfs-utils
rpcinfo -p

# 然后才能使用nfs类型挂载nfs
mount -t nfs 10.0.110.113:/files  /files 
cat /etc/fstab | grep "nfs"
10.0.110.113:/files/  /files                  nfs     defaults 0 0
umount 命令

描述:该命令是设备文件名或挂载点进行挂载设备的卸载; Tips:在Linux中一定!!要执行此命令,才能正常取出光盘,如果显示device is busy(设备正忙),原因可能是你当前目录正是当前目录或者正在对其读写(所有一定要退出挂载目录才执行);

基础示例

代码语言:javascript复制
# 1.弹出光盘
umount /dev/sr0
umount /mnt/cdrom

# 2.强制卸载不存在的挂账点(在挂载网络磁盘有问题时使用)
umount -lf /data

所遇问题:

问题1.磁盘umount时提示Structure needs cleaning问题处理; 问题信息:mount /dev/dm0 on /mnt failed Structure needs cleanning!在对docker容器进行删除的时候提示无法删除,结构需要清理 问题原因:停止docker服务,卸载文件系统,进行文件修复,由于使用的是ext4格式,所以使用 fsck.ext4(一般情况修复后均可挂载) 解决办法:

代码语言:javascript复制
1.首先查看/dev/md0是什么文件系统?
2.此处假如是ext4文件系统则使用 fsck.ext4 /dev/md0 命令进行修复
3.如果是xfs文件系统使用命令 xfs_repair -L /dev/md0修复

# 挂载目录
/dev/mapper/dockervg-dockerlv 

# 完整修复命令
fsck.ext4 /dev/mapper/dockervg-dockerlv -y

注意事项:如果磁盘有问题或者阵列出问题时此种修复可能会失败,挂载时依然要求格盘那就果断的格盘吧。

sync 命令

功能说明:将内存缓冲区内的数据写入磁盘。 语  法:sync [–help][–version] 补充说明:在Linux系统中,当数据需要存入磁盘时,通常会先放到缓冲区内,等到适当的时刻再写入磁盘,如此可提高系统的执行效率。

基础用法:

代码语言:javascript复制
# 将内存中尚未被更新的数据将会写入到硬盘之中,虽然在执行shutdown/reboot/halt相关命令前已经执行但是多执行几次是没错的
sync

PS: 实际上sync命令可供普通账号使用只不过一般账号用户所更新的磁盘数据就仅有自己的数据,不像root可以更新整个系统中的数据了;


0x02 磁盘分区与格式化
fdisk 命令

描述:查看磁盘与磁盘分区格式化,主要运用与MBR分区即磁盘2T容量以下;

代码语言:javascript复制
#交互式参数
a切换一个可引导的标志 = toggle a bootable flag
b编辑bsd磁盘标签  = edit bsd disklabel
c切换dos兼容性标志 = toggle the dos compatibility flag
d删除一个分区 = delete a partition
g创建一个新的空GPT分区表 = create a new empty GPT partition table
G创建一个IRIX(SGI)分区表 = create an IRIX (SGI) partition table
l列出已知的分区类型 = list known partition types
m打印这个菜单 = help
n添加一个新的分区 =  add a new partition
o创建一个新的空DOS分区表 = create a new empty DOS partition table
p打印分区表 = print the partition table
q不保存更改就退出 = quit without saving changes
s创建一个新的空Sun磁盘标签 = create a new empty Sun disklabel
t改变分区的系统id = change a partition's system id'
u改变显示/输入单元 = change display/entry units
v验证分区表 = verify the partition table
w将表写入磁盘和退出 = write and exit
x额外的功能(专家) = extra functionality (experts only)

实际案例:

代码语言:javascript复制
#示例1.查看系统中已经识别的硬盘,由此找到U盘、磁盘设备名
#注意:首先说明,插入的U盘相当于另一块硬盘,感觉设备文件名应该是sdb1,但不是固定的,不像光盘一定是sr0或者cdrom
$fdisk -l
# Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
# Units = sectors of 1 * 512 = 512 bytes
# Sector size (logical/physical): 512 bytes / 512 bytes
# I/O size (minimum/optimal): 512 bytes / 512 bytes
# Disk label type: dos
# Disk identifier: 0x0008de3e

#    Device Boot      Start         End      Blocks   Id  System
# /dev/vda1   *        2048    83884031    41940992   83  Linux


#示例2.假设我们后来添加了一块硬盘,被系统识别为/dev/sdb,但未被分区,
#即显示doesn't contain a valid partition table,我们可以通过以下步骤对其进行分区:
fdisk /dev/sdb # 进入分区模式,输入m可以查看命令的帮助信息
# 输入n,代表add a new partition
# 此时弹出两个选项,一个p(primary 主分区),一个e(extended n扩展分区)
# 输入p
# 弹出partition(分区) number选项,即要求输入分区号,默认为1,直接enter
# 弹出first sector(扇区)选项,即要求设置分区的起始位置,直接enter,即默认
# 弹出last sector(扇区)选项,即要求设置分区的终止位置,可以通过增量方式显式设置这个分区的大小,比如 2048M,即2G大小
# 完成主分区添加
# 输入p,查看已经添加的分区
# 输入n,选择e,即添加扩展分区,后面一路enter,使用默认值*  2G
# 输入n,可以看到此时有一个主分区,一个扩展分区,接下来在扩展分区上分逻辑分区,而逻辑分区编号只能从5开始,因为1~4是留给主分区和扩展分区使用的
# 输入l,添加一个逻辑分区,比如分给它2G
# 重复步骤再添加一个逻辑分区,选择大小的时候直接enter,将剩余空间全给它
# 完成分区,可以看出两个逻辑分区是在扩展分区内的
# 最后输入w,即真正完成磁盘分区


#示例3.此时如果要删除某个分区,输入d,在输入分区对应的分区号,如2,就将扩展分区删除了,此时逻辑分区也没有了,只剩下主分区了
输入d即可,之后选择分区符号;

如何为硬盘添加swap交换分区以文件形式?

代码语言:javascript复制
#建立SWAP分区流程:建立一个普通的Linux分区,修改分区类型的16进制编码,格式化交换分区,启用交换分区
$fdisk /dev/sbd
p # 打印第二块硬盘的分区信息
t # 修改分区类型,并且选择最后一个分区作为swap分区
L # 查看编码列表,82是swap分区编号
p # 再次查看
w # 保存

注意事项:

  • Linux不支持NTFS文件系统!!
    • Linux不像win需要一个一个安装驱动,它会一次性将所有能够认识的驱动全都放在内核里,但由于这样做的消耗太大,所以很多不会经常用的驱动就没有加载,比如NTFS你需要进行内核编译,但此工作量太大,一般在工作中也不需要使用除非做的是安卓之类的开发。
    • 解决方法是:搜索ntfs-3g安装,这样linux就会支持NTFS;实际上真正要进行文件的传输,不会使用U盘和光盘,而是通过网络传输.
  • 注意:fdisk操作的磁盘空间不能超过2TB;
parted 命令

描述:parted既可以进行MBR分区,也可以进行GPT分区非常强大(推荐),它也同fdisk一样有两种模式即交互和命令模式不同于fdisk的是它在退出时候将自动生效;

基础参数:

代码语言:javascript复制
align-check  #类型N检查分区类型(min |选择)对齐
帮助(命令)打印通用帮助,或者帮助命令
mklabel,mktable LABEL-TYPE创建一个新的磁碟标签(分区表)
mkpart部件类型(FS-TYPE)开始结束做一个分区
name NUMBER NAME #将名称的名称分区号命名为name (相当于盘符名称)
print 打印(设备| |自由列表,所有|数字)显示分区表,可用设备,自由的空间,发现所有分区,或特定的分区
quit 退出退出程序
rescue 开始结束救援在开始和结束时失去的分区
rm号码删除分区号
select 选择设备选择要编辑的设备
disk_set 船旗国改变选定的设备上的国旗
disk_toggle [标记]选择设备上切换的状态的标志
set NUMBER FLAG STATE  更改分区号上的标记
toggle [NUMBER [FLAG]] 切换状态的国旗插在分区号
unit UNIT  将默认单元设置为单元

select /dev/sdc # 切换到第三块磁盘 
mklabel gpt # 指定分区表类型,使用GPT分区模式
mklabel msdos # 或者使用MBR分区模式
print # 查看当前磁盘的分区信息
print all # 查看所有磁盘的分区信息

实际案例:

代码语言:javascript复制
#示例1.parted的使用
$parted
(parted) print
# Model: Virtio Block Device (virtblk)
# Disk /dev/vda: 42.9GB
# Sector size (logical/physical): 512B/512B
# Partition Table: msdos
# Disk Flags:
# Number  Start   End     Size    Type     File system  Flags
#  1      1049kB  42.9GB  42.9GB  primary  ext4         boot
(parted) rm 1  #删除分区,1是分区编号
(parted) unit GB # 单位转换为GB
(parted) quit   # 退出分区工具,立即生效


#示例2.交互模式
(parted) mkpart primary  # 主分区
# 询问个性化分区名称,默认留空
# 询问分区的文件系统,默认ext2
# 询问分区位置的起始点,指的是从第几MB开始,输入0 (4K对其)
# 询问分区位置的结束点,指的是到第几MB结束,比如想给它2G,即给2048
# 可能会出现一个"未对齐"的错误提示,这时候需要cancel,然后设置起始点从1或者2开始


#示例3.命令模式
(parted) mkpart PART-TYPE [FS-TYPE] START END
(parted) mkpart extension 0 100%
(parted) mkpart test 2000 3000 # 直接设置分区名和大小,此时已经有两个分区了
(parted) mkpart next 2500 3500  # 如果再设置一个分区和前一个分区重叠,它会让你选择是否接受建议的分区大小
#还继续添加分区,可以突破4个的限制,且没有主分区,逻辑分区这些概念

#示例4.分区实例(支持大于2T以上的)
parted /dev/sdb
(parted) mklable gpt
mkswap 命令

描述:采用该命令进行格式化swap分区,还能采用swapon与swapoff来启用或者停用交换分区

代码语言:javascript复制
mkswap [选项] 设备 [大小]

实际案例:

代码语言:javascript复制
mkswap /dev/sdb6  # 格式化建立的swap分区
swapon /dev/sdb6 # 启用swap分区(才能使用)
swapoff /dev/sdb6 # 停用swap分区

swapoff 命令 功能说明:关闭系统交换区(swap area)。 语  法:swapoff [设备] 补充说明:swapoff实际上为swapon的符号连接,可用来关闭系统的交换区。

swapon 命令 功能说明:启动系统交换区(swap area)。 语  法:swapon [-ahsV][-p <优先顺序>][设备] 补充说明:Linux系统的内存管理必须使用交换区来建立虚拟内存。 -a 将/etc/fstab文件中所有设置为swap的设备,启动为交换区。 -h 显示帮助。 -p<优先顺序> 指定交换区的优先顺序。 -s 显示交换区的使用状况。 -V 显示版本信息。

mkfs 命令

描述:mkfs指认不仅仅指mkfs.ext2(ext3、ext4) 三个指令,还包括mke2fs命令,其他的如下

mkfs mkfs.cramfs mkfs.ext3 mkfs.minix mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.xfs

代码语言:javascript复制
$mkdfs -t 类型 device
fs:指定建立文件系统时的参数;
-t<文件系统类型>:指定要建立何种文件系统;
-v:显示版本信息与详细的使用方法;
-V:显示简要的使用方法;
-c:在制做档案系统前,检查该partition是否有坏轨。

#语法:
mkfs.ext4 [-c|-l filename] [-b block-size] [-C cluster-size]
        [-i bytes-per-inode] [-I inode-size] [-J journal-options]
        [-G flex-group-size] [-N number-of-inodes]
        [-m reserved-blocks-percentage] [-o creator-os]
        [-g blocks-per-group] [-L volume-label] [-M last-mounted-directory]
        [-O feature[,...]] [-r fs-revision] [-E extended-option[,...]]
#参数
-b<区块大小> 指定区块大小,单位为字节。
-c 检查是否有损坏的区块。
-f<不连续区段大小> 指定不连续区段的大小,单位为字节。
-F 不管指定的设备为何,强制执行mke2fs。
-i<字节> 指定"字节/inode"的比例。
-N<inode数> 指定要建立的inode数目。
-l<文件> 从指定的文件中,读取文件西中损坏区块的信息。
-L<标签> 设置文件系统的标签名称。
-m<百分比值> 指定给管理员保留区块的比例,预设为5%。
-M 记录最后一次挂入的目录。
-q 执行时不显示任何信息。
-t 指定创建文件系统类型
-r 指定要建立的ext2文件系统版本。
-R=<区块数> 设置磁盘阵列参数。
-S 仅写入superblock与group descriptors,而不更改inode able inode bitmap以及block bitmap。

实际实例:

代码语言:javascript复制
#实例1.可以对MBR/GPT格式化   logical:逻辑 | physical:物理
mkfs.ext3 /dev/sda  #在执行上面的命令后,你的硬盘驱动会被标记为新的,当然这时系统是无法再恢复数据了


#实例2.指定类型格式或者才采用mkfs.格式
ls -l /dev/sda* # 查看第二块磁盘的分区
mkfs.ext3 /dev/sda1 # 将第二块磁盘的第一个分区格式化为ext3文件系统
mkfs -t ext3 /dev/sda2 # 效果和上一个一样


#实例3.
sudo mkfs.vfat -F 32 -n disk /dev/sdb1           #/*格式化U盘*/

注意事项:

  • MBR的extended partition 不能删除格式化,但可以对主分区或者逻辑分区格式化,MBR可以采用 fdisk parted 而 GPT可以采用 parted;
dd 命令

描述:用于复制文件并对原文件的内容进行转换和格式化处理,dd命令功能很强大的,对于一些比较底层的问题,使用dd命令往往可以得到出人意料的效果。

  • 用的比较多的还是用dd来备份裸设备但是不推荐,如果需要备份oracle裸设备,可以使用rman备份,或使用第三方软件备份,使用dd的话管理起来不太方便。
  • 建议在有需要的时候使用dd 对物理磁盘操作,如果是文件系统的话还是使用tar backup cpio等其他命令更加方便。 另外,使用dd对磁盘操作时,最好使用块设备文件。

基础语法:

代码语言:javascript复制
用法:dd [操作数] ... 或:dd 选项
if=file  #从 file 中读而不是标准输入。
of=file  #$写到 file 里去而不是标准输出。除非指定 conv=notrunc ,否则, dd 将把 file 截为O字节(或由 seek= 选项指定的大小)
ibs=bytes  #一次读取 bytes 字节。默认是512B。
obs=bytes  #一次写入 bytes 字节。默认是512B。
bs=bytes #一次读取和写入 bytes 字节。这将覆盖 ibs 和 obs 设定的值(并且,设定 bs 不等于同时将 ibs 和 obs 设为同一个值,至少在 只使用 sync, noerror 或 notrunc 转换时是这样的。
       #因为bs规定,每个输入块都应作为单独 的数据块拷贝到输出,而不把较短的块组合到一起)。 
cbs=bytes  #为 block 转换和 unblock 转换指定转换块的大小。
skip=blocks #在拷贝之前,跳过输入文件的前 blocks 块,每块大小为 ibs-byte 字节。
seek=blocks #在拷贝之前,跳过输出文件的前 blocks 块,每块大小为 obs-byte 字节。
count=blocks #只拷贝输入文件的前 blocks 块(每块的大小为 ibs-byte 字节),而不是全部内容,直到文件末尾 文件大小=bs*count的数量
oflag=dsync  #oflag=dsync使用同步I/O。不要省略这个选项。这个选项能够帮助你去除caching的影响,以便呈现给你精准的结果

数字值选项(以字节或块为单位)后面可以跟一个乘数: k=1024,b=512,w=2,c=1(w和c是GNU扩展语法,最好别 使用w,因为在system V中,它表示2,在4.2 BSD中,它 表示4)

GEU fileutils 4.0并且允许在数据块大小的叙述中使用下列乘法后缀(用bs=,cbs=,obs=):M=1048576(1024^2),G=1073741824, 同理可得T,P,E,Z,Y

D后缀表示数值是以 十进制表示的:kD=1000 MD=1000000 GD=1000000000等等。 (注意,在ls、df、du命令中,M等标记的大小是由环境 变量确定的,而在DD中,它的值是固定的)

WeiyiGeek.单位切换

代码语言:javascript复制
conv=转换[,转换]  #将文件按 转换 参数指定的方式转换(在lq,rq两边没有空格)。

#转换方式包括:
ascii:将EBCDIC转换成ascii。
ebcdic:将ascii转换成ebcdic。
ibm:将ascii转换成alternative ebcdic。
block:每一行输入,无论长短,输出都是 cbs 字节,并且其中的lq换行rq(NEWLINE,即c中的)用 空格替换。如有必要,行尾会填充空格。
unblock:用lq换行rq替换每个输入块( cbs 字节大小)末尾的空格。
lcase:将大写字母转换成小写lower。
ucase:将小写字母转换成大写upper。
swab:交换每对输入字节。如果读入的字节数是奇数,最后 一个字节只是简单的复制到输出(因为没有能跟它交换的 字节了)(POSIX 1003.26,PASC翻译1003.2 3号和4号)。 
noerror:发生读错误时,继续进行。
notrunc:不截断输出文件。
sync:用0填充到每个输入块的末尾,使其大小为 ibs 字节。
fdatasyn #同步IO

实际案例:

代码语言:javascript复制
#实例1.dd命令会擦掉/dev/sda下面的内容,然后写入随机的垃圾数据,最后你的系统会受到不可逆转的破坏。 
dd if=/dev/random of=/dev/sda

#实例2.测试硬盘的写速度
#通过以上两个命令输出的命令执行时间,可以计算出硬盘的读、写速度。
dd if=/dev/zero of=sun.txt bs=1M count=1  #该命令创建了一个1M大小的文件sun.txt,其中参数解释:
#/dev/zero 是一个字符设备,会不断返回0值字节(),
#/dev/zero是一个伪设备,它只产生空字符流,对它不会产生IO,所以,IO都会集中在of文件中,of文件只用于写,所以这个命令相当于测试磁盘的写能力。

WeiyiGeek.磁盘写

代码语言:javascript复制
#实例3.测试磁盘读能力
#因为/dev/sdb1是一个物理分区,对它的读取会产生IO,/dev/null是伪设备,相当于黑洞,of到该设备不会产生IO,
#所以这个命令的IO只发生在/dev/sdb1上,也相当于测试磁盘的读能力。
time dd if=/dev/sdb1 of=/dev/null bs=8k
time dd if=/dev/sdb1 of=/test1.dbf bs=8k  #测试同时读写能力
#上面的案例一个是物理分区,一个是实际的文件,对它们的读写都会产生IO(对/dev/sdb1是读,对/test1.dbf是写)


#实例4.将本地的/dev/hdx整盘备份到/dev/hdy
dd if=/dev/hdx of=/dev/hdy          

#实例5.将/dev/hdx全盘数据备份到指定路径的image文件
dd if=/dev/hdx of=/path/to/image  

#实例6.将备份文件恢复到指定盘
dd if=/path/to/image of=/dev/hdx    


#实例7.备份/dev/hdx全盘数据,并利用gzip工具进行压缩,保存到指定路径
dd if=/dev/hdx | gzip >/path/to/image.gz  


#实例8.将压缩的备份文件恢复到指定盘
gzip -dc /path/to/image.gz | dd of=/dev/hdx     


#实例9.拷贝光盘数据到root文件夹下,并保存为cd.iso文件
dd if=/dev/cdrom(hdc) of=/root/cd.iso  


#实例10.备份与恢复MBR 备份磁盘开始的512个字节大小的MBR信息到指定文件:
dd if=/dev/hda of=/root/image count=1 bs=512  #count=1指仅拷贝一个块;bs=512指块大小为512个字节
#恢复:将备份的MBR信息写到磁盘开始部分;
dd if=/root/image of=/dev/had
dd if=/dev/fd0 of=disk.img count=1 bs=1440k # (即块大小为1.44M) #备份软盘
#系统备份 TAR 进行打包系统 
tar cvpzf backup.tgz --exclude=/proc --exclude=/lost found --exclude=/backup.tgz --exclude=/mnt --exclude=/sys --exclude=/media /
# 拷贝内存内容到硬盘
dd if=/dev/mem of=/root/mem.bin bs=1024 (指定块大小为1k)

#实例11.销毁磁盘数据
dd if=/dev/urandom of=/dev/hda1
注意:利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。

#实例12.使用文件的方式创建 2GB 的交换分区(注意不同发型版本文件大小单位不同,一个是 MB 另一个是 MiB)
#  MiB 是 1024 的倍数
#  MB 是 1000 的倍数
dd if=/dev/zero of=/swapfile bs=4M count=500
# 500 0 records in
# 500 0 records out
# 2097152000 bytes (2.1 GB) copied, 11.0648 s, 190 MB/s


#实例13.测试的硬盘性能
dd if=/dev/zero of=/tmp/test1.img bs=4k count=10000 oflag=dsync

WeiyiGeek.

增加swap分区文件大小:

代码语言:javascript复制
#第一步:创建一个大小为256M的文件:
dd if=/dev/zero of=/swapfile bs=1024 count=262144

#第二步:把这个文件变成swap文件:
mkswap /swapfile

#第三步:启用这个swap文件:
swapon /swapfile

#第四步:编辑/etc/fstab文件,使在每次开机时自动加载swap文件:
/swapfile swap swap default 0 0

确定硬盘的最佳块大小:

代码语言:javascript复制
#Tips:默认MB,就是bs*count = num MB就是文件大小,通过比较以上命令输出中所显示的命令执行时间,即可确定系统最佳的块大小。
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
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
 
#修复硬盘:
dd if=/dev/sda of=/dev/sda 
#或
dd if=/dev/hda of=/dev/hda
#当硬盘较长时间(一年以上)放置不使用后,磁盘上会产生 magnetic flux point(磁通点),当磁头读到这些区域时会遇到困难,并可能导致I/O错误。
#当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数 据起死回生。并且这个过程是安全、高效的。
cfdisk 命令

描述:用来磁盘分区的程序,它十分类似DOS的fdisk,具有互动式操作界面而非传统fdisk的问答式界面,您可以轻易地利用方向键来操控分区操作。

代码语言:javascript复制
语  法:
cfdisk [-avz][-c <柱面数目>-h <磁头数目>-s <盘区数目>][-P <r,s,t>][外围设备代号]

参  数:
-a   在程序里不用反白代表选取,而以箭头表示。
-c<柱面数目>   忽略BIOS的数值,直接指定磁盘的柱面数目。
-h<磁头数目>   忽略BIOS的数值,直接指定磁盘的磁头数目。
-P<r,s,t>   显示分区表的内容,附加参数"r"会显示整个分区表的详细资料,
                            附加参数"s"会依照磁区的顺序显示相关信息,
                          附加参数"t"则会以磁头,磁区,柱面的方式来显示资料。
-s<磁区数目>   忽略BIOS的数值,直接指定磁盘的磁区数目。
-v   显示版本信息。
-z   不读取现有的分区,直接当作没有分区的新磁盘使用。
fdformat 命令

对指定的软碟机装置进行低阶格式化,使用这个指令对软碟格式化的时候,最好指定像是下面的装置:

代码语言:javascript复制
  /dev/fd0d360 磁碟机 A: ,磁片为 360KB 磁碟
  /dev/fd0h1440 磁碟机 A: ,磁片为 1.4MB 磁碟
  /dev/fd1h1200 磁碟机 B: ,磁片为 1.2MB 磁碟

#如果使用像是 /dev/fd0 之类的装置如果里面的磁碟不是标准容量,格式化可能会失败。在这种情况之下,使用者可以用 setfdprm 指令先行指定必要参数。
参数:
  -n 关闭确认功能。这个选项会关闭格式化之后的确认步骤。
范例:
   fdformat -n /dev/fd0h1440  #将磁碟机 A 的磁片格式化成 1.4MB 的磁片。并且省略确认的步骤。
mformat 命令

功能说明:对MS-DOS文件系统的磁盘进行格式化,mformat为mtools工具指令,模拟MS-DOS的format指令,可将指定的磁盘或硬盘分区格式化为MS-DOS文件系统。

代码语言:javascript复制
#语  法:
mformat [-1aCFIKX][-0 <数据传输率>][-2 <磁区数>][-A <数据传输率>][-B <开机区文件>][-c <丛集大小>][-h <磁头数>][-H <隐藏磁区数>][-l <磁盘标签>][-M <磁区大小>][-n <序号>][-r <根目录大小>][-s <磁区数>][-S <磁区大小>][-t <柱面数>][驱动器代号]

#参  数:
-0<数据传输率>   指定第0磁轨的数据传输率。
-1   不使用2M格式。
-2<磁区数>   指定在第0磁轨的第0个磁头的磁区数,也就是所谓的2M格式。
-a   指定产生Atari格式的序号。
-A<数据传输率>   指定第0磁轨以外所有磁轨的数据传输率。
-B<开机区文件>   从指定的文件来建立开机区。
-c<丛集大小>   指定丛集大小,单位为磁区。
-C   建立磁盘MS-DOS文件系统的映像文件。
-F   以FAT32来格式化磁盘。
-H<隐藏磁区数>   指定隐藏磁区的数目。
-I   指定FAT32的frVersion编号。
-k   尽可能地保留原有的开机区。
-l<磁盘标签>   指定磁盘标签名称。
-M<磁区大小>   指定MS-DOS文件系统所使用的磁区大小,预设应该与硬体磁区大小相同,单位为字节。
-n<序号>   指定序号。
-r<根目录大小>   指定根目录的大小,单位为磁区。
-s<磁区数>   指定每一磁轨所包含的磁区数目。
-S<磁区大小>   指定硬件磁区大小。
-t<柱面数>   指定柱面数目。
-X   格式化XDF磁盘。
resize2fs 命令

描述:该命令用来增大或者收缩未加载的ext2/ext3/ext4文件系统的大小,常常用在LVM逻辑卷划分;

注意事项:

  • 如果文件系统是处于mount状态下,那么它只能做到扩容前提条件是内核支持在线resize。
  • linux kernel 2.6支持在mount状态下扩容但仅限于ext3文件系统,高版本的可以无视(即不用挂出在执行);

Syntax & Param:

代码语言:javascript复制
语法格式:resize2fs [参数] [文件]
resize2fs [-d debug_flags] [-f] [-F] [-M] [-P] [-p] device [-b|-s|new_size] [-S RAID-stride] [-z undo_file]
常用参数:
-d	打开调试特性
-p	打印已完成的百分比进度条
-f	强制执行调整大小操作,覆盖掉安全检查操作
-F	开始执行调整大小前,刷新文件系统设备的缓冲区

基础实例:

代码语言:javascript复制
# 示例1、划分LVM空间到逻辑分区中刷新文件系统
umount -l /dev/mapper/WeiyiGeek-Root-vgs
e2fsck -f /dev/mapper/WeiyiGeek-Root-vgs #调整逻辑卷文件系统大小:
resize2fs /dev/mapper/WeiyiGeek-Root-vgs
mount /dev/mapper/WeiyiGeek-Root-vgs

# 示例2.打开调试特性:
resize2fs -d /dev/linuxprobe/vo

# 示例3.打印已完成的百分比进度条:
resize2fs -p /dev/linuxprobe/vo

# 示例4.强制执行调整大小操作,覆盖掉安全检查操作:
resize2fs -f /dev/linuxprobe/vo

# 示例5.开始执行调整大小前,刷新文件系统设备的缓冲区:
resize2fs -F /dev/linuxprobe/vo

0x03 磁盘物理检测
tune2fs 命令

描述:允许系统管理员在 Linux 的 ext2、ext3、ext4 文件系统中调整各种可调的文件系统参数

  • Windows下面如果出现意外断电死机情况,下次开机一般都会出现系统自检
  • Linux系统下面也有文件系统自检,而且是可以通过tune2fs命令,自行定义自检周期及方式.

使用窗口管理器(GUI)删除文件和使用命令行工具(CLI)删除文件这两种方法之间是有区别的;

语法与参数:

代码语言:javascript复制
tune2fs [选项] [文件系统]  #文件系统:指定调整的文件系统或者其对应的设备文件名。

#参数
-c:调整最大加载次数;
-C:设置文件系统已经被加载的次数;
-e:设置内核代码检测到错误时的行为;
-f:强制执行修改,即使发生错误;
-i:设置相邻两次文件系统检查的相隔时间;
-j:为“ext2”文件系统添加日志功能,将其转换为“ext3”文件系统;
-l:显示文件超级块内容;
-L:设置文件系统卷标;
-m:显示文件保留块的百分比;
-M:设置文件系统最后被加载到的目录;
-o:设置或清除文件系统加载的特性或选项;
-O:设置或清除文件系统的特性或选项;
-r:设置文件系统保留块的大小;
-T:设置文件系统上次被检查的时间;
-u:设置可以使用文件系统保留块的用户;
-U:设置文件系统的UUID。

实际案例:

代码语言:javascript复制
tune2fs -l /dev/sda1
tune2fs 1.44.5 (15-Dec-2018)
Filesystem volume name:   <none>
Last mounted on:          /boot
Filesystem UUID:          3851c2b2-f6f8-478a-8506-42cf02f4e15f  #重要
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super large_file
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              61056
Block count:              243968
Reserved block count:     12198
Free blocks:              207391
Free inodes:              60713
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      59
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         7632
Inode blocks per group:   477
Filesystem created:       Tue May 21 15:48:09 2019
Last mount time:          Tue Jun 18 09:10:09 2019
Last write time:          Tue Jun 18 09:10:09 2019
Mount count:              1
Maximum mount count:      -1
Last checked:             Tue Jun 18 09:10:09 2019
Check interval:           0 (<none>)
Lifetime writes:          387 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     32
Desired extra isize:      32
Default directory hash:   half_md4
Directory Hash Seed:      e479dc47-b5b0-43e0-b4f3-5d810fd6519a


#示例1.你可以使用tune2fs(调整和查看ext2/ext3文件系统的文件系统参数)来查看文件系统的索引节点信息,来进行恢复文件.
sudo tune2fs -l /dev/sda1 |grep -i inode
# Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super large_file
# Inode count:              61056
# Free inodes:              60713
# Inodes per group:         7632
# Inode blocks per group:   477
# First inode:              11
# Inode size:               256


#示例2.tune2fs简单示例
tune2fs -c 30 /dev/hda1      #设置强制检查前文件系统可以挂载的次数
tune2fs -c -l /dev/hda1      #关闭强制检查挂载次数限制。
tune2fs -i 10 /dev/hda1      #10天后检查
tune2fs -i 1d /dev/hda1      ##1天后检查
tune2fs -i 3w /dev/hda1      #3周后检查
tune2fs -i 6m /dev/hda1      #半年后检查
tune2fs -i 0 /dev/hda1       #禁用时间检查
tune2fs -j /dev/hda1         #添加日志功能,将ext2转换成ext3文件系统
tune2fs -r 40000 /dev/hda1   #调整/dev/hda1分区的保留空间为40000个磁盘块
tune2fs -o acl,user_xattr /dev/hda1       #设置/dev/hda1挂载选项,启用Posix Access Control Lists和用户指定的扩展属性


#实例3.新建和改变磁盘分区的UUID
uuidgen | xargs tune2fs /dev/sda5 -U
tune2fs -U c1b9d5a2-f162-11cf-9ece-0020afc76f16 /dev/sda5
dumpe2fs 命令

描述:查询指定分区详细文件系统信息的命令,用于打印“ext2/ext3”设备文件系统中的超级块和块组的信息。

代码语言:javascript复制
dumpe2fs(选项)(参数)

#选项
-b:打印文件系统中预留的块信息;
-ob<超级块>:指定检查文件系统时使用的超级块;
-OB<块大小>:检查文件系统时使用的指定的块大小;
-h:仅显示超级块信息;
-i:从指定的文件系统映像文件中读取文件系统信息;
-x:以16进制格式打印信息块成员。

实际案例:

代码语言:javascript复制
#如果不加任何参数,则会显示磁盘组信息
#示例0.简单示例仅显示超级块中信息,而不显示磁盘块的详细信息
$dumpe2fs -h /dev/sda1 #等同于上面的tune2fs -l /dev/sda1
dumpe2fs 1.44.5 (15-Dec-2018)
Filesystem volume name:   <none>
Last mounted on:          /boot
Filesystem UUID:          3851c2b2-f6f8-478a-8506-42cf02f4e15f
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super large_file
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl  #注意这里的ACL权限
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              61056
Block count:              243968
Reserved block count:     12198
Free blocks:              207391
Free inodes:              60713
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      59
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         7632
Inode blocks per group:   477
Filesystem created:       Tue May 21 15:48:09 2019
Last mount time:          Tue Jun 18 09:10:09 2019
Last write time:          Tue Jun 18 09:10:09 2019
Mount count:              1
Maximum mount count:      -1
Last checked:             Tue Jun 18 09:10:09 2019
Check interval:           0 (<none>)
Lifetime writes:          387 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     32
Desired extra isize:      32
Default directory hash:   half_md4
Directory Hash Seed:      e479dc47-b5b0-43e0-b4f3-5d810fd6519a


#显示UUID信息
dumpe2fs /dev/sdc1 | grep UUID
Filesystem UUID: d17e3c31-e2c9-4f11-809c-94a549bc43b7

入坑事项

  • 我需要同步文件系统,一开始使用resize2fs后来看到xfs根式的使用dumpe2fs都报同样的错误;

WeiyiGeek.xfs格式

xfs_growfs 命令

描述:查看xfs分区类型的inode

代码语言:javascript复制
xfs_growfs [ 选项 ] /dev/sda1

WeiyiGeek.xfs分区类型

smartctl 命令

描述:主要运用于Linux硬盘健康检测,随着硬盘容量、速度的快速发展,硬盘的可靠性问题越来越重要,今天的单块硬盘存储容量可轻松达到1TB,硬盘损坏带来的影响非常巨大,不同的文件系统(xfs,reiserfs,ext3)都有自己的检测和修复工具。 检测之前可以先使用dmesg命令查看有没有硬件I/O故障的日志,如果有先用fsck看看是不是文件系统有问题,如果不是则可以使用下面介绍硬盘检测和优化方法来修复它。

grep”error”/va/log/messages*;

SMART是一种磁盘自我分析检测技术,早在90年代末就基本得到了普及每一块硬盘(包括IDE、SCSI),在运行的时候都会将自身的若干参数记录下来,这些参数包括型号、容量、温度、密度、扇区、寻道时间、传输、误码率等。硬盘运行了几千小时后,很多内在的物理参数都会发生变化,某一参数超过报警阈值,则说明硬盘接近损坏,此时硬盘依然在工作,如果用户不理睬这个报警继续使用,那么硬盘将变得非常不可靠,随时可能故障。

如何启用smart? 答:启SMART是和主板BIOS上相应功能配合的,要使用SMART,必须先进入到主板BIOS设置里边启动相关设置。一般从Pentium2级别起的主板,都支持SMART,BIOS启动以后,就是操作系统级别的事情了(Windows没有内置SMART相关工具,需要安装第三方工具软件),好在Linux上很早就有了SMART支持了,如果把Linux装在VMware等虚拟机上,在系统启动时候可以看到有个服务启动报错:smartd。这个服务器就是smart的daemon进程(因为vmware虚拟机的硬盘不支持SMART,所以报错)。smartd是一个守护进程(一个帮助程序),它能监视拥有自我监视,分析和汇报技术(Self-Monitoring, Analysis, and Reporting Technology - SMART)的硬盘。SMART体系使得硬盘能监视并汇报自己的运行状况.它的一个重要特性是能够预测失败,使得系统管理员能避免数据丢失。

命令安装:

代码语言:javascript复制
$yum search smartctl #搜索包含samrtctl的包
gsmartcontrol.x86_64 : Graphical user interface for smartctl

$yum install gsmartcontrol #安装包

#基础语法:
smartctl -a <device> #检查该设备是否已经打开SMART技术。 
smartctl -s on <device> #如果没有打开SMART技术,使用该命令打开SMART技术。 
smartctl -t short <device> #后台检测硬盘,消耗时间短; 
smartctl -t long <device> #后台检测硬盘,消耗时间长; 
smartctl -C -t short <device> #前台检测硬盘,消耗时间短; 
smartctl -C -t long <device> #前台检测硬盘,消耗时间长。其实就是利用硬盘SMART的自检程序。 
smartctl -X <device> #中断后台检测硬盘。 
smartctl -l selftest <device> #显示硬盘检测日志。 
smartctl -l error <device> #显示硬盘错误汇总。

实际案例:

代码语言:javascript复制
#示例1.首先通过dmesg工具确认一下硬盘的设备符号。
#例如一个IDE硬盘连接到Primary IDE 总线上的Slave位置,硬盘设备符号是/dev/hdb,hdb中的h代表IDE,如果显示为sdb,则代表SATA和SCSI,最后一个字幕b代表Primary总线,第二块硬盘即Slave位置,确认硬盘是否打开了SMART支持:
smartctl -a /dev/sda   #快速检测硬盘坏道,看read,write 后面有没有errors 
# === START OF INFORMATION SECTION ===
# Vendor:               VMware
# Product:              Virtual disk
# Revision:             1.0
# User Capacity:        42,949,672,960 bytes [42.9 GB]
# Logical block size:   512 bytes
# LU is fully provisioned
# Device type:          disk
# Local Time is:        Tue Jun 18 11:21:54 2019 CST
# SMART support is:     Unavailable - device lacks SMART capability.

# === START OF READ SMART DATA SECTION ===
# Current Drive Temperature:     0 C
# Drive Trip Temperature:        0 C


#示例2.查看SMART支持
smartctl -i /dev/sda
# SMART support is: Available - device has SMART capability.
# SMART support is: Enabled                          //表示启用了smart支持 


#示例3.如果看到SMART support is: Disabled表示SMART未启用,执行如下命令,启动SMART
smartctl --smart=on --offlineauto=on --saveauto=on /dev/sda


#示例4.现在硬盘的SMART功能已经被打开,执行如下命令查看硬盘的健康状况
smartctl -H /dev/sda
# === START OF READ SMART DATA SECTION ===
# SMART Health Status: OK
- PASSED/OK 这表示硬盘健康状态良好;
- FAILED 那么最好立刻给服务器更换硬盘

#示例5.其他常用命令
smartctl -A /dev/sda  #查看硬盘的详细信息 测试硬盘使用时间以及写入字节数
smartctl -s on  /dev/sda  #如果没有打开SMART技术,使用该命令打开SMART技术。 
smartctl -t short  /dev/sda  #后台检测硬盘,消耗时间短; 
smartctl -t long  /dev/sda   #后台检测硬盘,消耗时间长; 
smartctl -C -t  /dev/sda   #short前台检测硬盘,消耗时间短; 
smartctl -C -t  /dev/sda  # long前台检测硬盘,消耗时间长。其实就是利用硬盘SMART的自检程序。 
smartctl -X   /dev/sda      #中断后台检测硬盘。 
smartctl -l selftest  /dev/sda  #显示硬盘检测日志。 
smartctl -l error   /dev/sda    #显示硬盘错误汇总。

如果需要定期登录到服务器上运行smartctl比较麻烦时,linux还提供了系统进程smartd,编辑配置文件:vi /etc/smartd.conf 这个配置文件中大部分可能是注释掉的说明,只需要写入和当前硬盘相关的配置即可:

参数

说明

/dev/sda -H -m test@test123123.com

监控磁盘的健康状态,当SMART中报告 PASSED的时候不理睬。一旦出现 Failure,立刻用邮件通知用户指定的邮箱

/dev/sda -a -m admin@example.com,root@localhost

监控磁盘的所有属性,当SMART中报告 PASSED的时候不理睬。一旦出现 Failure,立刻用邮件通知用户指定的邮箱

/dev/twa0 -d 3ware,0 -a -s L/../../7/00

监控3ware 9000控制器上的第一个ATA磁盘的所有属性,在每个礼拜天的00:00–01:00进行长格式的自我检测

代码语言:javascript复制
/dev/sg2 -d areca,1 -a  -s L/../(01|15)/./22 	 监控Areca Raid控制器上的第一个SATA磁盘的所有属性,在每个礼拜月的第1天和第15天的22:00--23:00进行长格式的自我检测
-s (O/../.././(00|06|12|18)|S/../.././01|L/../../6/03)  在每天的00:00,06:00,12:00,18:00进行离线的自检,并在每天的01:00-02:00进行短格式的自检,并在每个礼拜6的03:00-04:00进行长格式的自检

配置好 smartd.conf 后需执行 /etc/init.d/smartd restart 即可生效

其他和smartd.conf相关的配置可参见:http://smartmontools.sourceforge.net/man/smartd.conf.5.html

badblock 命令

描述:检查磁盘装置中损坏的区块,执行指令时须指定所要检查的磁盘装置,及此装置的磁盘区块数。

代码语言:javascript复制
#语  法:
 badblocks [-svw][-b <区块大小>][-o <输出文件>][磁盘装置][磁盘区块数][启始区块]

#参  数:
-b<区块大小>   指定磁盘的区块大小,单位为字节。
-o<输出文件>   将检查的结果写入指定的输出文件。
-s   在检查时显示进度。
-v   执行时显示详细的信息。
-w   在检查时,执行写入测试。
[磁盘装置]   指定要检查的磁盘装置。
[磁盘区块数]   指定磁盘装置的区块总数。
[启始区块]   指定要从哪个区块开始检查。

实际案例:

代码语言:javascript复制
#示例1.检查磁盘坏道
$badblocks -s//显示进度 -w//以写去检测 -v//显示执行详细情况 /dev/sda2  #注意不能以写的方式检测已经挂载的硬盘
$badblocks -s /dev/sda -b 512 
# Checking for bad blocks (read-only test):  30.84% done, 0:21 elapsed. (0/0/0 errors)
$badblocks -s -v /dev/sda1 #-s显示进度,显示执行详细情况
$badblocks -s -v -o /root/badblocks.log /dev/sda #将结果保存到bb.log

#实例2.逻辑坏道修复方法(非常注意前后)
badblocks -s -w /dev/sda END START #(END代表需要修复的扇区末端,START代表需要修复的扇区起始端)
Pass completed, 12 bad blocks found. (12/0/0)Error 表明存在坏道

WeiyiGeek.badblocks

补充事项:

  • 逻辑坏道修复后再用badblocks -s -v -o /root/bb.log /dev/sda监测看是否还有坏道存在,如果坏道还是存在的话说明坏道属于硬盘坏道,硬盘坏道要用隔离方法.首先记录监测出的硬盘坏道然后分区的时候把硬盘坏道所在的扇区分在一个分区(大小一般大于坏扇区大小),划分出的坏道分区不使用即可达到隔离的目的;
  • 0磁道坏道和硬盘坏道(准备换硬盘),修复方法是隔离0磁道,使用fdsk划分区的时候从1磁道开始划分区。如果是硬盘坏道的话,只能隔离不能修复;
mbadblocks 命令

功能说明:检查MS-DOS文件系统的磁盘是否有损坏的磁区。 语  法:mbadblocks [驱动器代号] 补充说明:mbadblocks为mtools工具指令,可用来扫描MS-DOS文件系统的磁盘驱动器,并标示出损坏的磁区。

mknod命令

描述:用于创建Linux中的字符设备文件和块设备文件。 Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备文件。

  • 应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。

为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。

  • 主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备
  • 对于常用设备,Linux有约定俗成的编号,如硬盘的主设备号是3。

Linux为所有的设备文件都提供了统一的操作函数接口,方法是使用数据结构struct file_operations。这个数据结构中包括许多操作函数的指针,如open()、close()、read()和write()等,但由于外设的种类较多,操作方式各不相同。

Struct file_operations结构体中的成员为一系列的接口函数,如用于读/写的read/write函数和用于控制的ioctl等。

  • 打开一个文件就是调用这个文件file_operations中的open操作。
  • 不同类型的文件有不同的file_operations成员函数,如普通的磁盘数据文件,接口函数完成磁盘数据块读写操作;而对于各种设备文件,则最终调用各自驱动程序中的I/O函数进行具体设备的操作。
  • 这样应用程序根本不必考虑操作的是设备还是普通文件,可一律当作文件处理,具有非常清晰统一的I/O接口。所以file_operations是文件层次的I/O接口。
代码语言:javascript复制
语法:mknod(选项)(参数)

#选项:
-Z:设置安全的上下文;
-m:设置权限模式;

#参数
文件名:要创建的设备文件名;
类型:指定要创建的设备文件的类型;
主设备号:指定设备文件的主设备号;
次设备号:指定设备文件的次设备号。

#当类型为"p"时可不指定主设备号和次设备号,否则它们是必须指定的。
#如果主设备号和次设备号以"0x"或"0X"开头,它们会被视作十六进制数来解析;
#如果以"0"开头,则被视作八进制数;其余情况下被视作十进制数。

b      创建(有缓冲的)区块特殊文件
c,u   创建(没有缓冲的)字符特殊文件,虚拟设备
p      创建先进先出(FIFO)特殊文件

实际案例:

代码语言:javascript复制
#示例1.简单使用
$ls -la /dev/tty*
crw-rw---- 1 root dialout 4, 64 6月  17 17:14 /dev/ttyS0
$mknod /dev/ttyS0 c 4(主) 64(次)

#将其中的4,64这样的数字记录下来,这表示主设备号和次设备号
#一般来说主设备号用来区分设备的种类;次设备号则是为了作唯一性区分,标明不同属性-
#注意,在unix系统中是把设备也当作文件来对待的,在redhat 9下,ls加不加-L参数都无所谓,但是在Solaris下则一定要加上才可以显示.


#示例2.创建一个区块/设备区块
mknod /dev/hda3 b 3 7    
ls -al /dev/hda3         #查看
brw-r--r-- 1 root root 3, 7 8月  21 11:01 /dev/hda3

mknod /dev/ttyUSB32 c 188 32
crw-r--r-- 1 root root 188, 32 6月  16 17:47 /dev/ttyUSB1

注意: 您的shell 内含自己的mknod 程序版本,它会覆盖这里所提及的相应,版本请查阅您的shell 文档获知它所支持的选项。

e2fsck 命令

描述:e2fsck(ext2 file system check) 检查ext2文件系统的正确性。

代码语言:javascript复制
语  法:e2fsck [-acCdfFnprsStvVy][-b <superblock>][-B <区块大小>][-l <文件>][-L <文件>][设备名称]
#补充说明:e2fsck执行后的传回值及代表意义如下。
0     没有任何错误发生。
1     文件系统发生错误,并且已经修正。
2     文件系统发生错误,并且已经修正。
4     文件系统发生错误,但没有修正。
8     运作时发生错误。
16    使用的语法发生错误。
128   共享的函数库发生错误。
#参  数:
-a   不询问使用者意见,便自动修复文件系统。
-b<superblock>   指定superblock,而不使用预设的superblock。
-B<区块大小>   指定区块的大小,单位为字节。
-c   一并执行badblocks,以标示损坏的区块。
-C   将检查过程的信息完整记录在file descriptor中,使得整个检查过程都能完整监控。
-d   显示排错信息。
-f   即使文件系统没有错误迹象,仍强制地检查正确性。
-F   执行前先清除设备的缓冲区。
-l<文件>   将文件中指定的区块加到损坏区块列表。
-L<文件>   先清除损坏区块列表,再将文件中指定的区块加到损坏区块列表。因此损坏区块列表的区块跟文件中指定的区块是一样的。
-n   以只读模式开启文件系统,并采取非互动方式执行,所有的问题对话均设置以"no"回答。
-p   不询问使用者意见,便自动修复文件系统。
-r   此参数只为了兼容性而存在,并无实际作用。
-s   如果文件系统的字节顺序不适当,就交换字节顺序,否则不做任何动作。
-S   不管文件系统的字节顺序,一律交换字节顺序。
-t   显示时间信息。
-v   执行时显示详细的信息。
-V   显示版本信息。
-y   采取非互动方式执行,所有的问题均设置以"yes"回答。

补充说明:

1.进行修复中间可能修复到一半的时候出现aborted的情况,此时处理创建/etc/e2fsck.conf,包含以下内容:

代码语言:javascript复制
[scratch_files]
directory = /var/cache/e2fsck
ext2ed 命令

描述:ext2ed(ext2 file system editor)文件系统编辑程序,ext2ed可直接处理硬盘分区上的数据,这指令只有Red Hat Linux才提供。

代码语言:javascript复制
语  法:ext2ed
#参  数:
一般指令
setdevice[设备名称]   #指定要处理的设备。
disablewrite   #将ext2ed设为只读的状态。
enablewrite   #将ext2ed设为可读写的状态。
help[指令]   #显示个别指令的帮助。
next   #移至下一个单位,单位会依目前所在的模式而异。
prev   #移至前一个单位,单位会依目前所在的模式而异。
pgup   #移至下一页。
pgdn   #移至上一页。
set   #修改目前的数据,参数会依目前所在的模式而异。
writedata   #在执行此指令之后,才会实际修改分区中的数据。

#ext2进入3种模式的指令
super    #进入main superblock,即Superblock模式。
group<编号>   #进入指定的group,即Group模式。
cd<目录或文件>   #在inode模式下,进入指定的目录或文件,即Inode模式。

Superblock模式
gocopy<备份编号>   #进入指定的superblock备份。
setactivecopy   #将目前所在的superblock,复制到main superblock。

Group模式
blockbitmap   #显示目前groupo的区块图。
inode   #进入目前group的第一个inode。
inodebitmap   #显示目前group的inode二进制码。

Inode模式
dir   #进入目录模式。
file  #进入文件模式。
fsconf 命令

描述:fsconf(file system configurator) 设置文件系统相关功能。

代码语言:javascript复制
语  法:fsconf [--check]
补充说明:fsconf是Red Hat Linux发行版专门用来调整Linux各项设置的程序。
参  数:
--chedk   检查特定文件的权限。
hdparm 命令

描述:hdparm(hard disk parameters) 显示与设定硬盘的参数,测试硬盘读写速度,还能检测,显示与设定IDE或SCSI硬盘的参数。

代码语言:javascript复制
语  法:hdparm [-CfghiIqtTvyYZ][-a <快取分区>][-A <0或1>][-c <I/O模式>][-d <0或1>][-k <0或1>][-K <0或1>][-m <分区数>][-n <0或1>][-p <PIO模式>][-P <分区数>][-r <0或1>][-S <时间>][-u <0或1>][-W <0或1>][-X <传输模式>][设备]
补充说明:hdparm可检测,显示与设定IDE或SCSI硬盘的参数。
参  数:
-a<快取分区>   #设定读取文件时,预先存入块区的分区数,若不加上<快取分区>选项,则显示目前的设定。
-A<0或1>   #启动或关闭读取文件时的快取功能。
-c<I/O模式>  # 设定IDE32位I/O模式。
-C   #检测IDE硬盘的电源管理模式。
-d<0或1>   #设定磁盘的DMA模式。
-f   #将内存缓冲区的数据写入硬盘,并清楚缓冲区。
-g   #显示硬盘的磁轨,磁头,磁区等参数。
-h   #显示帮助。
-i   #显示硬盘的硬件规格信息,这些信息是在开机时由硬盘本身所提供。
-I   #直接读取硬盘所提供的硬件规格信息。
-k<0或1>   #重设硬盘时,保留-dmu参数的设定。
-K<0或1>   #重设硬盘时,保留-APSWXZ参数的设定。
-m<磁区数>   #设定硬盘多重分区存取的分区数。
-n<0或1>   #忽略硬盘写入时所发生的错误。
-p<PIO模式>   #设定硬盘的PIO模式。
-P<磁区数>  # 设定硬盘内部快取的分区数。
-q   #在执行后续的参数时,不在屏幕上显示任何信息。
-r<0或1>   #设定硬盘的读写模式。
-S<时间>  # 设定硬盘进入省电模式前的等待时间。
-t   #评估硬盘的读取效率。
-T   #评估硬盘快取的读取效率。
-u<0或1>   #在硬盘存取时,允许其他中断要求同时执行。
-v   #显示硬盘的相关设定。
-W<0或1>   #设定硬盘的写入快取。
-X<传输模式>  # 设定硬盘的传输模式。
-y   #使IDE硬盘进入省电模式。
-Y   #使IDE硬盘进入睡眠模式。
-Z   #关闭某些Seagate硬盘的自动省电功能。

实际案例:

代码语言:javascript复制
# 示例1.测试硬盘读写速度
$hdparm -Tt /dev/sda
# /dev/sda:
# Timing cached reads:   
# 1918 MB in  2.00 seconds = 959.62 MB/sec
# Timing buffered disk reads:  184 MB in  3.00 seconds =  61.26 MB/sec
symlinks 命令

描述:symlinks(symbolic links) 维护符号连接的工具程序,可检查目录中的符号连接,并显示符号连接类型。

代码语言:javascript复制
语  法:symlinks [-cdrstv][目录]

#以下为symlinks可判断的符号连接类型
absolute:符号连接使用了绝对路径。
dangling:原始文件已经不存在。
lengthy:符号连接的路径中包含了多余的"../"。
messy:符号连接的路径中包含了多余的"/"。
other_fs:原始文件位于其他文件系统中。
relative:符号连接使用了相对路径。

#参  数:
-c   将使用绝对路径的符号连接转换为相对路径。
-d   移除dangling类型的符号连接。
-r   检查目录下所有子目录中的符号连接。
-s   检查lengthy类型的符号连接。
-t   与-c一并使用时,会显示如何将绝对路径的符号连接转换为相对路径,但不会实际转换。
-v   显示所有类型的符号连接。

0x04 恢复与备份
extundelete 命令

描述:extundelete恢复Linux被删除文件,然后讨论到使用extundelete进行了恢复,抢救了部分未被覆盖的数据文件,该软件官方地址:http://extundelete.sourceforge.net/

安装extundelete:

代码语言:javascript复制
$ bunzip2 extundelete-0.2.0.tar.bz2
$ tar xvf extundelete-0.2.0.tar
$ cd extundelete-0.2.0
$./configure
$make && make install

实际案例:

代码语言:javascript复制
#1.恢复操作命令
#--umount或者read only 分区(如果umount不成功,可以通过fuser -km /www类似方法找出来占用进程),重新挂载
umount /dev/partition
mount -o remount,ro /dev/partition
#恢复文件
extundelete /dev/partition --restore-all
extundelete /dev/partition --restore-directory /backup/gnutool-delete
extundelete /dev/partition --restore-files /etc/passwd
# Loading filesystem metadata ... 160 groups loaded.
# Loading journal descriptors ... 23 descriptors loaded.
# Writing output to directory RECOVERED_FILES/


#示例2.基于目录恢复
extundelete /dev/sdb1 --restore-directory /tmp/xifenfei
$cd RECOVERED_FILES/
ll
total 4
drwxr-xr-x 3 root root 4096 Aug 31 21:36 xifenfei
$cd xifenfei/
$ll
total 20
drwxr-xr-x 2 root root  4096 Aug 31 21:36 xff
-rw-r--r-- 1 root root 13231 Aug 31 21:36 xff.txt
$cd xff
$ll
total 16
-rw-r--r-- 1 root root 13231 Aug 31 21:36 xff.txt132
--恢复成功

#示例3.基于磁盘恢复
extundelete /dev/sdb1  --restore-all

通过上述实验证明extundelete还是有很大的不完整性,基于整个磁盘的恢复功能较为强大,基于目录和文件的恢复还不够强大.不过该软件在很多时候还是有救火的功能,特别是当蛋筒的人员删除了数据库的部分文件之时.

cpio 命令

描述:主要是用来建立或者还原备份档的工具程序,cpio命令可以复制文件到归档包中,或者从归档包中复制文件。 基础语法:

代码语言:javascript复制
cpio 选项<[文件][设备]

#参数
-0或--null:接受新增列控制字符,通常配合find指令的“-print0”参数使用; 
-a或--rest-access-time:重新设置文件的存取时间; 
-A或--append:附加到已存在的备份文档中,且这个备份文档必须存放在磁盘上,而不能放置于磁带机里; 
-b或--awap:此参数的效果和同时指定“-ss”参数相同; 
-B:将输入/输出的区块大小改成5210Bytes; 
-c:使用旧ASCII备份格式; 
-C<区块大小>或--io-size=<区块大小>:设置输入/输出的区块大小,单位是Byte; 
-d或--make-directories:如有需要cpio会自行建立目录; 
-E<范本文件>或--pattern-file=<范本文件>:指定范本文件,其内含有一个或多个范本样式,让cpio解开符合范本条件的文件,格式为每列一个范本样式 
-f或--nonmatching:让cpio解开所有不符合范本条件的文件; 
-F<备份档>或--file=<备份档>:指定备份档的名称,用来取代标准输入或输出,也能借此通过网络使用另一台主机的保存设备存取备份档; 
-H<备份格式>:指定备份时欲使用的文件格式; 
-i或--extract:执行copy-in模式,还原备份档; 
-l<备份档>:指定备份档的名称,用来取代标准输入,也能借此通过网络使用另一台主机的保存设备读取备份档; 
-k:此参数将忽略不予处理,仅负责解决cpio不同版本间的兼容性问题; 
-l或--link:以硬连接的方式取代复制文件,可在copy-pass模式下运用; 
-L或--dereference:不建立符号连接,直接复制该连接所指向的原始文件; 
-m或preserve-modification-time:不去更改文件的更改时间; 
-M<回传信息>或--message=<回传信息>:设置更换保存媒体的信息; 
-n或--numeric-uid-gid:使用“-tv”参数列出备份档的内容时,若再加上参数“-n”,则会以用户识别和群组识别码替代拥有者和群组名称列出文件清单; 
-o或--create:执行copy-out模式,建立备份档; 
-O<备份档>:指定备份档的名称,用来取代标准输出,也能借此通过网络使用另一台主机的保存设备存放备份档; 
-p或--pass-through:执行copy-pass模式,略过备份步骤,直接将文件复制到目的目录; 
-r或--rename:当有文件名称需要更改时,采用互动模式; 
-R<拥有者><:/.><所属群组>或----owner<拥有者><:/.><所属群组> 在copy-in模式还原备份档,或copy-pass模式复制文件时,可指定这些备份,复制的文件的拥有者与所属群组; 
-s或--swap-bytes:交换每队字节的内容; 
-S或--swap-halfwords:交换每半个字节的内容; 
-t或--list:将输入的内容呈现出来; 
-u或--unconditional:置换所有文件,不论日期时间的新旧与否,皆不予询问而直接覆盖; 
-v或--verbose:详细显示指令的执行过程; 
-V或--dot:执行指令时。在每个文件的执行程序前面加上“.”号; 
--block-size=<区块大小>:设置输入/输出的区块大小,假如设置数值为5,则区块大小为2500,若设置成10,则区块大小为5120,以此类推; 
--force-local:强制将备份档存放在本地主机; 
--help:在线帮助; 
--no-absolute-filenames:使用相对路径建立文件名称; 
--no-preserve-owner:不保留文件的拥有者,谁解开了备份档,那些文件就归谁所有; 
-only-verify-crc:当备份档采用CRC备份格式时,可使用这项参数检查备份档内的每个文件是否正确无误; 
--quiet:不显示复制了多少区块; 
--sparse:倘若一个文件内含有大量的连续0字节,则将此文件存在稀疏文件; 
--version:显示版本信息

实际案例:

代码语言:javascript复制
#示例1.将/etc下的所有普通文件都备份到/opt/etc.cpio,使用以下命令:
find /etc –type f | cpio –ocvB >/opt/etc.cpio

#示例2. 将系统上所有资料备份到磁带机内,使用以下命令
find / -print | cpio -covB > /dev/st0  #这里的/dev/st0是磁带的设备名,代表SCSI磁带机(可以淘汰了)

#示例3.查看上例磁带机上备份的文件,使用以下命令:
#有时可能因为备份的文件过多,一个屏幕无法显示完毕,此时我们利用下面命令,让磁带机的文件信息输出到文件
cpio -icdvt < /dev/st0 > /tmp/st_content

#示例4.将示例1中的备份包还原到相应的位置,如果有相同文件进行覆盖,使用以下命令:
cpio –icduv < /opt/etc.cpio
#注意cpio恢复的路径,如果cpio在打包备份的时候用的是绝对路径,那么在恢复的时候会自动恢复到这些绝对路径下,
#本例就会将备份文件全部还原到/etc路径下对应的目录中,同理如果在打包备份用的是相对路径,还原时也将恢复到相对路径下

#通过上面的示例可以看出,cpio无法直接读取文件,它需要每个文件或者目录的完整路径名才能识别读取,而find命令的输出刚好做到了这点,因此cpio命令一般和find命令配合使用。

补充示例:

代码语言:javascript复制
#对于恢复RPM包中的命令脚本提取extract(rpm 安装软件)
$rpm -qf /bin/ls
coreutils-8.22-23.el7.x86_64
#我们使用MV /bin/ls /tmp/造成ls命令误删除假象
rpm2cpio /mnt/cdrom/Pakages/coreutils-8.4-19.el6.i686.rpm | cpio -idv ./bin/ls  #提取ls命令到指定目录, rpm2cpio 将rpm包转换为cpio格式的命令;
cp /root/bin/ls /bin/ #复制提取的ls二进制文件
rpm2cpio 命令

描述:可以将rpm包转换成为cpio可以识别的格式的命令,并方便cpio进行提取;(在Redhat系列使用)

代码语言:javascript复制
rpm2cpio 包全名 | cpio -idv 文件绝对路径
fsck 命令 - 检查和修复Linux文件系统

描述:fsc(file system check)k用于检查一个或多个Linux文件系统,并可选地修复它们。文件可以是设备名或者分区设备; 语法参数:

代码语言:javascript复制
#语  法:
fsck [-aANPrRsTV][-t <文件系统类型>][文件系统...]
#参  数:
-a   自动修复文件系统,不询问任何问题。
-A   依照/etc/fstab配置文件的内容,检查文件内所列的全部文件系统。
-C [fd] #显示支持文件系统检查器的完成/进度条(目前仅适用于ext[234])。fsck将管理文件系统检查器,以便一次只显示一个进度条。GUI前端可能指定文件描述符fd,在这种情况下,进度条信息将被发送到该文件描述符。
-N   不执行指令,仅列出实际执行会进行的动作。
-P   当搭配"-A"参数使用时,则会同时检查所有的文件系统。
-r   采用互动模式,在执行修复时询问问题,让用户得以确认并决定处理方式。
-R   当搭配"-A"参数使用时,则会略过/目录的文件系统不予检查。
-s   依序执行检查作业,而非同时执行。
-t   <文件系统类型>   指定要检查的文件系统类型。
-T   执行fsck指令时,不显示标题信息。
-V   显示指令执行过程。

fsck返回的退出码为以下条件:

代码语言:javascript复制
0      No errors
1      Filesystem errors corrected
2      System should be rebooted
4      Filesystem errors left uncorrected
8      Operational error
16     Usage or syntax error
32     Checking canceled by user request
128    Shared-library error

基础实例

代码语言:javascript复制
#1.逻辑坏道修复方法
fsck -a /dev/sda

# 2.
fsck -vcfy /dev/sda3
fsck.ext2 命令

描述:fsck.ext2(file system check-second filesystem)检查文件系统并尝试修复错误,当ext2文件系统发生错误时,可用fsck.ext2指令尝试加以修复;与fsck命令差不多只不过是指定文件系统类型而已.

代码语言:javascript复制
# 语  法:
fsck.ext2 [-acdfFnprsStvVy][-b <分区第一个磁区地址>][-B <区块大小>][-C <反叙述器>][-I <inode缓冲区块数>][-l/L <损坏区块文件>][-P <处理inode大小>][外围设备代号]


# 参  数:
-a   自动修复文件系统,不询问任何问题。
-b<分区第一个磁区地址>   指定分区的第一个磁区的起始地址,也就是Super Block。
-B<区块大小>   设置该分区每个区块的大小。
-c   检查指定的文件系统内,是否存在有损坏的区块。
-C<反叙述器>   指定反叙述器,fsck.ext2指令会把全部的执行过程,都交由其逆向叙述,便于排错或监控程序执行的情形。
-d   详细显示指令执行过程,便于排错或分析程序执行的情形。
-f   强制对该文件系统进行完整检查,纵然该文件系统在慨略检查下没有问题。
-F   检查文件系统之前,先清理该保存设备块区内的数据。
-I<inode缓冲区块数>   设置欲检查的文件系统,其inode缓冲区的区块数目。
-l<损坏区块文件>   把文件中所列出的区块,视为损坏区块并将其标示出来,避免应用程序使用该区块。
-L<损坏区块文件>   此参数的效果和指定"-l"参数类似,但在参考损坏区块文件标示损坏区块之前,会先将原来标示成损坏区块者统统清楚,即全部重新设置,而非仅是加入新的损坏区块标示。
-n   把欲检查的文件系统设成只读,并关闭互动模式,否决所有询问的问题。
-p   此参数的效果和指定"-a"参数相同。
-P  <处理inode大小>   设置fsck.ext2指令所能处理的inode大小为多少。
-r   此参数将忽略不予处理,仅负责解决兼容性的问题。
-s   检查文件系统时,交换每对字节的内容。
-S   此参数的效果和指定"-s"参数类似,但不论该文件系统是否已是标准位顺序,一律交换每对字节的内容。
-t   显示fsck.ext2指令的时序信息。
-v   详细显示指令执行过程。
-V   显示版本信息。
-y   关闭互动模式,且同意所有询问的问题。

0x05 存储设备扫描与管理
lvmdiskscan 命令 - 列出可以作为物理卷使用的设备

描述:该命令可以扫描系统中所有的SCSI、 (E)IDE磁盘、多路径设备 和 系统中其他一些块设备 以及 LVM pvs逻辑物理卷设备, 它获取的是真实设备存储空间大小;

注意:不赞成使用此命令,请使用pvs。

基础语法参数:

代码语言:javascript复制
# USAGE
lvmdiskscan
    [ -l|--lvmpartition ]
    [    --readonly ]
    [ COMMON_OPTIONS ]

Common options for lvm:
    [ -d|--debug ]
    [ -h|--help ]
    [ -q|--quiet ]
    [ -t|--test ]
    [ -v|--verbose ]
    [ -y|--yes ]
    [    --commandprofile String ]
    [    --config String ]
    [    --driverloaded y|n ]
    [    --lockopt String ]
    [    --longhelp ]
    [    --profile String ]
    [    --version ]

基础实例:

代码语言:javascript复制
$lvmdiskscan
/dev/sda1 [       1.00 GiB]
/dev/sda2 [     <49.00 GiB] LVM physical volume
0 disks
1 partition
0 LVM physical volume whole disks
1 LVM physical volume

0x06 逻辑虚拟设备
pvs 命令 - 显示关于物理卷的信息

描述:该命令显示关于物理卷的信息

语法参数:

代码语言:javascript复制
#USAGE
pvs
  [ -a|--all ]
  [ -o|--options String ]
  [ -S|--select String ]
  [ -O|--sort String ]
  [    --segments ]
  [    --aligned ]
  [    --binary ]
  [    --configreport log|vg|lv|pv|pvseg|seg ]
  [    --foreign ]
  [    --ignorelockingfailure ]
  [    --logonly ]
  [    --nameprefixes ]
  [    --noheadings ]
  [    --nosuffix ]
  [    --readonly ]
  [    --reportformat basic|json ]
  [    --rows ]
  [    --separator String ]
  [    --shared ]
  [    --unbuffered ]
  [    --units r|R|h|H|b|B|s|S|k|K|m|M|g|G|t|T|p|P|e|E ]
  [    --unquoted ]
  [ COMMON_OPTIONS ]
  [ PV|Tag ... ]
  
  Common options for lvm:
           [ -d|--debug ]
           [ -h|--help ]
           [ -q|--quiet ]
           [ -t|--test ]
           [ -v|--verbose ]
           [ -y|--yes ]
           [    --commandprofile String ]
           [    --config String ]
           [    --driverloaded y|n ]
           [    --lockopt String ]
           [    --longhelp ]
           [    --nolocking ]
           [    --profile String ]
           [    --version ]

基础语法:

代码语言:javascript复制
# 1.显示所有的物理卷设备信息并采用指定分隔符分隔
pvs -a --separator " | "
PV | VG | Fmt | Attr | PSize | PFree
/dev/sda1 |  |  | --- | 0  | 0
/dev/sda2 | centos | lvm2 | a-- | <49.00g | 4.00m

0 人点赞