且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

磁盘基础知识

更新时间:2022-09-15 20:11:37

新加硬盘识别   (磁盘设备名是不稳定的 在生产中有关磁盘的配置文件 需注意)

[root@centos6 httpd-2.4.27]#echo '- - -'>/sys/class/scsi_host/host2/scan

块设备:block,存取单位,磁盘       随机读写        /dev/sda

字符设备:char,存取单位字符,键盘  顺序读写     /dev/zero  /dev/null

设备号码:

主设备号major number, 标识设备类型

次设备号minor number, 标识同一类型下的不同设备

[root@centos6 httpd-2.4.27]#ll /dev/sd*

brw-rw----. 1 root disk 8,  0 Aug  1 21:14 /dev/sda

brw-rw----. 1 root disk 8, 1 Aug  1 21:14 /dev/sda1

[root@centos6 httpd-2.4.27]#ll /dev/zero

crw-rw-rw-. 1 root root 1, 5 Aug  1 21:14 /dev/zero

[root@centos6 httpd-2.4.27]#cp -a /dev/sda /app           

[root@centos6 httpd-2.4.27]#ll /app/sda

brw-rw----. 1 root disk 80 Aug  1 21:14 /app/sda           cp -a 复制设备保留全属性

[[root@centos6 httpd-2.4.27]#mknod /app/sda1 b 8 1     app下创建与/dev/sda1相同的块设备

[root@centos6 httpd-2.4.27]#ll /app

total 4

 

brw-rw----. 1 root disk 8, 0 Aug  1 21:14 sda

brw-r--r--. 1 root root 8, 1 Aug  2 19:18 sda1              设备号相同 但权限发生改变

[root@centos6 httpd-2.4.27]#mkdir /mnt/sda1

[root@centos6 httpd-2.4.27]#mount /app/sda1 /mnt/sda1         

[root@centos6 httpd-2.4.27]#df

Filesystem     1K-blocks    Used Available Use% Mounted on

/dev/sda2       50264772 4227636  43477136   9% /

tmpfs             953640     228    953412   1% /dev/shm

/dev/sda3        9948012   22476   9413536   1% /app

/dev/sda1         999320   40128    906764   5% /boot

/dev/sr0         3878870 3878870         0 100% /media/CentOS_6.9_Final

/app/sda1         999320   40128    906764   5% /mnt/sda1

[root@centos6 httpd-2.4.27]#cd /mnt/sda1

[root@centos6 sda1]#ls

config-2.6.32-696.el6.x86_64  initramfs-2.6.32-696.el6.x86_64.img    symvers-2.6.32-696.el6.x86_64.gz

efi                           initrd-2.6.32-696.el6.x86_64kdump.img  System.map-2.6.32-696.el6.x86_64

grub                          lost+found                             vmlinuz-2.6.32-696.el6.x86_64

[root@centos6 sda1]#cd /boot

[root@centos6 boot]#ls

config-2.6.32-696.el6.x86_64  initramfs-2.6.32-696.el6.x86_64.img    symvers-2.6.32-696.el6.x86_64.gz

efi                           initrd-2.6.32-696.el6.x86_64kdump.img  System.map-2.6.32-696.el6.x86_64

grub                          lost+found 

/app/sda1 /dev/sda1为相同设备号 为同一设备 它们的挂载点/mnt/sda1  /boot访问内容相同

[root@centos6 boot]#umount /mnt/sda1           取消挂载

 

CHS Ü 采用24bit位寻址 Ü 其中前10位表示cylinder,中间8位表示head,后面6位表示 sector Ü 最大寻址空间8GB

LBAlogical block addressing Ü LBA是一个整数,通过转换成CHS格式完成磁盘具体寻址 Ü LBA采用48bit位寻址 Ü 最大寻址空间128PB

磁盘容量大于大概8GB时,则只能使用LBA寻址方式

 

两种分区方式:MBRGPT

MBR  使用32位表示扇区 数,分区不超过2T

v0磁道0扇区就叫MBR

512bytes            446bytes: boot loader 

                              启动计算机和出错信息   MBR+BIOS 操作系统启动

                              64bytes:分区表 重要

                      存的是硬盘的分区情况  16bytes标识一个分区 最多4 只有一个活动分区

                              2bytes: 55AA   重要

                              表示磁盘是有分区的

v4个主分区;3主分区+1扩展(N个逻辑分区)

 

 GPT

 使用128UUID(Universally Unique Identifier) 表示磁盘 和分区

GPT分区表自动备份在头和尾两份,并有CRC校验位 v

UEFI (统一扩展固件接口)硬件支持GPT,使操作系统启动    GPT+UEFI 操作系统启动

EFI部分又可以分为5个区域:MBR保护区(MBR兼容)EFI信息区(GPT头部)、分区表、GPT分区、备份区域

MBR+BIOS sda  + gpt sdb  (MBR保护区与MBR兼容)

 

管理分区

v 列出块设备 • lsblk

创建分区使用:

 • fdisk 创建MBR分区

 • gdisk 创建GPT分区

 • parted 高级分区操作

parted命令

parted的操作都是实时生效的,小心使用

用法:parted [选项]... [设备 [命令 [参数]...]...]

 parted /dev/sdb mklabel gpt|msdos    指明分区方式

 parted /dev/sdb print             显示硬盘分区信息

parted /dev/sdb mkpart primary 1 200 (默认M  创建分区

 parted /dev/sdb rm 1   删除分区 

parted -l 查看分区类型

 

[root@centos6 ~]#lsblk

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

sr0     11:0    1  3.7G  0 rom  /media/CentOS_6.9_Final

sda      8:0    0  200G  0 disk

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

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

├─sda3   8:3    0  9.8G  0 part /app

├─sda4   8:4    0    1K  0 part

└─sda5   8:5    0    2G  0 part [SWAP]

sdb      8:16   0   20G  0 disk

sdc      8:32   0   30G  0 disk

sdd      8:48   0   40G  0 disk

sde      8:64   0   50G  0 disk

[root@centos6 ~]#hexdump -c -n 512 /dev/sdb                        sdb512个字节   5a为为空的 未分区

0000000  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0

*

0000200

[root@centos6 ~]#parted /dev/sdb mklabel gpt

[root@centos6 ~]#hexdump -C -n 512 /dev/sdb

00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

*

000001c0  01 00 ee fe ff ff 01 00  00 00 ff ff 7f 02 00 00  |................|

000001d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

*

000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|    55 aaMBR保护区  MBR兼容

[root@centos6 ~]#parted /dev/sdb print

Model: VMware, VMware Virtual S (scsi)

Disk /dev/sdb: 21.5GB

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

Partition Table: gpt

 

Number  Start  End  Size  File system  Name  Flags

[root@centos6 ~]#parted /dev/sdb mkpart primary 1 1024

[root@centos6 ~]#parted /dev/sdb print

Number  Start   End     Size    File system  Name     Flags

 1      1049kB  1024MB  1023MB               primary

 

[root@centos6 ~]#parted /dev/sdb mklabel msdos

[root@centos6 ~]#parted /dev/sdb print

Model: VMware, VMware Virtual S (scsi)

Disk /dev/sdb: 21.5GB

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

Partition Table: msdos

 

Number  Start  End  Size  Type  File system  Flags

由于表结构不同 gpt msdosMPR)转换为破坏性转换  禁止该操作

[root@centos6 ~]#parted /dev/sdb mkpart primary 1 1024

[root@centos6 ~]#parted /dev/sdb mkpart primary 1025 3045

[root@centos6 ~]#parted /dev/sdb print

Number  Start   End     Size    Type     File system  Flags

[root@centos6 ~]#parted /dev/sdb print

 1      1049kB  1024MB  1023MB  primary

 2      1025MB  3045MB  2020MB  primary

[root@centos6 ~]#parted /dev/sdb rm 2

 

分区工具fdiskgdisk

gdisk 处理gpt分区

               gdisk|fdisk /dev/sda 管理分区如创建等     在创建分区切勿操作如 gdisk|fidsk /dev/sda1 错误操作

[root@centos6 ~]#dd if=/dev/zero of=/dev/sdb bs=1 count=512

[root@centos6 ~]#gdisk -l /dev/sdb

Number  Start (sector)    End (sector)  Size       Code  Name

   1            2048         2000895   976.0 MiB   8300  Linux filesystem

   2         2000896         6291456   2.0 GiB     8300  Linux filesystem

   3         6293504        16779263   5.0 GiB     8300  Linux filesystem

对于gpt分区 破坏文件的分区表  由于gpt存在备份区域 所以无影响

对于MBR分区 如果一个磁盘已经分区 破坏分区表 分区会被破坏  已分区变为未分区磁盘

[root@centos6 ~]#dd if=/dev/zero of=/dev/sda bs=1 count=512

清空/dev/sda 磁盘分区表  破坏引导启动 破坏分区   生产中切勿此操作

 

[root@centos7 ~]$dd if=/dev/sdb of=/dev/sdc bs=1 count=512

sdc分区与同sdb分区相同 因为分区表一样  使其分区大小 分区类型相同

 

同步分区表

 

    分区表在磁盘的mbr分区以及内存中  /dev/sdd为例

           parted /dev/sdd print ; gdisk|fdisk -l /dev/sdd   查看磁盘的分区表

  lsblk  ; ls /dev/sdd*; cat /etc/partitions 查看保存在内存中分区表

     

 将磁盘分区同步到内存中

CentOS 57: 使用partprobe

  partprobe [/dev/DEVICE]

  partprobe /dev/sdd

Centos6: 

对新增分区  partx -a /dev/DEVICE

kpartx -a /dev/DEVICE -f: force

 对删除分区用 (对比磁盘内存分区表 进行删除)partx -d --nr M-N /dev/DEVICE

 

工具dd 写入磁盘

/dev/zero------文件代表一个永远输出 0的设备文件,使用它作输入可以得到全为空的文件。因此可用来创建新文件和以覆盖的方式清除旧文件。

/dev/null------它是空设备,也称为位桶(bit bucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶

 

备份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

 

v 备份 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压缩,保存到指定路径 v

v恢复 dd if=/path/to/image of=/dev/sdx 将备份文件恢复到指定盘

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

 

v修复硬盘

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

 



本文转自 工运搬运维 51CTO博客,原文链接:http://blog.51cto.com/13157015/2044481,如需转载请自行联系原作者