1. 程式人生 > >Linux九陰真經之無影劍殘卷(磁盤存儲和文件系統)

Linux九陰真經之無影劍殘卷(磁盤存儲和文件系統)

備份 orm n) gdi inode 文件夾 ise .net fstab

一、磁盤簡介

計算機的外部存儲器中也采用了類似磁帶的裝置,比較常用的一種叫磁盤,將圓形的磁性盤片裝在一個方的密封盒子裏,這樣做的目的是為了防止磁盤表面劃傷,導致數據丟失。

1、硬盤的chs模式

是指chs(Cylinder/Head/Sector)模式,很久以前,硬盤的容量還非常小的時候,人們采用與軟盤類似的結構生產硬盤.也就是硬盤盤片的每一條磁道都具有相同扇區數. 由此產生了所謂的3D參數 (Disk Geometry). 既磁頭數(Heads),柱面數(Cylinders), 扇區數(Sectors pertrack),以及相應的尋址方式

技術分享圖片技術分享圖片

  1. sector 扇區:在硬盤上每個磁道上的扇區用6bit標識,每個磁道最多標識64個扇區,每個扇區512byte
  2. track 磁道:磁道數等於柱面數,每個盤面上有1024個磁道
  3. head 磁頭 :磁頭數等於盤面數,在硬盤上磁頭用8bit標識,最多尋道256個磁頭
  4. cylinder 柱面 :在硬盤柱面用10bit標識,最多標識1024個柱面

磁盤容量計算方式:扇區大小*64*256*1024=8589934592=8G

因此早期的硬盤無法突破8G容量

以上這種方式會浪費很多磁盤空間 (與軟盤一樣). 為了解決這一問題, 進一步提高硬盤容量, 人們改用等密度結構生產硬盤.也就是說,外圈磁道的扇區比內圈磁道多. 采用這種結構後, 硬盤不再具有實際的3D參數, 尋址方式也改為線性尋址,即以扇區為單位進行尋址。

2、LBA(logical block addressing)模式

為了與使用3D尋址的老軟件兼容 (如使用BIOS Int13H接口的軟件), 在硬盤控制器內部安裝了一個地址翻譯器, 由它負責將老式3D參數翻譯成新的線性參數.這也是為什麽現在硬盤的3D參數可以有多種選擇的原因 (不同的工作模式, 對應不同的3D參數,如 LBA, LARGE, NORMAL). CHS模式只能識別大硬盤的前面8G.lba使用的線性尋址,突破了1024柱面的限制,能訪問8G以外的空間了。

LBA采用48個bit位尋址,最大尋址空間128PB。

二、硬盤分區

磁盤分區是使用分區編輯器(partition editor)在磁盤上劃分幾個邏輯部分,盤片一旦劃分成數個分區,不同類的目錄與文件可以存儲進不同的分區。越多分區,也就有更多不同的地方,可以將文件的性質區分得更細,按照更為細分的性質,存儲在不同的地方以管理文件;但太多分區就成了麻煩。空間管理、訪問許可與目錄搜索的方式,依屬於安裝在分區上的文件系統。當改變大小的能力依屬於安裝在分區上的文件系統時,需要謹慎地考慮分區的大小。

1、硬盤為什要分區

  1. 優化I/O性能
  2. 實現磁盤空間配額限
  3. 提高修復速度
  4. 隔離系統和程序
  5. 安裝多個OS
  6. 采用不同文件系統

2、分區表類型(MBR和GPT)

MBR: Master Boot Record 主引導記錄

又叫做主引導扇區,是計算機開機後訪問硬盤時所必須要讀取的首個扇區,它在硬盤上的三維地址為(柱面,磁頭,扇區)=(0,0,1)。在深入討論主引導扇區內部結構的時候,有時也將其開頭的446字節內容特指為“主引導記錄”(MBR),其後是4個16字節的“磁盤分區表”(DPT),以及2字節的結束標誌(55AA)。因此,在使用“主引導記錄”(MBR)這個術語的時候,需要根據具體情況判斷其到底是指整個主引導扇區,還是主引導扇區的前446字節。

mbr分區用4個字節存儲分區的總扇區數,最大能表示2的32次方的扇區個數,按每扇區512字節計算(2^32*512byte=2199023255552byte=2T),所以mbr無法識別大於2T以後的空間

0磁道0扇區:512bytes

446bytes:boot loader

64bytes:分區表,16bytes標識一個分區,支持4個分區,或者3個主分區和一個擴展分區

2bytes:分區標示位 55AA

MBR分區結構:

技術分享圖片

GPT: Globals Unique Identifiers

