Pages

Friday, 22 January 2021

Linux的磁盘管理命令

 df

df(Disk Free)命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。


语法:

df [-ahikHTm] [目录或文件名]

选项与参数:


-a: 列出所有的文件系统,包括系统特有的 /proc 等文件系统;

-k: 以 KBytes 的容量显示各文件系统;

-m: 以 MBytes 的容量显示各文件系统;

-h: 以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;

-H: 以 M=1000K 取代 M=1024K 的进位方式;

-T: 显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;

-i: 不用硬盘容量,而以 inode 的数量来显示

常用方法:


df -h

df -Th

df -iah

du

Linux du(Disk Usage)命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的,这里介绍Linux du命令。


语法:


du [-ahskm] 文件或目录名称

选项与参数:


-a: 列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。

-h: 以人们较易读的容量格式 (G/M) 显示;

-s: 列出总量而已,而不列出每个各别的目录占用容量;

-S: 不包括子目录下的总计,与 -s 有点差别。

-k: 以 KBytes 列出容量显示;

-m: 以 MBytes 列出容量显示;

常用参数:


du -sh .



fdisk

fdisk 是 Linux 的磁盘分区表操作工具。


语法:

fdisk [-l] 装置名称

选项与参数:

-l: 输出后面接的装置所有的分区内容。若仅有 fdisk -l 时, 则系统将会把整个系统内能够搜寻到的装置的分区均列出来。

常用命令: d,m,p,n,t,w,q



mkfs

磁盘格式化命令。磁盘分割完毕后自然就是要进行文件系统的格式化,格式化的命令非常的简单,使用 mkfs(make filesystem) 命令。


语法:

mkfs [-t 文件系统格式] 装置文件名

选项与参数:


-t: 可以接文件系统格式,例如 ext3, ext2, vfat 等(系统有支持才会生效)

常用命令:mkfs.ext4,mkfs.xfs



fsck

fsck(file system check)用来检查和维护不一致的文件系统。

若系统掉电或磁盘发生问题,可利用fsck命令对文件系统进行检查。


语法:

fsck [-t 文件系统] [-ACay] 装置名称

选项与参数:

-t: 给定档案系统的型式,若在 /etc/fstab 中已有定义或 kernel 本身已支援的则不需加上此参数

-s: 依序一个一个地执行 fsck 的指令来检查

-A: 对/etc/fstab 中所有列出来的 分区(partition)做检查

-C: 显示完整的检查进度

-d: 打印出 e2fsck 的 debug 结果

-p: 同时有 -A 条件时,同时有多个 fsck 的检查一起执行

-R: 同时有 -A 条件时,省略 / 不检查

-V: 详细显示模式

-a: 如果检查有错则自动修复

-r: 如果检查有错则由使用者回答是否修复

-y: 选项指定检测每个文件是自动输入yes,在不确定那些是不正常的时候,可以执行 # fsck -y 全部检查修复。



mount and umount

Linux 的磁盘挂载使用 mount 命令,卸载使用 umount 命令。

磁盘挂载语法:

mount [-t 文件系统] [-L Label名] [-o 额外选项] [-n]  装置文件名  挂载点

磁盘卸载命令 umount 语法:

umount [-fn] 装置文件名或挂载点

选项与参数:

-f: 强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;

-n: 不升级 /etc/mtab 情况下卸除。


lsblk

lsblk(列出块设备)命令用于列出所有可用块设备的信息,但是,它不会列出RAM盘的信息。块设备有硬盘,闪存盘,CD-ROM等等。


lsblk 命令默认情况下将以 「 树状 」 列出所有块设备。在终端输入以下命令:

$ lsblk

输出结果如下:


[root@AbsentM ~]# lsblk

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT

sda      8:0    0 557.9G  0 disk

├─sda1   8:1    0     1M  0 part

├─sda2   8:2    0   500M  0 part /boot

├─sda3   8:3    0 299.4G  0 part

├─sda4   8:4    0     1K  0 part

├─sda5   8:5    0  97.7G  0 part /

├─sda6   8:6    0  97.7G  0 part /var/log

├─sda7   8:7    0  62.5G  0 part [SWAP]

└─sda8   8:8    0   196M  0 part /boot/efi

sdb      8:16   0   200G  0 disk

├─sdb1   8:17   0   150G  0 part /var/lib/cache

