磁盤設備
一切皆文件
所有的Linux中的設備都可以使用下面命令進行操作:open(), read(), write(), close()(這些是C的函數)
-
塊設備:隨機訪問
-
字符設備:線性訪問
設備號碼:
-
主設備號:major number,標識設備類型
8是主要設備編號,代表類型 -
次設備號:minor number,標識同一類型下的不同設備
0-5是設備唯一編號,同一類型設備進行區分 -
只要主、次設備編號相同,他們就是同一個設備
了解更多關于設備的信息
硬盤接口類型:
-
并行:多針腳
IDE類型最高速度:133MB/s
SCSI設備:640MB/s -
串口:單針腳,可以多個串口,以提高速度
設備 | 最高速度 |
---|---|
SATA設備最高速度 | 6Gbps |
SAS設備最高速度 | 6Gbps |
USB設備最高速度 | 480MB/s |
tips:注意單位的不同.B是指字符,bps是指每秒傳輸的位
-
串行接口速度比并行快,大部分原因是:不受干擾,速度快。
命名
-
IDE設備:/dev/hd*
-
SCSI,SATA,SAS,USB等設備:/dev/sd*
-
磁盤設備文件都在/dev目錄下面
-
由于IDE設備的弱點,基本被淘汰了。cent7開始,都改名叫sd
-
有時候,系統/dev文件下或者別的地方,會出現vda,vdb,vdc這種的,是虛擬機上的磁盤。當成硬盤用就可以了。
磁盤分區方式
-
MBR和GTP的分區方式
-
GTP的主分區個數可以超過4個
-
MBR
機械硬盤和固態硬盤
機械硬盤:是盤片的硬盤,所以轉速(rpm)對硬盤影響很大,所以就有一個指標rpm
固態硬盤:內部構建和機械硬盤完全不一樣。
機械硬盤組成
單位 | 分配字節/每磁面 | 最大數量 |
---|---|---|
磁頭(head) | 8 | 256 |
磁道(tarck) | 10 | 1024 |
扇區(sector ) | 6 | 63(512byte/每個) |
每個柱面的數據量=磁道的數據量?盤面數(=磁頭數)每個柱面的數據量=磁道的數據量?盤面數(=磁頭數)
磁道的數據量=柱面扇區數量?每個扇面的數據量=512?63磁道的數據量=柱面扇區數量?每個扇面的數據量=512?63
每個柱面的數據量=柱面扇區數量?每個扇面的數據量?盤面數=512?63?256=8M每個柱面的數據量=柱面扇區數量?每個扇面的數據量?盤面數=512?63?256=8M
尋址方式
CHS尋址: cylinder(柱面)Head Sector<-----------老式的尋址方式 LBA尋址:開始可以最小單位為扇區(Centos6開始使用)
-
早期系統中,CHS按照柱面分配時,不允許一個柱面分給多個分區,現在只會給出提醒警告
-
分配從柱面1開始分配,柱面0存放了開機引導和分配表等信息。
-
centos6開始支持LBA了,fdisk默認顯示以柱面為單位,-u參數幫助fdisk以扇區為單位顯示
-
centos7開始,才“默認”LBA,默認就是以扇區為顯示單位
但是如果想用柱面為單位,可以在fdisk中使用 -u=cylinders
給服務器添加硬盤
-
將硬盤添加到服務器上之后,使用下面命令進行掃描,就可以在系統中看到,硬盤已經添加成功了。
echo “- - -” > /sys/class/scsi_host/host2/scan //這里有三個,host0,host1,host2,如果一個不成功,可以試試用其他的。
-
lsblk是用來列出在內存中有的塊設備文件的。
分區
為什么創建分區
-
更高效
比如數據庫或者是日志,或者是操作系統。
由于他們的存放特性是不一樣的,尤其是數據庫和日志的存放。
就需要不同的文件系統,希望能夠使用不同的文件結構來存放他們,以便更高效。
-
防破壞:防止“所有”內容被破壞
-
減少磁盤修復難度和時間
-
磁盤配額
分區方式
-
分區方式和磁盤尋址方式之間存在密切聯系。
-
由于centos6和7之間,尋址方式的改變,他們的默認分區方式也有變化。
-
分區有兩種:MBR和GPT
-
windows中的分區方式也分為這兩種,如圖:
MBR
MBR介紹
-
MBR:Master Boot Record,使用32位表示扇區數,分區不超過2T
-
如何分區:按柱面
-
分區信息:存放在0磁道0扇區,一共512bytes
-
前446bytes:boot loader
-
后64bytes:分區表
-
16bytes:標識一個分區
-
將前446個字節,給擦除,擦除后,只要后面分區表的64位字節,還在,就還可以使用。
-
最后2bytes: 存放內容“55AA”,這部分內容一定不能夠被破壞
-
如果沒有“55AA”,該分區會被認為是裸分區??!
裸設備(raw device),也叫裸分區(原始分區),是一種沒有經過格式化,不被Unix通過文件系統來讀取的特殊塊設備文件。由應用程序負責對它進行讀寫操作。不經過文件系統的緩沖。它是不被操作系統直接管理的設備。這種設備少了操作系統這一層,I/O效率更高。不少數據庫都能通過使用裸設備作為存儲介質來提高I/O效率。
裸分區只能夠使用dd來進行備份 -
使用hexdump查看/dev/sdd開頭512個字節的十六進制內容
-
查看分區表中內容這512個信息,如果出現問題,就真的不能夠啟動系統了。 所以最好備份,,放在別的地方,
dd if=/dev/sda of=/testdir/mbrbak bs=1 count=512 //if表示inputfile //of表示outputfile //bs表示每次讀取多少 //count表示讀取多少次 //skip表示inputfile跳過多少個字節,從該字節后的一個字節開始讀 //seek 表示outputfile跳過多少個字節,從該字節后第一個字節開始寫
若是哪天這512個字節出現了問題,那么就需要使用dd命令恢復
– 實驗:如果沒有最后的“55AA”
– 破壞最后兩位
– 之后,可以看到,和沒有分區是一樣的效果
MBR分區結構
-
4個主分區;3主分區+1擴展(N個邏輯分區)
-
MBR分區結構圖
-
主分區
-
活動分區:系統開機后,會到那里找分區信息
-
擴展分區&邏輯分區
-
擴展分區有自己的MBR–EBR
-
擴展分區的512個字節中,前466個字節,為了和主分區保持一致,會預留出來,不存放任何內容。
-
擴展分區中,分區信息都放在自己的分區中。在分區開頭位置的第0扇區內。
GPT
GPT介紹
GPT(GUID partition table)支持128個分區,使用64位,支持8Z(512Byte/block)64Z(4096Byte/block)
-
使用128位UUID表示磁盤和分區GPT分區表自動備份在頭和尾兩份,并有CRC校驗位
-
GUID和UUID
UUID是一個由4個連字號(-)將32個字節長的字符串(32個十六進制數)分隔后生成的字符串(8-4-4-4-12),總共36個字節長。比如:550e8400-e29b-41d4-a716-446655440000
GUID 是微軟對UUID這個標準的實現。UUID是由開放軟件基金會(OSF)定義的。UUID還有其它各種實現,不止GUID一種。比如我們這里在Java中用到的。
UUID的生成:由當前系統時間+其他內容,組合生成,所以一般不會有重復 -
隨機生成UUID
-
UEFI (統一擴展固件接口)硬件支持GPT,使操作系統啟動,否則即使配置成功,也無法使用。
-
會自動備份超級快內容
GPT分區結構
-
GPT分區結構圖
-
LBA0存放Protected MBR。
這是因為大部分的磁盤工具不識別LBA的尋址方式,為了防止這些設備把GPT的分區給認為是裸分區,所以添加MBR信息,保證磁盤不被誤破壞。 -
LBA0之后的內容,為EFI部分。該部分包括四個組成區域:
-
EFI信息區(GPT頭)
-
分區表
-
GPT分區
-
備份區域
分區管理
查看塊設備文件
-
使用lsblk查看
[root@node4 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 3.7G 0 rom /media/CentOS_6.8_Final sdb 8:16 0 20G 0 disk ├─sdb2 8:18 0 784.4M 0 part ├─sdb3 8:19 0 1.5G 0 part ├─sdb4 8:20 0 1K 0 part └─sdb5 8:21 0 3.9G 0 part sda 8:0 0 200G 0 disk ├─sda1 8:1 0 200M 0 part /boot ├─sda2 8:2 0 100G 0 part / ├─sda3 8:3 0 2G 0 part [SWAP] ├─sda4 8:4 0 1K 0 part └─sda5 8:5 0 7.7G 0 part sdc 8:32 0 100G 0 disk sdd 8:48 0 10G 0 disk
-
ls /dev/sd* (見下圖)
-
cat /proc/partitions ( 見下圖)
-
fdisk -l
-
lsblk、/dev/sd*、/proc/partitions查看的都是系統內存中的分區表
-
fdisk查看的是系統最實時的詳細分區表
-
對于一些使用過的分區,添加或刪除分區后,需要同步到內存中,否則前三者不能夠查看到真實的分區信息。
[root@node4 ~]# fdisk -l Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x58427b03 Device Boot Start End Blocks Id System /dev/sdb2 101 200 803250 83 Linux /dev/sdb3 201 400 1606500 83 Linux /dev/sdb4 401 1000 4819500 5 Extended /dev/sdb5 501 1000 4016218+ 83 Linux Disk /dev/sda: 214.7 GB, 214748364800 bytes 255 heads, 63 sectors/track, 26108 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000ac3f7 Device Boot Start End Blocks Id System /dev/sda1 * 1 26 204800 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 26 13080 104857600 83 Linux /dev/sda3 13080 13341 2097152 82 Linux swap/ Solaris /dev/sda4 13341 26108 102551934 5 Extended /dev/sda5 13341 14341 8033475 83 Linux
-
parted -l
[root@node4 ~]# parted -l Model: VMware, VMware Virtual S (scsi) Disk /dev/sda: 215GB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 1049kB 211MB 210MB primary ext4 boot 2 211MB 108GB 107GB primary ext4 3 108GB 110GB 2147MB primary linux-swap(v1) 4 110GB 215GB 105GB extended 5 110GB 118GB 8226MB logical 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 2 823MB 1645MB 823MB primary ext2 3 1645MB 3290MB 1645MB primary 4 3290MB 8225MB 4935MB extended 5 4113MB 8225MB 4113MB logical
創建分區
fdisk
-
創建MBR分區,也支持GPT,對于一塊硬盤,最多只能管理15分區
-
4個主分區;3主分區+1擴展(N個邏輯分區)
-
使用方法:
-
修改分區表 fdisk [options]
-
列出分區表 fdisk [options] -l
-
定義塊大小 fdisk -s
-
選項
選項 | 釋義 | 備注 |
---|---|---|
-b | sector size (512, 1024, 2048 or 4096) | |
-c | switch off DOS-compatible mode | 在7中,使用“-c[=mode]”,mode: ‘dos’ or ‘nondos’ (default) |
-u | 使用扇區(sector)而不是柱面(cylinder) | 在7中,使用“-u[=]”,units: ‘cylinders’ or ‘sectors’ (default) |
-v | 打印版本信息 | |
-C | 指定柱面數量 | |
-H | 指定磁頭數量 | |
-S | specify the number of sectors per track |
gdisk
-
創建GPT分區,分區數量無需擔心(數量巨大,因為是基于UUID的)
-
使用方法類fdisk
parted
-
高級分區操作(創建、復制、調整大小等等)程序
-
支持DOC也支持GPT
parted詳解
-
格式:
parted [options] [device [command [options...]...]]
-[options]
-
[device]:如果需要,但是沒有指定,默認第一個parted找到的分區
-
[command [options…]
命令 | 釋義 | 英文 |
---|---|---|
檢查 MINOR | 對文件系統進行一個簡單的檢查 | |
cp [FROM-DEVICE] FROM-MINOR TO-MINOR | 將文件系統復制到另一個分區 | |
help [COMMAND] | 打印通用求助信息,或關于 COMMAND 的信息 | |
(常用)mklabel 標簽類型 | 創建新的磁盤標簽 (分區表) | |
(常用)mkfs num 文件系統類型 | 在 num 創建類型為“文件系統類型”的文件系統 | |
(常用)mkpart 分區類型 [文件系統類型] 起始點 終止點 | 創建一個分區 | |
(常用)mkpartfs 分區類型 文件系統類型 起始點 終止點 | 創建一個帶有文件系統的分區 | |
move num 起始點 終止點 | 移動編號為num 的分區 | |
name num 名稱 | 將編號為 num 的分區命名為“名稱” | |
(常用)print [num] | 打印分區表,或者分區 | |
(常用)quit | 退出程序 | |
rescue 起始點 終止點 | 挽救臨近“起始點”、“終止點”的遺失的分區 | |
(常用)resize num起始點 終止點 | 改變位于編號為 num 的分區中文件系統的大小 | |
(常用)rm num | 刪除編號為num的分區 | |
select 設備 | 選擇要編輯的設備 | |
set num 標志 狀態 | 改變編號為num 的分區的標志 |
parted 實用命令
-
更改分區類型:parted /dev/sdb mklabel gpt|msdos
-
可以對未使用的分區更改分區格式
-
已分區,但是未使用的分區,更改分區格式后,原來的分區會失效(消失)
-
msdos分區,使用“parted /dev/sdb mklabel msdos”設置分區類型后,查看,顯示“dos”
-
partition table部分(使用parted print)
-
Disk label type(fdisk -l)
[root@node4 ~]# parted /dev/sdd mklabel gpt Information: You may need to update /etc/fstab. [root@node4 ~]# parted /dev/sdd print Model: VMware, VMware Virtual S (scsi) Disk /dev/sdd: 10.7GB Sector size (logical/physical): 512B/512B Partition Table: gpt Number Start End Size File system Name Flags
-
打印分區詳情:parted /dev/sdb print
[root@node4 ~]# parted /dev/sda print Model: VMware, VMware Virtual S (scsi) Disk /dev/sda: 215GB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 1049kB 211MB 210MB primary ext4 boot 2 211MB 108GB 107GB primary ext4 3 108GB 110GB 2147MB primary linux-swap(v1) 4 110GB 215GB 105GB extended 5 110GB 118GB 8226MB logical
-
新建分區:parted /dev/sdb mkpart primary 1 200(默認單位M)
-
新建分區可以跳著分:
[root@node4 ~]# parted /dev/sdd mkpart primary 1 1024 Information: You may need to update /etc/fstab. [root@node4 ~]# parted /dev/sdd print Model: VMware, VMware Virtual S (scsi) Disk /dev/sdd: 10.7GB Sector size (logical/physical): 512B/512B Partition Table: gpt Number Start End Size File system Name Flags 1 1049kB 1024MB 1023MB primary
-
刪除分區:parted /dev/sdb rm 1
-
列出所有分區:parted -l
分區更多細節
-
如果主分區中,4個分區都分配完成后,刪除了分區2,分區1和分區3都不會發生變化,這和邏輯分區不同。
-
這樣容易導致磁盤浪費
-
如果刪除的是擴展分區中的分區,刪除后,后面的分區會將原來的分區號覆蓋掉(這可能是與邏輯分區的MBR存儲方式有關系,也說明,擴展分區的分區名,并不是存儲在擴展分區中的,可能是存儲在前面的主分區中的。)
-
設備名與UUID之間,在寫腳本的時候,最好使用UUID,因為UUID不會重復。設備名,在寫腳本的時候最好備用,如上,如果刪除了邏輯分區5之后,6會自動覆蓋為邏輯分區5。如果腳本中使用邏輯分區5這個設備名,就會導致錯誤。
-
分區如果不連續,會報warning出來。
-
使用命令操作分區的時候,分區不要寫成:fdisk /dev/sdc3這種的要寫成:fdisk /dev/sdc。因為/dev/sdc3已經是分區了,在分區,就會亂
同步分區
-
修改后查看內存中是否識別新的分區,使用lsblk或者是查看/dev/sd*,或者是查看/proc/partitions中。
-
lsblk、/dev/sd*、/proc/partitions都是查看的內存中的分區結構
-
fdisk和parted查看的是硬盤真實的分區情況
-
同步是指:通知內核重新讀取硬盤分區表新增分區或者刪除分區
-
不要又增加了,又刪除了,再去同步
– 每次增加操作完成后,就進行同步,每次刪除操作完后,就進行同步
新增分區操作的同步
-
partx -a -n M:N /dev/DEVICE
-
該命令的-n和–nr(指定同步到內存中的添加的設備名),并不好用
-
kpartx -a /dev/DEVICE -f: force
刪除分區操作的同步
-
命令:partx -d -n M:N /dev/DEVICE
-
centos6 : –nr N-M
-
命令:partprobe
-
CentOS 5,7:使用
-
partprobe用法:partprobe [/dev/DEVICE]
實驗 dd
0扇區前512字節刪除與恢復總結
掃描磁盤 echo "- - -" > /sys/class/scsi_host/host2/scan lsblk ls /dev/sd *查看分區 fdisk -l /dev/sda 查看mbr hexdump -C -n 512 /dev/sda 備份mbr dd if=/dev/sda of=/testdir/mbrbak bs=1 count=512 hexdump -C -v /testdir/mbrbak 恢復mbr dd if=/testdir/mbrbak of=/dev/sdd fdisk /dev/sdd -l lsblk hexdump -C -n 512 /dev/sdd 破壞boot loader dd if=/dev/zero of=/dev/sdd bs=1 count=446 hexdump -C -v -n 512 /dev/sdd 清除分區標識 dd if=/dev/zero of=/dev/sdd bs=1 count=2 skip=510 seek=510 hexdump -C -v -n 512 /dev/sddfdisk -l /dev/sdd 恢復分區標識 dd if=/testdir/mbrbak of=/dev/sdd bs=1 count=2 skip=510 seek=510 恢復分區表 dd if=/dev/zero of=/dev/sdd bs=1 count=64 skip=446 seek=446 hexdump -C -v -n 512 /dev/sdd
原創文章,作者:m20-吳清玲,如若轉載,請注明出處:http://www.www58058.com/42097