是一個實體硬盤的分區表的結構布局的標準。它是可擴展固件接口(EFI)標準(被Intel用於替代個人計算機的BIOS)的一部分,被用於替代BIOS系統中的一32bits來存儲邏輯塊地址和大小信息的主引導記錄(MBR)分區表。對於那些扇區為512字節的磁盤,MBR分區表不支持容量大於2.2TB(2.2×1012字節)[1]的分區,然而,一些硬盤制造商(諸如希捷和西部數據)註意到這個局限性,並且將他們的容量較大的磁盤升級到4KB的扇區,這意味著MBR的有效容量上限提升到16 TiB。 這個看似“正確的”解決方案,在臨時地降低人們對改進磁盤分配表的需求的同時,也給市場帶來關於在有較大的塊(block)的設備上從BIOS啟動時,如何最佳的劃分磁盤分區的困惑。GPT分配64bits給邏輯塊地址,因而使得最大分區大小在264-1個扇區成為可能。對於每個扇區大小為512字節的磁盤,那意味著可以有9.4ZB(9.4×1021字節)或8 ZiB個512字節(9,444,732,965,739,290,426,880字節或18,446,744,073,709,551,615(264-1)個扇區×512(29)字節每扇區)

GPT支持128個分區,使用64位表示扇區,如果每個扇區是512Byte,理論上則支持8Z的磁盤。

使用128位UUID(Universally Unique Identifier) 表示磁盤和分區 GPT分區表 自動備份在頭和尾兩份,並有CRC校驗位 UEFI (統一擴展固件接口)硬件支持GPT,使操作系統啟動

gpt分區結構:

技術分享圖片

3、LINUX中的分區管理

LINUX中硬盤及分區工具的標識

在早期系統中硬盤的標識區分接口,比如IED接口的硬盤在/dev/以hd[a-z]標識,新系統中都以sd[a-z]來標識,不區分接口了

分區由數字來標識,比如硬盤是sda,那此硬盤的第一個分區為sda1,第二個為sda2,依次類推

在LINUX中一切皆文件,設備是以文件的方式標識,設備有主設備號和次設備號,主設備號表示不同類型的設備,次設備號表示同類設備的不同設備

LINUX中管理分區的工具

fdisk /dev/DISK

  • -l:列出分區信息
  • -c:使用非柱面模式
  • 交互式:
技術分享圖片
  • p:打印當前分區表
  • m:幫助
  • n:添加新分區
  • d:刪除分區
  • w:保存退出
  • l:列出分區類型
  • t:修改分區類型
  • q 不保存並退出
技術分享圖片 技術分享圖片
示例: [root@rhel6 ~]# fdisk /dev/sdb 
Command (m for help): p #查看當前分區

Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 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: 0xb484790b

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n #新創建一個分區
Command action
   e   extended
   p   primary partition (1-4)
p #創建主分區
Partition number (1-4): 1 #分區號為1
First cylinder (1-261, default 1):  #默認從0扇區開始
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-261, default 261): +1G #創建一個1G的分區

Command (m for help): p #查看分區後的狀態

Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 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: 0xb484790b

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         132     1060258+  83  Linux

Command (m for help): w #保存退出
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
技術分享圖片

gdisk:用來管理gpt分區,用法和fdisk相似

parted /dev/DISK

  • mklabel {gpt|msdos} 設置硬盤的分區表類型,也可以進入交互式模式
  • -l:列出分區信息
  • 交互式
技術分享圖片
cp [FROM-DEVICE] FROM-NUMBER TO-NUMBER   將文件系統復制到另一個分區
help [COMMAND]                           打印一般幫助,或幫助COMMAND
mklabel,mktable LABEL-TYPE               創建一個新的disklabel(分區表),LABEL-TYPE={msdos|gpt}
mkpart PART-TYPE [FS-TYPE] START END     新建一個分區
mkpartfs PART-TYPE FS-TYPE START END     新建一個帶文件系統的分區
quit                                     退出程序
resize NUMBER START END                  調整分區NUMBER及其文件系統的大小
rm NUMBER                                刪除NUMBER分區
version                                  顯示GNU Parted的版本號和版權信息
技術分享圖片

partprobe 同步分區表,但在紅帽系列6.x上有bug

partx

  • -a /dev/sda 同步分區表(6.x),在增加分區出現不同步時使用
  • -d --nr m-n /dev/sda 同步分區表(6.x),在刪除分區出現不同步時使用

lsblk 查看內存現在生效的分區表

4、mbr分區表的備份與還原