└─sdb2   8:18   0    50G  0 part

7 个列的名称解释如下:


NAME : 块设备名称。

MAJ:MIN : 显示主要和次要设备号。

RM : 显示设备是否可移动设备。 RM 值为 1, 表示为可移动设备。

SIZE : 列出设备的容量大小信息。

RO : 表明设备是否为只读。 RO 值为 0, 表示只读。

TYPE : 显示块设备是否是磁盘或磁盘上的一个分区。 disk 表示磁盘,part 表示分区,rom 表示只读存储器。

MOUNTPOINT : 显示设备挂载的挂载点。

常用参数:

lsblk -ao +FSTYPE,LABEL,UUID,PARTLABEL,PARTUUID,SERIAL,MODEL



blkid

blkid 命令可以显示关于可用块设备的信息,如:设备名称、UUID(文件系统唯一标示符)、Type(文件系统类型)、PARTLABEL、PARTUUID 等信息。

列出几个 blkid 命令支持的可用参数:


-o: output format; can be one of: value, device, export or full; (default: full)

-s: show specified tag(s) (default show all tags)

-t: find device with a specified token (NAME=value pair)

-L: convert LABEL to device name

-U: convert UUID to device name



dd

介绍

dd是一个Unix和类Unix系统上的命令,主要功能为转换和复制文件。

在Unix上,硬件的设备驱动(如硬盘)和特殊设备文件(如/dev/zero和/dev/random)就像普通文件一样,出现在文件系统中;只要在各自的驱动程序中实现了对应的功能,dd也可以读取自和/或写入到这些文件。这样,dd也可以用在备份硬件的引导扇区、获取一定数量的随机数据等任务中。dd程序也可以在复制时处理数据,例如转换字节序、或在ASCII与EBCDIC编码间互换。[2]

——引用自dd (Unix)维基百科,自由的百科全书,https://zh.wikipedia.org/wiki/Dd_(Unix)


简单地说,dd命令用于将一个位置(可以是磁盘或文件,甚至其它设备)的内容逐字节地复制到另一个位置。该 Linux 命令非常有用,其功能非常强大,但这里我们只涉及它用于磁盘备份与恢复这个方面的功能


简单使用

备份磁盘有效部分(已分区部分,可以通过命令fdisk或lsblk命令查看):

dd if=/dev/sdb  of=multiboot_upan.img bs=64M count=321 status=progress

简单说明一下上面使用的参数:

if: input file,输入文件(因为Linux中一切皆文件)

of: ouput file,输出文件

bs: block size,一次复制的块的大小,据说和速度有一定的关系,但我没感受出来

count: 块的数量。count*bs=复制的总大小

status: 输出信息的详尽程度。常用的是status=progress,用于输出进度条

更多参数参考man dd


注意,备份太多或太少都不行,太多(如未分区的部分)会占用大量磁盘空间,太少会导致还原失败,所以比有效部分稍微大一点就可以了。还原也很简单:

dd if=multiboot_upan.img of=/dev/sdb bs=64M  status=progress

(我突然有点好奇,如果把一个 Windows 系统直接这样备份后在另一台电脑上还原是否可以直接使用(不需要激活)?理论上是可以的,因为它是完全复制了的,除非密钥和硬件绑定了。细细想来,感觉应该是不行)


配合 gzip 命令

正常情况下,你的磁盘的有效部分有多大,那么备份之后的文件就有多大。比如说,我有个 Ubuntu 装在了一个120G的固态硬盘上,但系统本身只有 9G ,且只分了两个区,一个文件系统格式为FAT32大小为 200MB 的ESP分区,一个文件系统格式为ext4的大小为将近120G的用于挂载/的分区,那么使用dd命令后,你生成的备份文件将是 120GB ,而不是 9GB。(这里忘了说swap分区了,不过并不影响)

因此,为了减小备份文件的大小,我们配合 gzip 命令使用:


dd bs=512 count=[fdisk命令中最大的end数+1] if=/dev/sda | gzip > backup.img.gz


还原:

gzip -dc backup.img.gz | dd of=/dev/sda


注意:gzip命令不会保留原文件,如果想保留原文件,可以使用重定向:

gzip < file > file.gz

关于“通过 dd 命令得到的 img 镜像文件”

挂载 img 文件

以 CentOS 为例


