設備文件
一切皆文件 open(), read(), write(), close()
磁盤結構
磁盤接口類型
并行
-
IDE:133MB/s
-
SCSI:640MB/s
串口
-
SATA:6Gbps
-
SAS:6Gbps
-
USB:480MB/s
rpm
-
rotationsper minute 硬盤每分鐘轉數
硬盤結構
圖一
圖二
下面我們來介紹幾個磁盤存儲的數據
-
head:磁頭 即 盤面
-
track:磁道
-
cylinder: 柱面
-
secotr: 扇區,512bytes
每個扇區空間大小為512byte
從圖上看扇區是越往內圈越小。的確,扇區面積是小了,但存儲的數據量不變,只是數據存儲密度增大了而已(存在浪費空間)。
機械硬盤使用8位二進制數表示磁頭(head)數,所以最多可以有2^8個磁頭即256個
采用10位二進制數表示磁道(track)數,所以最多可以有2^10個磁道即1024個
采用6位二進制數表示扇區(sector)數,所以每個磁道最多可以有2^6個扇區即64個
這里我們可以得到一個公式
單個磁盤最大空間=每個磁道扇區數×每個扇區大小×磁道數×磁頭數=64×512(byte)×1024×256=8G
分區是按照柱面來劃分的
所以同樣的可以得到
一個分區的最小單位=一個磁道大小×磁頭數=64×512(byte)×256=8M
所以我們的分區大小通常為8M的整倍數
但實際情況好像并不是這樣?
這是因為我們的運算是按照CHS(cylinder、head、sector)的
即每個磁道的扇區數相同
現在一般采用CHS和LBA相結合的方式劃分扇區即每個磁道上的扇區數可以不同、并且一個柱面可以屬于多個分區
這樣單個磁盤最大空間要大的多的多
磁盤分區
為什么是分區?
-
優化I/O性能
-
實現磁盤空間配額限制
-
提高修復速度
-
隔離系統和程序
-
安裝多個OS
-
采用不同文件系統
分區
兩種分區方式:MBR,GPT
首先介紹MBR
MBR:master boot record 使用32位(4byte)表示扇區數,所以單個分區不超過2T(2^32×512=2T)
如何分區:按柱面
0磁道0扇區:512bytes
446bytes: boot loader 64bytes:分區表 16bytes: 標識一個分區 4個主分區;3主分區+1擴展(N個邏輯分區) 2bytes: MBR區域的有效性標識;55AA為有效
下面我們使用命令來看下MBR的內容
[root@redhat7 ~]# hexdump -C -n 512 /dev/sda
一個簡單實驗:
1、使用dd命令備份磁盤的mbr
2、使用dd命令破壞磁盤的mbr
3、使用dd命令利用備份的mbr恢復到磁盤上
[root@redhat7 ~]# fdisk -l /dev/sdb // 首先查看/dev/sdb 是存在的 [root@redhat7 ~]# dd if=/dev/sdb of=/root/mbr.bak bs=512 count=1 // 備份/dev/sdb的MBR 到 /root/mbr.bak [root@redhat7 ~]# dd if=/dev/zero of=/dev/sdb bs=512 count=1 // 破壞/dev/sdb的MBR [root@redhat7 ~]# fdisk -l /dev/sdb // /dev/sdb的分區表 已經不復存在了 [root@redhat7 ~]# dd if=/root/mbr.bak of=/dev/sdb bs=512 count=1 // 恢復/dev/sdb 的MBR [root@redhat7 ~]# fdisk -l /dev/sdb // /dev/sdb的分區表又重新顯示了
MBR分區結構
從圖上我們也可以發現一個問題:
實驗環境 /dev/sda為我們正常使用的硬盤 /dev/sdb為我們新添加的一塊硬盤 dd if=/dev/sda of=/dev/sdb bs=512 count=1 dd if=/dev/sda of=/dev/sdb bs=1 count=66 skip=446 seek=446 dd if=/dev/zero of=/dev/sdb bs=1 count=2 skip=510 seek=510 dd if=/dev/sda of=/dev/sdb bs=1 count=2 skip=510 seek=510
從圖中我們可以看到復制sda的MBR到sdb,但是它們兩個顯示的并不一樣,sdb沒有顯示邏輯分區sdb5 所以可以說明MBR存儲的只有主分區和擴展分區的分區表信息(最多只能復制4個分區表的信息,這點前面也介紹過); 邏輯分區的分區表信息并不存在于MBR(可以查看前面的圖示,這點需要注意)
GPT分區
-
GPT:GUID patition table 支持128個分區,使用64位,支持8Z(512Byte/block )64Z (4096Byte/block)
-
使用128位UUID 表示磁盤和分區GPT分區表自動備份在頭和尾兩份,并有CRC校驗位
-
UEFI (統一擴展固件接口)硬件支持GPT,使操作系統啟動
操作系統安裝在GPT分區中時,要在主板BIOS設置中將電腦設置為支持UEFI啟動
GPT分區結構
管理分區
-
列出塊設備
[root@redhat7 ~]# blkid blkid -L <label> | -U <uuid>
-
添加一塊新的硬盤作為實驗環境
[root@redhat7 ~]# echo "- - -" > /sys/class/scsi_host/host0/scan [root@redhat7 ~]# echo "- - -" > /sys/class/scsi_host/host1/scan [root@redhat7 ~]# echo "- - -" > /sys/class/scsi_host/host2/scan //在不需要重啟的情況下識別新添加的硬盤
-
創建MBR分區
fdisk創建MBR分區,也支持GPT,對于一塊硬盤,最多只能管理15分區 [root@redhat7 ~]# fdisk -hlep Usage: fdisk [options] <disk>change partition table fdisk [options] -l <disk> list partition table(s)
-
創建MBR分區
gdisk [ -l ] device
GNU parted高級分區操作(創建、復制、調整大小等等)
[root@redhat7 ~]# parted --help Usage: parted [OPTION]... [DEVICE [COMMAND [PARAMETERS]...]...] Apply COMMANDs with PARAMETERS to DEVICE. If no COMMAND(s) are given, run in interactive mode.
查看是MBR分區還是GPT分區的幾個命令,及其混合 [root@redhat7 ~]# gdisk /dev/sdb [root@redhat7 ~]# gdisk /dev/sdc [root@redhat7 ~]# fdisk /dev/sdb [root@redhat7 ~]# fdisk /dev/sdc [root@redhat7 ~]# fdisk -l /dev/sdc Disk label type: gpt [root@redhat7 ~]# fdisk -l /dev/sdb Disk label type: dos [root@redhat7 ~]# gdisk -l /dev/sdc [root@redhat7 ~]# gdisk -l /dev/sdb // 注意區別
同步分區表
查看內核是否已經識別新的分區 [root@redhat7 ~]# cat /proc/partitions [root@redhat7 ~]# lsblk [root@redhat7 ~]# ls /dev/設備名 //以上3個命令為查看內核中的分區表 [root@redhat7 ~]# fdisk -l /dev/設備 //查看為磁盤上的分區表 如果上面和下面命令顯示的設備文件不一樣,則需要通知內核重新讀取硬盤分區表 centos 6 新增分區用 [root@redhat7 ~]# partx -a -n M:N /dev/DEVICE 刪除分區用 [root@redhat7 ~]# partx -d -nr M:N /dev/DEVICE centos 5、7 [root@redhat7 ~]# partprobe [/dev/DEVICE]
parted命令
parted的操作都是實時生效的,小心使用 parted - a partition manipulation program parted [options] [device [command [options...]...]] optionss: -l, --list lists partition layout on all block devices COMMANDS: help [COMMAND] print general help, or help on COMMAND mklabel,mktable LABEL-TYPE create a new disklabel (partition table) mkpart PART-TYPE [FS-TYPE] START END make a partition print [...] display the partition table, rm NUMBER delete partition NUMBER # 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
文件進系統類型
-
Linux文件系統: ext2, ext3, ext4, xfs(SGI), btrfs(Oracle), reiserfs, jfs(AIX), swap
-
光盤:iso9660
-
Windows:fat32, ntfs
-
Unix: FFS(fast), UFS(unix), JFS2
-
網絡文件系統:NFS, CIFS
-
集群文件系統:GFS2, OCFS2(oracle)
-
分布式文件系統:ceph, moosefs, mogilefs, glusterfs, Lustre
-
RAW:未經處理或者未經格式化產生的文件系統
文件系統分類
-
根據其是否支持"journal"功能:
-
日志型文件系統: ext3, ext4, xfs, …
-
非日志型文件系統: ext2, vfat
-
文件系統的組成部分:
-
內核中的模塊:ext4, xfs, vfat
-
用戶空間的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat
-
Linux的虛擬文件系統:VFS
-
查前支持的文件系統:cat /proc/filesystems
VFS:Linux虛擬文件系統
創建文件系統
mkfs命令: (1) # mkfs.FS_TYPE/dev/DEVICE ext4 xfs btrfs vfat (2) # mkfs-t FS_TYPE /dev/DEVICE -L 'LABEL': 設定卷標 創建ext文件系統 mke2fs:ext系列文件系統專用管理工具 -t {ext2|ext3|ext4} -b {1024|2048|4096} -L 'LABEL' -j: 相當于-t ext3 mkfs.ext3 = mkfs-t ext3 = mke2fs -j = mke2fs -t ext3 -i#: 為數據空間中每多少個字節創建一個inode;此大小不應該小于block的大小 -N #:為數據空間創建個多少個inode -I 一個inode記錄大小128---4096 -m #: 默認5%,為管理人員預留空間占總空間的百分比 -O FEATURE[,...]:啟用指定特性 -O ^FEATURE:關閉指定特性
文件系統屬性
文件系統標簽
-
指向設備的另一種方法
-
與設備無關
blkid:塊設備屬性信息查看 blkid[OPTION]… [DEVICE] -U UUID: 根據指定的UUID來查找對應的設備 -L LABEL:根據指定的LABEL來查找對應的設備
e2label:管理ext系列文件系統的LABEL # e2label DEVICE [LABEL]
findfs:查找分區 findfs[options] LABEL=
tune2fs
tune2fs:重新設定ext系列文件系統可調整參數的值 -l:查看指定文件系統超級塊信息;super block -L 'LABEL':修改卷標 -m #:修預留給管理員的空間百分比 -j: 將ext2升級為ext3 -O: 文件系統屬性啟用或禁用,–O ^has_journal -o: 調整文件系統的默認掛載選項,–o ^acl -U UUID: 修改UUID號 dumpe2fs: -h:查看超級塊信息(分組信息),分區用分組管理
超級塊和inode table
文件系統檢測和修復
常發生于死機或者非正常關機之后
掛載為文件系統標記為“dirty”
fsck: File System Check fsck.FS_TYPE fsck-t FS_TYPE -a: 自動修復錯誤 -r: 交互式修復錯誤 注意: FS_TYPE一定要與分區上已經文件類型相同; e2fsck:ext系列文件專用的檢測修復工具 -y:自動回答為yes -f:強制修復
掛載mount
掛載:將額外文件系統與根文件系統某現存的目錄建立起關聯關系,進而使得此目錄做為其它文件訪問入口的行為
卸載:為解除此關聯關系的過程
把設備關聯掛載點:mount Point # mount
卸載時:可使用設備,也可以使用掛載點 # umount
掛載點下原有文件在掛載完成后會被臨時隱藏
掛載點目錄一般為空
掛載方法:mount DEVICE MOUNT_POINT
mount:通過查看/etc/mtab文件顯示當前已掛載的所有設備 mount [-fnrsvw] [-t vfstype] [-o options] device dir device:指明要掛載的設備; (1) 設備文件:例如/dev/sda5 (2) 卷標:-L 'LABEL', 例如-L 'MYDATA' (3) UUID, -U 'UUID':例如-U '0c50523c-43f1-45e7-85c0-a126711d406e' (4) 偽文件系統名稱:proc, sysfs, devtmpfs, configfs dir:掛載點 事先存在;建議使用空目錄 進程正在使用中的設備無法被卸載 [option] -t vsftype:指定要掛載的設備上的文件系統類型 -r: readonly,只讀掛載 -w: read and write, 讀寫掛載 -n: 不更新/etc/mtab,相當于#mount -a:自動掛載所有支持自動掛載的設備(定義在了/etc/fstab文件中,且掛載選項中有auto功能) -L 'LABEL': 以卷標指定掛載設備 -U 'UUID': 以UUID指定要掛載的設備 -B, --bind: 綁定目錄到另一個目錄上 查看內核追蹤到的已掛載的所有設備: cat /proc/mounts -o options:(掛載文件系統的選項),多個選項使用逗號分隔 async:異步模式 sync:同步模式,內存更改時,同時寫磁盤 atime/noatime:包含目錄和文件 diratime/nodiratime:目錄的訪問時間戳 auto/noauto:是否支持自動掛載,是否支持-a選項 exec/noexec:是否支持將文件系統上運行應用程序 dev/nodev:是否支持在此文件系統上使用設備文件 suid/nosuid:不否支持suid和sgid權限 remount:重新掛載 ro:只讀 rw:讀寫 user/nouser:是否允許普通用戶掛載此設備,默認管理員才能掛載 acl:啟用此文件系統上的acl功能 Defaults:相當于rw, suid, dev, exec, auto, nouser, async
卸載命令
查看掛載情況: #findmntMOUNT_POINT 查看正在訪問指定文件系統的進程: #lsofMOUNT_POINT #fuser -v MOUNT_POINT 終止所有在正訪問指定的文件系統的進程: # fuser -km MOUNT_POINT 卸載: # umountDEVICE # umountMOUNT_POINT
掛載點和/etc/fstab
配置文件系統體系 被mount、fsck和其它程序使用 系統重啟時保留文件系統體系 可以在設備欄使用文件系統卷標 使用mount -a 命令掛載/etc/fstab中的所有文件系統
原創文章,作者:sixijie,如若轉載,請注明出處:http://www.www58058.com/41821
圖片看起來是很直觀,建議加上文字描述,這樣別人才看的東,總體來說總結的還不錯,有自己獨特的地方。