linux磁盘管理1-分区格式化挂载,swap,df,du,dd
一些基础
硬盘接口类型
- ide 早期家庭电脑 scsi 早期服务器 这两个目前已经被淘汰
- sata 目前家庭电脑 sas 目前服务器,是新一代的scsi技术,向下兼容stat, ssd
- raid卡--阵列卡
- 网卡绑定
- ABI 应用程序与OS之间的底层接口
- API 应用程序调用第三方库的接口
- Windows 磁盘分区方式,不同的方式,BIOS的设置是不同的
- 硬盘分区格式为MBR格式,启动模式应该为Legacy;
- 硬盘分区格式为GUID(GPT)格式,启动模式应该为UEFI
- BIOS+MBR 以前的方式,分区最大支持2T 与UEFI+GPT 是目前最新的方式,硬盘支持容量特别大
- 硬盘寻址方式与空间大小:由于CHS寻址方式的寻址空间在大概8GB以内,所以在磁盘容量小于大概8GB 时,可以使用CHS寻址方式或是LBA寻址方式;在磁盘容量大于大概8GB时,则 只能使用LBA寻址方式
nvme是协议,m.2是接口类型,sata,pcie就是通道不一样,pcie相当于顺丰快递,sata就是普通快递
nvme是一种协议,走的是PCle通道,速度超级快。而普通的M.2 走的是SATA通道,发挥不出M.2的优势,和普通的SATA接口差不多。
走sata的速度跟传统sata接口的没区别,就是接口变成了m2的了。走pcie的,就是我们说的nvme接口是m2的,性能也强了。
大部分 服务器接口都是sas盘,sas盘容量一般300G(15K,价格1300),600G,假 sas 盘=stat盘身+sas接口,就是普通家庭用的盘2T 1千块,符合市场需求
假 sas 盘,提速度,做raid5,raid10 或者分部署存储,MFS,HDFS,GFS,swift,ceph
设备在Linux的命名方式:
SCSI, SATA, SAS, IDE,USB: /dev/sd ? 设备都以/dev/sd开头
虚拟磁盘:/dev/vd 、/dev/xvd ?
不同磁盘标识:a-z,aa,ab… /dev/sda, /dev/sdb, ... ? 第一块磁盘就是a ,第二块就是b.....
同一设备上的不同分区:1,2, ... /dev/sda1, /dev/sda5 第一个分区就是1,第二个分区就是2....
分区类型
MBR:(只支持2T的硬盘分区)
- 主分区:一块硬盘最多四个,最少一个,安装OS,只有1个是激活主分区
- 扩展分区:一块硬盘最多一个,不能直接使用,需要划分成更小的逻辑分区
- 逻辑分区:扩展分区的最小分区单位
- 在Linux中 MBR分区类型,主分区和扩展分区只能有1-4个,扩展分区从5往后。
- Master Boot Record
- 0磁道0扇区:512bytes 446bytes: boot loader 64bytes:分区表,其中每16bytes标识一个分区 2bytes: 55AA
比如 Linux分区方案
/dev/sda 200G
/dev/sda1 mount /boot 1G mount point
/dev/sda2 mount / 100G
/dev/sda3 mount /data 50G
/dev/sda4 extend 49G
/dev/sda5 逻辑分区 swap 4G
有一块200G的硬盘,3个主分区1个扩展分区,扩展分区分了剩余的所有空间,扩展分区中分了4G的逻辑分区给swap,swap分区是Linux的(虚拟内存)没有挂载点
MBR 最前面的512字节中,有MBR分区表,这个表记录了分区的情况
GPT:只支持主分区 uuidgen //生成UUID guid:128位二进制 32位16进制
管理分区
1分区 2格式化(文件系统) 3挂载
Parted工具适用于MBR分区和GPT分区,fdisk分区工具只适用于MBR分区。
使用 parted 做gpt分区 yum install -y parted parted /dev/vdb mklabel gpt mkpart primary 1 100% ////划分一个主分区、分区名为primary且100%容量给到第一个分区 align-check optimal 1 ///检查分区是否对齐,1是对应的分区号 print ////查看分区表 quit
gdisk /dev/sdb 类fdisk 的GPT分区工具
fdisk -l [-u] [device...] 查看分区
fdisk /dev/sdb 管理分区
子命令:
- p 分区列表
- t 更改分区类型
- n 创建新分区
- d 删除分区
- v 校验分区
- u 转换单位
- w 保存并退出
- q 不保存并退出
- fdisk -l 磁盘硬盘分区详细情况(专门针对于mbr分区的,管理gpt分区处于试验阶段,不太适配)
- lsblk 列出块设备
- echo '- - -' > /sys/class/scsi_host/host2/scan 重新扫描磁盘,添加一块硬盘后,重启之后才可以识别到,这样就不用重启了 host0 host1 host2
- 有时候磁盘满了需要删文件使磁盘使用率降下来,但是有一些进程会占用它,当你删除之后还是那么大,可以用这个命令立刻让这个文件变成0 >2019-11-08.log
1)使用fdisk创建完分区之后,默认是mbr分区方式,可以通过 fdisk -l 查看,分好区之后,可以把分区删除掉,把分区删掉之后,在通过 fdisk -l 查看分区,就会看到没了分区了,但是还是存在分区类型的,为什么会存在?
就是因为前512字节中存在 55aa标志位,所以他认为你之前分过区了,怎么让硬盘变得跟新的一样呢?
dd if=/dev/zero of=/dev/sdb bs=1 count=2 seek=510 //把标志位清空
2) 我们通过fdisk 分完区之后,退出的时候要注意看提示信息,一般新的硬盘你分好之后,内存和硬盘都会分好的,你就可以直接用了,但是如果你分的是之前分过的硬盘,那么你退出后,就会有报警,因为你是分好了,但是内存中没有同步到,你用 fdisk –l 可以看到分好的分区(fdisk 是读取物理磁盘真实的情况,而其他的查看分区命令 如lsblk, ls /dev/sda*,cat /proc/partitions,是读取内存中的分区情况)
同步问题 要么重启 要么下面的命令
centos6
加分区:partx -a /dev/sda
删除分区: partx -d --nr 5-7 /dev/sda
centos5,7
partprobe
Partprobe
3) 有两快硬盘,第一块分区分好了,按照同样的方法把第二块也分一下,
两块硬盘分区同步,第二块硬盘按照第一块硬盘分区方式同步,本质就是同步了第一块硬盘的MBR的前64个字节(主分区与扩展分区) 逻辑分区同步不了,逻辑分区的分区信息是在EBR里面的,所以可以看出,一块硬盘有没有分区,分区格式是什么,分区情况是什么,都是存在MBR表里面的,下面的命令就是同步了MBR的分区表
4)那既然一块硬盘有没有分区本质是看MBR表的,那快速清理一个硬盘的分区,就直接把分区表的字节改一下
建立文件系统(格式化)
mkfs命令:
(1) mkfs.FS_TYPE /dev/DEVICE
-
-
-
- ext4
- xfs
- btrfs
- vfat
-
-
对于已经存在了文件系统的分区,重新格式化需要加-f选项
blkid //查看分区的详细信息 文件系统和UUID
Linux和Windows的文件系统类型 不一样~~~
Linux:常用文件格式 ext2 ext3 ext4 xfs fat
Windows:常用文件格式 FAT32, exFAT,NTFS
文件系统的修复, 注意:一定不要在挂载状态下执行下面命令修复,虽然可以修复,但是也可能会丢数据
- xfs_repair /dev/sda3 ////直接修复
- xfs_check /dev/sda3; echo $? ///检查
- A)如果为0===》成功修复。
- B) 如果不为0===》没有成功:
挂载
- 挂载方法:mount DEVICE MOUNT_POINT
- mount:通过查看/etc/mtab文件显示当前已挂载的所有设备
- 挂载点下原有文件在挂载完成后会被临时隐藏
- 挂载点目录一般为空 事先存在,建议使用空目录
- -r readonly,只读挂载
- -w read and write, 读写挂载
- df -hl 查看挂载情况
- 一个设备可以挂载到多个目录下,一个目录一次只能挂载一个设备
- 也支持文件夹,往文件夹上挂 mount -B /boot /home/newuser/
- 也可以把文件 往文件夹上挂,但是这个文件需要有文件系统,我们可以创建一个大文件,然后格式化它,然后就可以挂载到文件夹下了,(有点类似于u盘)
centos7 可以直接挂载文件,虽然一个文件成功挂载到了目录上,但是通过df -h 查看看到的设备是loop0, 因为系统自动为这个文件分配了一个设备名称关联上,自动的
如果是centos6的话 还需要人工挂载的时候 指定,这样才能把一个文件挂载到一个目录上
# 将做好的文件系统挂载到 newuser 文件夹上
mount /dev/sdb1 /home/newuser/
mount -o ro /dev/sdb1 /home/newuser/ ------ mount -r /dev/sdb1 /home/newuser/ //两个都一样 只读方式挂载
卸载
- umount DEVICE
- umount MOUNT_POINT
- 取消挂载的时候,要退出这个目录,不能再目录里面,自己把自己杀掉?也有可能是其他进程访问了,所以 fuser –km MOUNT_POINT 所有对这个文件访问的进程都杀掉。
- 查看挂载情况 findmnt MOUNT_POINT|devic 查看这个是不是一个挂载点,或者一个设备有没有被挂载
持久挂载/etc/fstab
/etc/fstab 就是文件系统挂载表
写到这个文件中,就可以持久挂载,当然也可以写设备的UUID
示例: /dev/sdb1 /home/newuser/ ext4 defaults 0 0
写完之后,重新加载 mount -a
如果是文件夹挂文件夹,或者挂载光盘呢?
/boot /mnt/boot none bind 0 0
/dev/sr0 /mnt/cdrom iso9660 defaults 0 0
扩展swap分区
为什么要扩展,swap的大小一般取决于内存的大小,当你物理内存发生变化时,swap也要变化,但是分区怎么变大?都已经分好区了,是没有办法变大的,所以只能扩展
1,先分区,分区的时候注意更改 ID号82
2,格式化 mkswap /dev/sdb1 专门的命令格式化swap分区
3,挂载,写在 /etc/fstab 中,仿照之前的swap写,然后swapon -a 重新到 /etc/fstab 加载swap空间
所以现在就是有两个swap分区,当使用swap时,会先使用哪一个分区呢,这个也可以设置的
使用文件当swap
dd if=/dev/zero of=/swapfile bs=1M count=2048 创建2G的大文件
光盘
- 在图形环境下自动启动挂载/run/media/<user>/<label>
- 否则就必须被手工挂载 mount /dev/cdrom /mnt/
- 操作光盘: eject 弹出光盘 eject -t 弹入光盘
- 创建ISO文件 cp /dev/cdrom /root/centos.iso
- mkisofs -r -o /root/etc.iso /etc 把etc整个目录打包制作成ISO文件
- 刻录光盘 wodim –v –eject centos.iso
df 分区挂载设备的使用情况
df [OPTION]... [FILE]...
- -H 以10为单位
- -T 显示文件系统类型
- -h human-readable
- -i inodes instead of blocks
- -P 以Posix兼容的格式输出 格式不跑偏
du查看目录大小
du [OPTION]... DIR
- -h human-readable
- -s summary 汇总
- --max-depth=# 指定最大目录层级
du -sh(在当前目录下运行) ==== du -sh .(在当前目录下运行) == du -sh /usr/ 显示这个目录的总大小
du -sh * =====du -sh /usr/* 对当前目录下每一个目录和文件的大小分别进行汇总(不包括总目录的大小), 但是使用 du -shc * 就会在最后一行显示出目录的总大小
du -h --max-depth=1 这个命令我感觉是废物,只能看到目录的大小,不能看到文件的大小
dd 命令:convert and copy a file
用法:
- dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=#
- if=file 从所命名文件读取而不是从标准输入
- of=file 写到所命名的文件而不是到标准输出
- ibs=size 一次读size个byte
- obs=size 一次写size个byte
- bs=size block size, 指定块大小(既是是ibs也是obs)
- cbs=size 一次转化size个byte
- skip=blocks 从开头忽略blocks个ibs大小的块
- seek=blocks 从开头忽略blocks个obs大小的块
- count=n 复制n个bs
命令实例
备份MBR
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
破坏MBR中的bootloader
dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
有一个大与2K的二进制文件fileA。现在想从第64个字节位置开始读取,需要读 取的大小是128Byts。又有fileB, 想把上面读取到的128Bytes写到第32个字节开 始的位置,替换128Bytes,实现如下
dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc
备份:
dd if=/dev/sdx of=/dev/sdy
将本地的/dev/sdx整盘备份到/dev/sdy 第二个磁盘肯定要比第一个硬盘大
dd if=/dev/sdx of=/path/to/image
将/dev/sdx全盘数据备份到指定路径的image文件
dd if=/dev/sdx | gzip >/path/to/image.gz
备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径
恢复:
dd if=/path/to/image of=/dev/sdx
将备份文件恢复到指定盘
gzip -dc /path/to/image.gz | dd of=/dev/sdx
将压缩的备份文件恢复到指定盘
- 拷贝内存资料到硬盘
- dd if=/dev/mem of=/root/mem.bin bs=1024
- 将内存里的数据拷贝到root目录下的mem.bin文件
- 从光盘拷贝iso镜像
- dd if=/dev/cdrom of=/root/cd.iso
- 拷贝光盘数据到root文件夹下,并保存为cd.iso文件
- 销毁磁盘数据
- dd if=/dev/urandom of=/dev/sda1
- 利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据,执行此操作 以后,/dev/sda1将无法挂载,创建和拷贝操作无法执行