技術分享圖片
[root@rhel6 ~]# dd if=/dev/sda of=/data/mbr_bak bs=1 count=512 #備份mbr分區表
512+0 records in
512+0 records out
512 bytes (512 B) copied, 0.000765317 s, 669 kB/s
[root@rhel6 ~]# hexdump -C /data/mbr_bak  
00000000  eb 48 90 10 8e d0 bc 00  b0 b8 00 00 8e d8 8e c0  |.H..............|
00000010  fb be 00 7c bf 00 06 b9  00 02 f3 a4 ea 21 06 00  |...|.........!..|
00000020  00 be be 07 38 04 75 0b  83 c6 10 81 fe fe 07 75  |....8.u........u|
00000030  f3 eb 16 b4 02 b0 01 bb  00 7c b2 80 8a 74 03 02  |.........|...t..|
00000040  80 00 00 80 fe 49 08 00  00 08 fa 90 90 f6 c2 80  |.....I..........|
00000050  75 02 b2 80 ea 59 7c 00  00 31 c0 8e d8 8e d0 bc  |u....Y|..1......|
00000060  00 20 fb a0 40 7c 3c ff  74 02 88 c2 52 f6 c2 80  |. ..@|<.t...R...|
00000070  74 54 b4 41 bb aa 55 cd  13 5a 52 72 49 81 fb 55  |tT.A..U..ZRrI..U|
00000080  aa 75 43 a0 41 7c 84 c0  75 05 83 e1 01 74 37 66  |.uC.A|..u....t7f|
00000090  8b 4c 10 be 05 7c c6 44  ff 01 66 8b 1e 44 7c c7  |.L...|.D..f..D|.|
000000a0  04 10 00 c7 44 02 01 00  66 89 5c 08 c7 44 06 00  |....D...f.\..D..|
000000b0  70 66 31 c0 89 44 04 66  89 44 0c b4 42 cd 13 72  |pf1..D.f.D..B..r|
000000c0  05 bb 00 70 eb 7d b4 08  cd 13 73 0a f6 c2 80 0f  |...p.}....s.....|
000000d0  84 f0 00 e9 8d 00 be 05  7c c6 44 ff 00 66 31 c0  |........|.D..f1.|
000000e0  88 f0 40 66 89 44 04 31  d2 88 ca c1 e2 02 88 e8  |[email protected]........|
000000f0  88 f4 40 89 44 08 31 c0  88 d0 c0 e8 02 66 89 04  |[email protected]..|
00000100  66 a1 44 7c 66 31 d2 66  f7 34 88 54 0a 66 31 d2  |f.D|f1.f.4.T.f1.|
00000110  66 f7 74 04 88 54 0b 89  44 0c 3b 44 08 7d 3c 8a  |f.t..T..D.;D.}<.|
00000120  54 0d c0 e2 06 8a 4c 0a  fe c1 08 d1 8a 6c 0c 5a  |T.....L......l.Z|
00000130  8a 74 0b bb 00 70 8e c3  31 db b8 01 02 cd 13 72  |.t...p..1......r|
00000140  2a 8c c3 8e 06 48 7c 60  1e b9 00 01 8e db 31 f6  |*....H|`......1.|
00000150  31 ff fc f3 a5 1f 61 ff  26 42 7c be 7f 7d e8 40  |1.....a.&B|..}.@|
00000160  00 eb 0e be 84 7d e8 38  00 eb 06 be 8e 7d e8 30  |.....}.8.....}.0|
00000170  00 be 93 7d e8 2a 00 eb  fe 47 52 55 42 20 00 47  |...}.*...GRUB .G|
00000180  65 6f 6d 00 48 61 72 64  20 44 69 73 6b 00 52 65  |eom.Hard Disk.Re|
00000190  61 64 00 20 45 72 72 6f  72 00 bb 01 00 b4 0e cd  |ad. Error.......|
000001a0  10 ac 3c 00 75 f4 c3 00  00 00 00 00 00 00 00 00  |..<.u...........|
000001b0  00 00 00 00 00 00 00 00  04 bc 00 00 00 00 80 20  |............... |
000001c0  21 00 83 dd 1e 3f 00 08  00 00 00 a0 0f 00 00 dd  |!....?..........|
000001d0  1f 3f 83 fe ff ff 00 a8  0f 00 00 00 80 02 00 fe  |.?..............|
000001e0  ff ff 83 fe ff ff 00 a8  8f 02 00 00 40 01 00 fe  |............@...|
000001f0  ff ff 05 fe ff ff 00 a8  cf 03 00 58 30 01 55 aa  |...........X0.U.|
00000200
[root@rhel6 ~]# dd if=/data/mbr_bak of=/dev/sda bs=1 count=512  #如果分區表損壞了可以進入rescue模式進行從新還原分區表,前提是分區表備份不要在這塊硬盤上
技術分享圖片

gpt分區表會自動在磁盤尾扇區鏡像備份一份

三、文件系統

文件系統是操作系統用於明確存儲設備(常見的是磁盤,也有基於NAND Flash的固態硬盤)或分區上的文件的方法和數據結構;即在存儲設備上組織文件的方法。操作系統中負責管理和存儲文件信息的軟件機構稱為文件管理系統,簡稱文件系統。文件系統由三部分組成:文件系統的接口,對對象操縱和管理的軟件集合,對象及屬性。從系統角度來看,文件系統是對文件存儲設備的空間進行組織和分配,負責文件存儲並對存入的文件進行保護和檢索的系統。具體地說,它負責為用戶建立文件,存入、讀出、修改、轉儲文件,控制文件的存取,當用戶不再使用時撤銷文件等。

[root@rhel6 ~]# ls /lib/modules/2.6.32-642.el6.x86_64/kernel/fs/ 列出系統支持的文件系統
autofs4     cramfs    ext3     gfs2   mbcache.ko  squashfs
btrfs       dlm       ext4     jbd    nfs         ubifs
cachefiles  ecryptfs  fat      jbd2   nfs_common  udf
cifs        exportfs  fscache  jffs2  nfsd        xfs
configfs    ext2      fuse     lockd  nls

Linux文件系統:ext2(Extended file system), ext3, ext4, xfs(SGI), btrfs(Oracle), reiserfs, jfs(AIX), swap 光盤:iso9660 Windows:FAT32, exFAT,NTFS Unix: FFS(fast), UFS(unix), JFS2 網絡文件系統:NFS, CIFS 集群文件系統:GFS2, OCFS2(oracle) 分布式文件系統: fastdfs,ceph, moosefs, mogilefs, glusterfs, Lustre RAW:未經處理或者未經格式化產生的文件系統

Linux的虛擬文件系統:VFS

由於底層文件系統類型太多,從而導致程序調用復雜,從而有VFS來作為一個統一接口,充當中間人的角色

技術分享圖片

super block 和 inode table 的關系

技術分享圖片

1、+文件系統管理工具+

mkfs.{ext4|ext3|xfs|...} 格式化指定設備分區

  • -t FSTYPE:格式化指定設備分區
  • -L:設定卷標
  • -b:塊大小
  • -m #:預留%
  • -i:為多少個字節創建一個節點號
  • -N:指定節點號

findfs LABEL=<label>|UUID=<uuid>:查找分區

blkid:查看分區屬性信息

  • -U UUID
  • -L LABEL

fsck: 文件系統檢查,FS_TYPE一定要與分區上已經文件類型相同,修復時分區一定要在非掛載狀態

  • fsck.FS_TYPE
  • fsck -t FS_TYPE
  • -p: 自動修復錯誤
  • -r: 交互式修復錯誤
  • -y:自動回答為yes
  • -f:強制修復

xfs_info:查看xfs文件系統的信息

xfs_growfs 掛載點 同步調整大小後文件系統,適用xfs

+ext系列專用管理工具+

mke2fs:格式化ext系列的文件系統

  • -t {ext2|ext3|ext4} 指定文件系統類型
  • -b {1024|2048|4096} 指定塊大小
  • -L 卷標 設置卷標
  • -j == mkfs.ext3
  • -i # 為數據空間中每多少個字節創建一個inode;此大小不應該小於block的大小
  • -N #:指定分區中創建多少個inode
  • -l # 一個inode記錄占用的磁盤空間大小,128---4096
  • -m #: 默認5%,為管理人員預留空間占總空間的百分比
  • -o FEATURE[...]:啟用指定特性
  • -o ^FEATURE:關閉指定特性

e2label device [newlabel]:管理ext系列文件系統的LABEL

tune2fs:重新設定ext系列文件系統可調整參數的值

  • -l:查看指定文件系統超級塊信息;super block
  • -L ‘LABEL‘:修改卷標
  • -m #:修預留給管理員的空間百分比
  • -j: 將ext2升級為ext3
  • -O: 文件系統屬性啟用或禁用, –O ^has_journal
  • -o: 調整文件系統的默認掛載選項,–o ^acl
  • -U UUID: 修改UUID號

dumpe2fs 查看超級塊信息,顯示分組

  -h:查看超級塊信息,不顯示分組信息

e2fsck:ext系列文件專用的檢測修復工具

resize2fs 設備 同步調整大小後文件系統,適用ext系列

2、+設備掛載工具+

掛載是將額外文件系統與根文件系統某現存的目錄建立起關聯關系,進而使得此目錄做為其它文件訪問入口的行為,掛載點下原有文件在掛載完成後會被臨時隱藏

卸載是為解除此關聯關系的過程,要在此設備不在有進程使用時才可以正常卸載

技術分享圖片
[root@rhel6 ~]# cat /etc/mtab  #查看當前已掛載的設備
/dev/sda2 / ext4 rw 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
devpts /dev/pts devpts rw,gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs rw 0 0
/dev/sda1 /boot ext4 rw 0 0
/dev/sda3 /data ext4 rw 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
技術分享圖片

/etc/mtab 每次掛載時都更新次文件

cat /proc/mounts 可以查看掛載信息

/etc/fstab 開機自動掛載

技術分享圖片
# /etc/fstab
# Created by anaconda on Fri Apr 20 22:56:45 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=604bb620-06b7-496e-810d-373a06749b31 /                       xfs     defaults        0 0
UUID=635b125a-667b-4f64-b576-c12290fdbcf5 /boot                   xfs     defaults        0 0
UUID=564c85be-1a0d-4851-a544-1ddde8ba7cd8 /data                   xfs     defaults        0 0
UUID=2fea38ae-b8cf-4fec-99a3-d1b7e13324ff swap                    swap    defaults        0 0 #掛載設備  掛載點  文件系統類型  掛載選項  備份時間間隔(天)  開機檢查文件系統(0:不檢查,1-n:按數字從小到大依次檢查,參數相等的並行檢查)
技術分享圖片
# vim /etc/grub.conf

  kernel - max_loop=### 增加loop設備數,6.x上默認8個,7.x不限

mount

用法:mount 設備 掛載點

  • LABEL=卷標名 掛載點
  • UUID=‘xxxxxx’ 掛載點
  • -r 只讀方式掛載
  • -w 讀寫掛載,默認
  • -n 不更新/etc/mtab
  • -t 指定文件系統,一般不用,系統可以自動識別
  • -a 自動掛載/etc/fstab中的設備
  • -B | --bind 目錄掛載到目錄
  • -o:選項
    • acl:啟用acl
    • noacl:關閉acl
    • remount:重新掛載
    • ro:只讀
    • async:異步模式
    • sync:同步模式
    • loop:可以掛載文件,loop設備
    • atime/noatime:包含目錄和文件
    • diratime/nodiratime:目錄的訪問時間戳
    • auto/noauto:是否支持自動掛載,是否支持-a選項
    • exec/noexec:是否支持將文件系統上運行應用程序
    • dev/nodev:是否支持在此文件系統上使用設備文件
    • suid/nosuid:是否支持suid和sgid權限
    • user/nouser:是否允許普通用戶掛載此設備,/etc/fstab使用
    • defaults:相當於rw, suid, dev, exec, auto, nouser, async
    • nouuid:不檢查UUID的沖突

umount {設備名|掛載點} 卸載設備

fuser

  • -v /dev/sda1 查看設備誰在用
  • -km /dev/sda1殺掉使用設備的進程

lsof /dev/sda1 查看設備那個進程在用

findmnt 查找某個文件夾是否處於掛載狀態

losetup -a 查看當前掛載的loop設備

losetup /dev/loop# loopfile 綁定文件到loop設備

3、+內存及swap管理工具+

free 查看內存和swap的信息

  • -m 以M為單位顯示
  • -g 以G為單位顯示
  • -h 以人類可以看懂的方式顯示

mkswap /dev/sdb1 -L swap_sdb1 格式化

#vi /etc/fstab UUID=9e183975-5adf-41cb-886e-feef62a81335 swap swap defaults,pri=# 0 0 swap的UUID  掛載點  掛載文件系統類型  掛載選項,優先級:數字越大越優先  0 0

swapon DEV|LOOPFILE 激活swap分區

  • -s 查看當前的swap信息
  • -a 激活fstab表中配置的swap

swapoff 禁用swap分區

4、-其他塊設備操作工具-

eject 彈出光驅

  • -t 彈入光驅

cp /dev/sr0 /data/centos7.iso 將光盤制作成iso文件

dd if=/dev/sr0 of=/data/centos7.iso 將光盤制作成iso文件

mkisofs -r -o etc.iso /etc/ 將目錄打包成iso文件,但不能引導

mkdvdiso.sh source /destination/DVD.iso 制作引導光盤

技術分享圖片
#!/bin/bash

# by Chris Kloiber <[email protected]>
# Mods under CentOS by Phil Schaffner <[email protected]>

# A quick hack that will create a bootable DVD iso of a Red Hat Linux
# Distribution. Feed it either a directory containing the downloaded
# iso files of a distribution, or point it at a directory containing
# the "RedHat", "isolinux", and "images" directories.

# This version only works with "isolinux" based Red Hat Linux versions.

# Lots of disk space required to work, 3X the distribution size at least.

# GPL version 2 applies. No warranties, yadda, yadda. Have fun.

# Modified to add sanity checks and fix CentOS4 syntax errors

# TODO:
#   Add checks for available disk space on devices holding output and
#       temp files.
#   Add optional 3rd parameter to specify location of temp directory.
#   Create .discinfo if not present.

OS_VER=$((test -e /etc/fedora-release && rpm -qf /etc/fedora-release --qf "FC%{VERSION}") || (test -e /etc/redhat-release && rpm -qf /etc/redhat-release --qf "EL%{VERSION}") || echo OS_unknown)

case "$OS_VER" in
  EL[45]*|FC?)
        IMPLANT=/usr/lib/anaconda-runtime/implantisomd5
        if [ ! -f $IMPLANT ]; then
            echo "Error: $IMPLANT Not Found!"
            echo "Please install anaconda-runtime and try again."
            exit 1
        fi
        ;;
  EL6*|FC1?)
        IMPLANT=/usr/bin/implantisomd5
        if [ ! -f $IMPLANT ]; then
            echo "Error: $IMPLANT Not Found!"
            echo "Please install isomd5sum and try again."
            exit 1
        fi
        ;;
  OS_unknown)
        echo "Unknown OS."
        exit 1
        ;;
  *)
        echo "Fix this script for $OS_VER"
        exit 1
esac

if [ $# -lt 2 ]; then
        echo "Usage: `basename $0` source /destination/DVD.iso"
        echo ""
        echo "        The ‘source‘ can be either a directory containing a single"
        echo "        set of isos, or an exploded tree like an ftp site."
        exit 1
fi

DVD_DIR=`dirname $2`
DVD_FILE=`basename $2`

echo "DVD directory is $DVD_DIR"
echo "ISO file is $DVD_FILE"

if [ "$DVD_DIR" = "." ]; then
    echo "Destinaton Directory $DVD_DIR does not exist"
    exit 1
else
    if [ ! -d "/$DVD_DIR" ]; then
        echo "Destinaton Directory $DVD_DIR must be an absolute path"
        exit 1
    else
        if [ "$DVD_FILE" = "" ] || [ -d "$DVD_DIR/$DVD_FILE" ]; then
            echo "Null ISO file name."
            exit 1
        fi
    fi
fi

which mkisofs >&/dev/null
if [ "$?" != 0 ]; then
    echo "mkisofs Not Found"
    echo "yum install mkisofs"
fi

which createrepo >&/dev/null
if [ "$?" != 0 ]; then
    echo "createrepo Not Found"
    echo "yum install createrepo"
fi

if [ -f $2 ]; then
    echo "DVD ISO destination $2 already exists. Remove first to recreate."
    exit 1
fi

# Make sure there is enough free space to hold the DVD image on the filesystem
# where the home directory resides, otherwise change ~/mkrhdvd to point to
# a filesystem with sufficient free space.

cleanup() {
    [ ${LOOP:=/tmp/loop} = "/" ] && echo "LOOP mount point = \/, dying!" && exit
    [ -d $LOOP ] && rm -rf $LOOP 
    [ ${DVD:=~/mkrhdvd} = "/" ] && echo "DVD data location is \/, dying!" && exit
    [ -d $DVD ] && rm -rf $DVD 
}

cleanup
mkdir -p $LOOP
mkdir -p $DVD

ls $1/*.iso &>/dev/null
if [ "$?" = 0 ]; then

    echo "Found ISO CD images..."

    CDS=`expr 0`
    DISKS="1"

    [ -w / ] || {   # Very portable, but perhaps not perfect, test for superuser.
        echo "Only ‘root‘ may use this script for loopback mounts" 1>&2
        exit 1
    }

    for f in `ls $1/*.iso`; do
        mount -o loop $f $LOOP
        cp -av $LOOP/* $DVD
        if [ -f $LOOP/.discinfo ]; then
            cp -av $LOOP/.discinfo $DVD
            CDS=`expr $CDS + 1`
            if [ $CDS != 1 ] ; then
                DISKS=`echo ${DISKS},${CDS}`
            fi
        fi
        umount $LOOP
    done
else
    if [ -f $1/isolinux/isolinux.bin ]; then

        echo "Found FTP-like tree..."

        if [ -e $1/.discinfo ]; then
            cp -av $1/.discinfo $DVD
        else
# How does one construct a legal .discinfo file if none is found?
            echo "Error: No .discinfo file found in $1"
            cleanup
            exit 1
        fi
        cp -av $1/* $DVD
    else
        echo "Error: No CD images nor FTP-like tree found in $1"
        cleanup
        exit 1
    fi
fi

if [ -e $DVD/.discinfo ]; then
    awk ‘{ if ( NR == 4 ) { print disks } else { print ; } }‘ disks="ALL" $DVD/.discinfo > $DVD/.discinfo.new
    mv $DVD/.discinfo.new $DVD/.discinfo
else
    echo  "Error: No .discinfo file found in $DVD"
    cleanup
    exit 1
fi

rm -rf $DVD/isolinux/boot.cat
find $DVD -name TRANS.TBL | xargs rm -f

cd $DVD
createrepo -g repodata/comps.xml ./
mkisofs -J -R -v -T -o $2 -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 8 -boot-info-table $DVD
if [ "$?" = 0 ]; then

    echo ""
    echo "Image complete, create md5sum..."

#  $IMPLANT --force $2
# Don‘t like forced mediacheck? Try this instead.
    $IMPLANT --supported-iso --force $2

    echo "Start cleanup..."

    cleanup

    echo ""
    echo "Process Complete!"
    echo "Wrote DVD ISO image to $DVD_DIR/$DVD_FILE"
    echo ""
else
    echo "ERROR: Image creation failed, start cleanup..."

    cleanup

    echo ""
    echo "Failed to create ISO image $DVD_DIR/$DVD_FILE"
    echo ""
fi
mkdvdiso.sh

wodim –v –eject centos.iso 刻錄光盤

lsusb 查看UBS

5、df、du和dd

df 顯示以掛載的設備信息

  • -h:以人類可以看懂的方式顯示
  • -H:以1000為單位顯示分區大小
  • -T:顯示文件系統
  • -i:顯示節點號
  • -P:以標準格式顯示

du 顯示目錄大小

  • -h 以人類可以看懂的方式顯示
  • -s 只查看目錄
  • --max-depth # 查看子目錄深度

dd 轉換和復制文件

  • of=file 輸出
  • if=file 讀入
  • bs=size 每次讀寫字節大小
  • ibs=size 每次讀入字節大小
  • obs=size 每次寫如字節大小
  • cbs=size 一次轉換 n 個字節,即轉換緩沖區大小
  • skip=blocks 源跳過
  • seek=blocks 目標跳過
  • count=#
  • conv 用以下指定的參數轉換文件
    • ascii 轉換 EBCDIC 為 ASCII
    • ebcdic 轉換 ASCII 為 EBCDIC
    • lcase 把大寫字符轉換為小寫字符
    • ucase 把小寫字符轉換為大寫字符
    • nocreat 不創建輸出文件
    • noerror 出錯時不停止
    • notrunc 不截短輸出文件
    • sync 把每個輸入塊填充到ibs個字節,不足部分用空(NUL)字符補齊
    • fdatasync 等數據寫到磁盤後才返回結果
  • oflag=direct :direct 模式就是把寫入請求直接封裝成io 指令發到磁盤,可以繞過buffer和cache,測試真正的磁盤速度

#備份恢復磁盤:

dd if=/dev/sdx of=/path/to/image  #將/dev/sdx全盤數據備份到指定路徑的image文件 dd if=/path/to/image of=/dev/sdx  #將備份文件恢復到指定盤
dd if=/dev/sdx | gzip >/path/to/image.gz  #備份/dev/sdx全盤數據,並利用gzip壓縮,保存到指定路徑 gzip -dc /path/to/image.gz | dd of=/dev/sdx  #將壓縮的備份文件恢復到指定盤
#拷貝光盤數據到root文件夾下,並保存為cd.iso文件
dd if=/dev/cdrom of=/root/cd.iso
#銷毀磁盤數據,利用隨機的數據填充硬盤,在某些必要的場合可以用來銷毀數據,執行此操作以後,/dev/sda1將無法掛載,創建和拷貝操作無法執行
dd if=/dev/urandom of=/dev/sda1

#測試硬盤寫速度

dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000

#測試硬盤讀速度

dd if=/root/1Gb.file bs=64k | dd of=/dev/null

#測試硬盤讀速度2(hdparm)

[root@rhel6 ~]# hdparm -Tt /dev/sdb
 /dev/sdb:
 Timing cached reads:   13400 MB in  2.00 seconds = 6704.56 MB/sec
 Timing buffered disk reads: 384 MB in  3.01 seconds = 127.74 MB/sec

四、RAID管理

獨立硬盤冗余陣列(RAID, Redundant Array of Independent Disks),舊稱廉價磁盤冗余陣列(Redundant Array of Inexpensive Disks),簡稱磁盤陣列

簡單來說,RAID把多個硬盤組合成為一個邏輯扇區,因此,操作系統只會把它當作一個硬盤。RAID常被用在服務器電腦上,並且常使用完全相同的硬盤作為組合

RAID比單顆硬盤有以下一個或多個方面的好處:增強數據集成度,增強容錯功能,增加處理量或容量

常用raid級別:RAID-0,RAID-1,RAID-5,RAID-6,RAID-10,RAID-50,RAID-60等

RAID-0

要求至少2塊硬盤以上,優點是把多塊硬盤合並成一塊,增加容量為各硬盤總和,並行讀寫速度增加,但是容錯性低,其中一塊硬盤故障數據即丟失

技術分享圖片

RAID-1

倆快硬盤做鏡像,倆快硬盤各存儲一份數據,如果倆快硬盤容量不一樣則總容量按小硬盤算,特點速度慢,需要消耗一塊硬盤的容量,但是對數據安全性高

技術分享圖片

RAID-10

簡單來說,相當於把硬盤倆倆做鏡像(raid1),然後再把每組raid1做raid0,優點是既保證了速度也保證了數據冗余,但是犧牲了硬盤容量

技術分享圖片

RAID-5

至少需要三塊硬盤,存儲數據時把數據拆分成n份,將拆分後的數據計算出校驗和然後按照一定的分配方式存儲到各硬盤,犧牲一塊硬盤的容量,讀寫速度提高,在損壞一塊硬盤的情況下不影響數據的安全

技術分享圖片

RAID-6

在raid5基礎上在加入一塊硬盤,在同時損壞倆快的情況下數據可以正常運行

技術分享圖片

mdadm命令:

Llinux中分區類型:fd

示例:mdadm -C /dev/md# -a yes -l 5 -c 32 -n 3 -x1 /dev/sd# 利用軟件創建一個軟raid5

  • -C:創建
  • -a:檢查
  • -l:raid級別
  • -c:thunk大小,默認512K
  • -n:硬盤成員
  • -x:備用硬盤

mdadm -D /dev/md# 查看raid狀態

mdadm -Ds /dev/md# > /etc/mdadm.conf 生成配置文件,下次開機自動生效

mdadm -S /dev/md# 停用raid設備

mdadm -A /dev/md# 激活raid設備

mdadm /dev/md# -f /dev/sd# 模擬硬盤損壞

mdadm /dev/md# -r /dev/sd# 手動移除硬盤

mdadm /dev/md# -a /dev/sd# 手動添新硬盤

  • -D:查看,cat /proc/mdstat 也可查看raid信息
  • -Ds:生成配置文件,保存到/etc/mdadm.conf
  • -S:停用
  • -A:激活
  • -f:標記硬盤損壞
  • -r:移除硬盤
  • -a:添加硬盤

mdadm -G /dev/md# -n4 -a /dev/sd# 擴展raid

  • -G:擴展raid

mdadm --zero-superblock /dev/sd# 刪除已移除硬盤的superblock,避免再次使用的影響

五、LVM

邏輯卷管理器英語:Logical Volume Manager,縮寫為LVM),又譯為邏輯卷宗管理器、邏輯扇區管理器、邏輯磁盤管理器,是Linux核心所提供的邏輯卷管理(Logical volume management)功能。它在硬盤的硬盤分區之上,又創建一個邏輯層,以方便系統管理硬盤分區系統。

最先由IBM開發,在AIX系統上實現,OS/2 操作系統與 HP-UX也支持這個功能。在1998年,Heinz Mauelshagen 根據在 HP-UX 上的邏輯卷管理器,寫作出第一個 Linux 版本的邏輯卷管理器。

Linux中的分區類型:8e

PV(Physical Volume) 物理卷

VG(Volume Group) 卷組

LV(Logical Volume) 邏輯分區

PE(Physical Extent) 物理範圍。VG中的最小單元,類似於RAID的chunk大小。

Linux中的設備路徑:

/dev/mapper/vg0-lv0

/dev/vg0/lv0

/dev/dm-0

技術分享圖片

lvm管理工具:

pvs:查看pv信息

pvscan:查看pv信息

pvdisplay:查看pv信息

pvcreate:創建pv

vgs:查看vg信息

vgscan:查看vg信息

vgdisplay:查看vg信息

vgcreate -s 16M vgname /dev/sd# 創建vg

  • -s:指定PE大小

lvs:查看lv信息

lvscan:查看lv信息

lvdisplay:查看lv信息

lvcreate -n lvname {-L #G|-l #|} vgname 創建lv

  • -n:指定lv的名字
  • -L #(G|M):指定lv大小
  • -l #%FREE | -l #(PE):指定lv大小

vgrename OLDvgname NEWvgname 重命名vg

lvrename /dev/vgname/OLDlvname /dev/vgname/NEWlvname 重命名lv

擴展LV示例:

1、vgextend vgname /dev/sd#  擴展vg
2、lvextend -r {-l +#|# | -L +5G|5G} /dev/vg#/lv#  擴展lv並同步文件系統
  -r:同步文件系統

縮減LV示例:只限於ext系列,xfs不支持縮減

1、umount
2、fsck -f /dev/vg0/lv0
3、resize2fs /dev/vg0/lv0 10G 縮減文件系統到10G,如果是xfs文件系統需要用“xfs_growfs 掛載點 10G”同步xfs文件系統 4、lvreduce -L 10G /dev/vg0/lv0 縮減LV到10G 5、mount

磁盤移除示例:

1、pvmove /dev/OLDDISK
2、vgreduce vgname /dev/OLDDISK
3、pvremove /dev/OLDDISK

LVM硬盤遷移示例:

1、vgchange -an vgname 禁用vg
2、vgexport vgname 導出vg
3、硬盤移動到新主機上
4、vgimport vgname 導入vg
5、vgchange -ay vgname 激活vg

LVM的快照:

lvcreate -n lvname-snapshot -s -L 1G -p r /dev/vgname/lvname 創建快照

  • -s:快照功能
  • -p r:快照只讀屬性

lvconvert --merge /dev/vgname/lvname-snapshot 恢復快照

lvremove /dev/lvname-snapshot 刪除快照

Linux九陰真經之無影劍殘卷(磁盤存儲和文件系統)