映射到 loop 设备

对于 MBR 磁盘使用如下命令即可:

losetup --find --partscan foo.img

  

使用如下命令验证:

lsblk

对于 GPT 磁盘使用如下命令:

losetup -f foo.img # 可以使用`losetup`命令验证

kpartx -av /dev/loop0  

  

同样使用lsblk命令验证:

root@master:~# lsblk

NAME      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

sda         8:0    0   32G  0 disk

├─sda1      8:1    0    1G  0 part /boot

├─sda2      8:2    0   29G  0 part /

└─sda3      8:3    0    2G  0 part [SWAP]

loop0       7:0    0  710M  0 loop

├─loop0p1 253:0    0  200M  0 part

├─loop0p2 253:1    0    1M  0 part

├─loop0p3 253:2    0    1M  0 part

└─loop0p4 253:3    0  500M  0 part

  

也可以使用如下命令验证:

root@master:~# ls /dev/mapper/

loop0p1  loop0p2  loop0p3  loop0p4

挂载:

mount /dev/mapper/loop0p1 /mnt/usb

  

卸载 img 文件:

umount /dev/mapper/loop0*

kpartx -d /dev/loop0

losetup -D

  

更多其它的磁盘命令可以参考磁盘管理_Linux命令大全:http://man.linuxde.net/sub/%E7%A3%81%E7%9B%98%E7%AE%A1%E7%90%86

  

resize img 文件

按前几节的内容挂载好 img 文件后,执行如下命令:

for part in /dev/mapper/loop0p*; do

    mount $part /mnt

    dd if=/dev/zero of=/mnt/filler conv=fsync bs=1M

    rm /mnt/filler

    umount /mnt

  done

dd: error writing ‘/mnt/filler’: No space left on device

dd: error writing ‘/mnt/filler’: No space left on device

详情参考: How to resize img file created with dd: https://superuser.com/questions/610819/how-to-resize-img-file-created-with-dd

  

img 文件格式转换

img to vdi。通过这个可以让u盘中的或者磁盘中的操作系统在虚拟机(我用的Virtual Box)中运行。亲测可行:

VBoxManage convertdd dd-image.raw sda.vdi --format VDI

  

可以使用如下命令查看相关帮助:

VBoxManage convertdd

vdi to img。通过这个可以让虚拟机中的操作系统直接复制到u盘中运行。尚未尝试,不知是否可行


VBoxManage clonemedium sda.vdi dd-image.raw --format raw

  

同样可以使用如下命令查看相关帮助:

VBoxManage clonemedium

  

遇到过的问题:

挂载 NTFS 文件系统

对于Ubuntu而言,通常无需手动安装 ntfs-3g(因为默认安装好了)。但是对于CentOS而言需要手动安装 nfs-3g


如果您使用的是CentOS / RHEL,则此软件包来自EPEL,因此,如果您尚未将系统配置为使用EPEL存储库,请运行以下命令:

yum install epel-release -y # ntfs-3g 来自 EPEL

yum install ntfs-3g -y

mount /dev/sda3 /mnt/usb

  

挂载 HFSPLUS 文件系统(mac OS)

参考 Mount HFS & HFSPLUS (Apple Filesystem Types): https://www.centos.org/forums/viewtopic.php?t=67360

 

导入 GPG 密钥:

   rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org

  

安装ELRepo

对于 CentOS-7:

rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

  

对于 CentOS-6:

rpm -Uvh https://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm

  

安装kmod-hfs:

yum install kmod-hfs

  

安装kmod-hfsplus:

yum install kmod-hfsplus

  

安装hfsplus-tools:

yum install hfsplus-tools

  

确认安装:

rpm -qa | grep hfsplus

  

挂载

mount /dev/sda2 /mnt/usb

  

How can I monitor disk io?

使用 sysstat 包中sar命令和iostat命令即可.

参见 linux - How can I monitor disk io? - Unix & Linux Stack Exchange: https://unix.stackexchange.com/questions/55212/how-can-i-monitor-disk-io

  

  扩容分区?

sudo parted /dev/sdb resizepart 1 68G

sudo e2fsck -f /dev/sdb1

sudo resize2fs /dev/sdb1 62G

  

get UUID in /etc/fstab?

sudo blkid

  

下面总结了本文中使用的所有链接:

No comments:

Post a Comment