在AIX或Linux下,如何檢視磁碟是否包含資料?

lhrbest發表於2018-01-10

在AIX或Linux下,如何檢視磁碟是否包含資料?






真題1、AIXLinux下,如何檢視磁碟是否包含資料?

答案:在AIX下,可以使用lquerypv -h來檢視磁碟是否包含資料,或磁碟頭是否被dd過。這在安裝RAC的過程中,是非常實用的一個命令。如果不包括資料的話,那麼如下所示:

[ZFFR4CB2101:root]/]> lquerypv -h  /dev/rhdisk10

00000000   00000000 00000000 00000000 00000000  |................|

00000010   00000000 00000000 00000000 00000000  |................|

00000020   00000000 00000000 00000000 00000000  |................|

00000030   00000000 00000000 00000000 00000000  |................|

00000040   00000000 00000000 00000000 00000000  |................|

00000050   00000000 00000000 00000000 00000000  |................|

00000060   00000000 00000000 00000000 00000000  |................|

00000070   00000000 00000000 00000000 00000000  |................|

00000080   00000000 00000000 00000000 00000000  |................|

00000090   00000000 00000000 00000000 00000000  |................|

000000A0   00000000 00000000 00000000 00000000  |................|

000000B0   00000000 00000000 00000000 00000000  |................|

000000C0   00000000 00000000 00000000 00000000  |................|

000000D0   00000000 00000000 00000000 00000000  |................|

000000E0   00000000 00000000 00000000 00000000  |................|

000000F0   00000000 00000000 00000000 00000000  |................|

如果包括資料的話,那麼顯示如下所示:

[ZFFR4CB2101:root]/]> lquerypv -h /dev/rhdisk10

00000000   00820101 00000000 80000000 B6FE0F29  |...............)|

00000010   00000000 00000000 00000000 00000000  |................|

00000020   4F52434C 4449534B 00000000 00000000  |ORCLDISK........|

00000030   00000000 00000000 00000000 00000000  |................|

00000040   0B200000 00000103 4F43525F 30303030  |. ......OCR_0000|

00000050   00000000 00000000 00000000 00000000  |................|

00000060   00000000 00000000 4F435200 00000000  |........OCR.....|

00000070   00000000 00000000 00000000 00000000  |................|

00000080   00000000 00000000 4F43525F 30303030  |........OCR_0000|

00000090   00000000 00000000 00000000 00000000  |................|

000000A0   00000000 00000000 00000000 00000000  |................|

000000B0   00000000 00000000 00000000 00000000  |................|

000000C0   00000000 00000000 01F80D69 66A0E000  |...........if...|

000000D0   01F80D69 70C48800 02001000 00100000  |...ip...........|

000000E0   0001BC80 0002001C 00000003 00000001  |................|

000000F0   00000002 00000002 00000000 00000000  |................|

Linux中,可以使用hexdump命令來實現相同的效果,如下所示:

[root@OCPLHR ~]# hexdump -n 1024 -C /dev/sdb1

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

*

00000200  4c 41 42 45 4c 4f 4e 45  01 00 00 00 00 00 00 00  |LABELONE........|

00000210  50 ef ff c1 20 00 00 00  4c 56 4d 32 20 30 30 31  |P... ...LVM2 001|

00000220  53 68 78 53 57 33 43 33  48 64 44 48 33 56 65 79  |ShxSW3C3HdDH3Vey|

00000230  44 54 50 78 4a 6e 42 66  46 37 74 5a 4a 78 79 7a  |DTPxJnBfF7tZJxyz|

00000240  00 84 a6 54 02 00 00 00  00 00 03 00 00 00 00 00  |...T............|

00000250  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

00000260  00 00 00 00 00 00 00 00  00 10 00 00 00 00 00 00  |................|

00000270  00 f0 02 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

00000280  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

*

00000400

[root@OCPLHR ~]# hexdump -n 1024 -C /dev/sdb6

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

*

00000400

很明顯,磁碟/dev/sdb1已經被使用了,而/dev/sdb6還沒有被使用。其中,-n參數列示只格式前n個長度的字元,而-C參數列示每個位元組顯示為16進位制和相應的ASCII字元。

 

& 說明:

有關lquerypvhexdump的更多內容可以參考我的BLOGhttp://blog.itpub.net/26736162/viewspace-2149976/

 

 






問: linux用類似aix 中lquerypv -h  /dev  檢視磁碟是否有內容的命令?
 答: 檢視磁碟有無資料的命令:aix是lquerypv 、linux是hexdump




    

Linux命令學習總結:hexdump

2015-12-26 10:44 by 瀟湘隱者, 7741 閱讀, 0 評論, 收藏編輯

命令簡介:

hexdump是Linux下的一個二進位制檔案檢視工具,它可以將二進位制檔案轉換為ASCII、八進位制、十進位制、十六進位制格式進行檢視。

指令所在路徑:/usr/bin/hexdump

 

命令語法:

hexdump: [-bcCdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...]

 

命令引數:

此命令引數是Red Hat Enterprise Linux Server release 5.7下hexdump命令引數,不同版本Linux的hexdump命令引數有可能不同。

引數

長引數

描敘

-b

 

每個位元組顯示為8進位制。一行共16個位元組,一行開始以十六進位制顯示偏移值

-c

 

每個位元組顯示為ASCII字元

-C

 

每個位元組顯示為16進位制和相應的ASCII字元

-d

 

兩個位元組顯示為10進位制

-e

 

格式化輸出

-f

 

Specify a file that contains one or more newline separated format strings.  Empty lines and lines whose first non-blank character is a hash mark (#) are ignored.

-n

 

只格式前n個長度的字元

-o

 

兩個位元組顯示為8進位制

-s

 

從偏移量開始輸出

-v

 

The -v option causes hexdump to display all input data.  Without the -v option, any number of groups of output lines, which would be identical to the immediately preceding group of output lines

-x

 

雙位元組十六進位制顯示

 

使用示例:

 

1: 檢視hexdmp命令的幫助資訊

[root@DB-Server ~]# man hexdump

 

2: 以8進位制顯示檔案裡面的字元。

[root@DB-Server ~]# cat >test.txt
ABCDEF    
GHIJKM
123456
[root@DB-Server ~]#  hexdump -b test.txt
0000000 101 102 103 104 105 106 012 107 110 111 112 113 115 012 061 062
0000010 063 064 065 066 012                                            
0000015

注意:一行共16個位元組,一行開始以十六進位制顯示偏移值(如下所示,第一行字串只顯示到D,第十六個位元組,後面的F12*DFDF換行顯示)

[root@DB-Server ~]# cat >test.txt
ABCDEFGHIJKLMNODF12*DFDF
 
[2]+  Stopped                 cat > test.txt
You have new mail in /var/spool/mail/root
[root@DB-Server ~]# hexdump -b test.txt 
0000000 101 102 103 104 105 106 107 110 111 112 113 114 115 116 117 104
0000010 106 061 062 052 104 106 104 106 012                            
0000019
[root@DB-Server ~]# hexdump -c test.txt 
0000000   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   D
0000010   F   1   2   *   D   F   D   F  \n                            
0000019

clip_image001

 

3:以ASCII字元顯示檔案中字元

[root@DB-Server ~]# hexdump -c test.txt 
0000000   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   D
0000010   F   1   2   *   D   F   D   F  \n                            
0000019
 

hexdump 以ASCII字元顯示時,可以輸出換行符,這個功能可以用來檢查檔案是Linux的換行符格式還是Widows格式換行符。如下所示

clip_image002

 

4:以16進位制和相應的ASCII字元顯示檔案裡的字元

[root@DB-Server ~]# hexdump -C test.txt 
00000000  41 42 43 44 45 46 47 48  49 4a 4b 4c 4d 4e 4f 44  |ABCDEFGHIJKLMNOD|
00000010  46 31 32 2a 44 46 44 46  0a                       |F12*DFDF.|
00000019

 

5:只格式檔案中前n個字元

[root@DB-Server ~]# hexdump -C -n 5 test.txt 
00000000  41 42 43 44 45                                    |ABCDE|
00000005

 

6:以偏移量開始格式輸出。如下所示指定引數-s 5 ,前面的ABCDE字元沒有了。

 
[root@DB-Server ~]# hexdump -C test.txt 
00000000  41 42 43 44 45 46 47 48  49 4a 4b 4c 4d 4e 4f 44  |ABCDEFGHIJKLMNOD|
00000010  46 31 32 2a 44 46 44 46  0a                       |F12*DFDF.|
00000019
[root@DB-Server ~]# hexdump -C -s 5 test.txt 
00000005  46 47 48 49 4a 4b 4c 4d  4e 4f 44 46 31 32 2a 44  |FGHIJKLMNODF12*D|
00000015  46 44 46 0a                                       |FDF.|
00000019
作者:瀟湘隱者



我使用過的Linux命令之hexdump - ”十六“進位制檢視器

本文連結:http://codingstandards.iteye.com/blog/805778   (轉載請註明出處)

 

用途說明

hexdump命令一般用來檢視”二進位制“檔案的十六進位制編碼,但實際上它的用途不止如此,手冊頁上的說法是“ascii, decimal, hexadecimal, octal dump“,這也就是本文標題為什麼要將”十六“給引起來的原因,而且它能檢視任何檔案,而不只限於二進位制檔案了。另外還有xxd和od也可以做類似的事情,但是我從未用過。在程式輸出二進位制格式的檔案時,常用hexdump來檢查輸出是否正確。當然也可以使用Windows上的UltraEdit32之類的工具檢視檔案的十六進位制編碼,但Linux上有現成的工具,何不拿來用呢。

常用引數

如果要看到較理想的結果,使用-C引數,顯示結果分為三列(檔案偏移量、位元組的十六進位制、ASCII字元)。

格式:hexdump -C binfile

一般檔案都不是太小,最好用less來配合一下。

格式:hexdump -C binfile | less

 

使用示例

示例一 比較各種引數的輸出結果

[root@new55 ~]# echo /etc/passwd | hexdump 
0000000 652f 6374 702f 7361 7773 0a64          
000000c
[root@new55 ~]# echo /etc/passwd | od -x 
0000000 652f 6374 702f 7361 7773 0a64
0000014
[root@new55 ~]# echo /etc/passwd | xxd 
0000000: 2f65 7463 2f70 6173 7377 640a            /etc/passwd.
[root@new55 ~]# echo /etc/passwd | hexdump -C      <== 規範的十六進位制和ASCII碼顯示(Canonical hex+ASCII display )
00000000  2f 65 74 63 2f 70 61 73  73 77 64 0a              |/etc/passwd.|
0000000c
[root@new55 ~]# echo /etc/passwd | hexdump -b      <== 單位元組八進位制顯示(One-byte octal display) 
0000000 057 145 164 143 057 160 141 163 163 167 144 012                
000000c
[root@new55 ~]# echo /etc/passwd | hexdump -c      <== 單位元組字元顯示(One-byte character display) 
0000000   /   e   t   c   /   p   a   s   s   w   d  \n                
000000c
[root@new55 ~]# echo /etc/passwd | hexdump -d      <== 雙位元組十進位制顯示(Two-byte decimal display) 
0000000   25903   25460   28719   29537   30579   02660                
000000c
[root@new55 ~]# echo /etc/passwd | hexdump -o       <== 雙位元組八進位制顯示(Two-byte octal display) 
0000000  062457  061564  070057  071541  073563  005144                
000000c
[root@new55 ~]# echo /etc/passwd | hexdump -x       <== 雙位元組十六進位制顯示(Two-byte hexadecimal display) 
0000000    652f    6374    702f    7361    7773    0a64                
000000c
[root@new55 ~]# echo /etc/passwd | hexdump -v 
0000000 652f 6374 702f 7361 7773 0a64          
000000c

 

比較來比較去,還是hexdump -C的顯示效果更好些。

示例二 確認文字檔案的格式

文字檔案在不同作業系統上的行結束標誌是不一樣的,經常會碰到由此帶來的問題。比如Linux的許多命令不能很好的處理DOS格式的文字檔案。Windows/DOS下的文字檔案是以\r\n作為行結束的,而Linux/Unix下的文字檔案是以\n作為行結束的。

 

[root@new55 ~]# cat test.bc 
123*321
123/321
scale=4;123/321

[root@new55 ~]# hexdump -C test.bc 
00000000  31 32 33 2a 33 32 31 0a   31 32 33 2f 33 32 31 0a  |123*321.123/321.|
00000010  73 63 61 6c 65 3d 34 3b  31 32 33 2f 33 32 31 0a  |scale=4;123/321.|
00000020  0a                                                |.|
00000021
[root@new55 ~]#

 

注:常見的ASCII字元的十六進位制表示

\r      0D

\n     0A

\t      09

DOS/Windows的換行符 \r\n 即十六進位制表示 0D 0A

Linux/Unix的換行符      \n    即十六進位制表示 0A

 

示例三 檢視wav檔案

有些IVR系統需要8K赫茲8位元的語音檔案,可以使用hexdump看一下具體位元組編碼。

[root@web186 root]# ls -l tmp.wav 
-rw-r--r--    1 root     root        32381 2010-04-19  tmp.wav
[root@web186 root]# file tmp.wav 
tmp.wav: RIFF (little-endian) data, WAVE audio, ITU G.711 a-law, mono 8000 Hz

[root@web186 root]# hexdump -C tmp.wav | less 
00000000  52 49 46 46 75 7e 00 00  57 41 56 45 66 6d 74 20  |RIFFu~..WAVEfmt |
00000000  52 49 46 46 75 7e 00 00  57 41 56 45 66 6d 74 20  |RIFFu~..WAVEfmt |
00000010  12 00 00 00 06 00 01 00  40 1f 00 00 40 1f 00 00  |........@...@...|
00000020  01 00 08 00 00 00 66 61  63 74 04 00 00 00 43 7e  |......fact....C~|
00000030  00 00 64 61 74 61 43 7e  00 00 d5 d5 d5 d5 d5 d5  |..dataC~........|
00000040  d5 d5 d5 d5 d5 d5 d5 d5  d5 d5 d5 d5 d5 d5 d5 d5  |................|
*
000000a0  d5 d5 d5 d5 d5 d5 d5 d5  d5 55 d5 55 d5 d5 55 d5  |.........U.U..U.|
000000b0  55 d5 d5 55 d5 55 d5 d5  55 d5 55 55 55 55 55 55  |U..U.U..U.UUUUUU|
000000c0  55 55 55 55 55 55 55 d5  d5 d5 d5 d5 d5 d5 d5 d5  |UUUUUUU.........|
000000d0  d5 55 55 55 55 55 55 55  55 55 55 55 55 55 55 55  |.UUUUUUUUUUUUUUU|
000000e0  55 55 55 55 55 55 55 55  55 d5 d5 d5 d5 d5 d5 d5  |UUUUUUUUU.......|
000000f0  d5 d5 d5 d5 55 55 55 55  55 55 55 55 55 55 55 55  |....UUUUUUUUUUUU|
00000100  55 55 55 55 55 55 55 55  55 55 55 55 d5 d5 d5 d5  |UUUUUUUUUUUU....|
00000110  d5 d5 d5 d5 d5 d5 55 55  55 55 55 55 55 55 55 55  |......UUUUUUUUUU|
00000120  55 55 55 55 55 55 55 55  55 55 55 55 55 55 d5 d5  |UUUUUUUUUUUUUU..|
00000130  d5 d5 d5 d5 d5 d5 d5 d5  d5 55 55 55 55 55 55 55  |.........UUUUUUU|
00000140  55 55 d5 55 55 55 55 55  55 55 55 55 55 55 55 55  |UU.UUUUUUUUUUUUU|
00000150  55 d5 d5 d5 d5 d5 d5 d5  d5 d5 d5 55 55 55 55 55  |U..........UUUUU|
00000160  55 55 55 55 55 55 55 55  55 55 55 55 55 55 55 55  |UUUUUUUUUUUUUUUU|
00000170  55 55 55 55 d5 d5 d5 d5  d5 d5 d5 d5 d5 55 d5 55  |UUUU.........U.U|
00000180  55 55 55 55 55 55 55 55  55 55 55 55 55 55 55 55  |UUUUUUUUUUUUUUUU|
00000190  55 55 55 55 55 55 55 d5  d5 d5 d5 d5 d5 d5 d5 55  |UUUUUUU........U|
000001a0  55 55 55 55 55 55 55 d5  d5 55 55 55 55 55 55 55  |UUUUUUU..UUUUUUU|
000001b0  55 55 55 55 55 55 55 d5  55 55 d5 55 55 55 55 55  |UUUUUUU.UU.UUUUU|
000001c0  55 55 d5 55 d5 d5 55 d5  55 55 55 55 55 55 55 55  |UU.U..U.UUUUUUUU|
000001d0  55 55 55 55 55 55 55 55  55 55 55 55 55 55 55 d5  |UUUUUUUUUUUUUUU.|
000001e0  55 d5 d5 d5 d5 55 55 55  55 55 55 55 55 55 55 55  |U....UUUUUUUUUUU|
000001f0  55 55 55 55 55 55 55 55  55 55 55 55 d5 55 55 d5  |UUUUUUUUUUUU.UU.|
00000200  55 55 55 55 55 55 55 55  55 d5 d5 d5 d5 d5 55 55  |UUUUUUUUU.....UU|
00000210  55 55 55 55 55 55 55 55  55 55 55 55 55 55 55 d5  |UUUUUUUUUUUUUUU.|
00000220  55 55 d5 55 d5 55 55 d5  55 d5 55 55 d5 55 d5 d5  |UU.U.UU.U.UU.U..|
00000230  d5 d5 d5 d5 d5 d5 d5 d5  d5 d5 d5 d5 d5 d5 d5 d5  |................|
*
00000ba0  d5 d5 d5 d5 d5 d5 d5 d5  d5 d5 d5 55 55 d5 55 d5  |...........UU.U.|
00000bb0  55 55 d5 55 d5 55 d5 d5  55 d5 55 55 55 55 55 55  |UU.U.U..U.UUUUUU|
00000bc0  55 55 55 55 55 55 55 55  55 d5 d5 55 55 55 55 55  |UUUUUUUUU..UUUUU|
00000bd0  55 55 55 55 55 55 55 d5  55 55 55 55 55 55 d5 55  |UUUUUUU.UUUUUU.U|
00000be0  55 55 55 55 55 55 55 55  55 55 55 d5 55 55 55 55  |UUUUUUUUUUU.UUUU|
00000bf0  55 55 55 55 55 55 55 55  d5 d5 55 55 55 55 55 d5  |UUUUUUUU..UUUUU.|
00000c00  d5 55 55 55 55 d5 d5 d5  55 55 55 55 55 d5 d5 55  |.UUUU...UUUUU..U|
:q

[root@web186 root]#

 

問題思考

相關資料

【1】kindle's blog hexdump,od,xxd

【2】杭州美創科技技術資源中心 使用hexdump 檢視二進位制檔案

 

返回 我使用過的Linux命令系列總目錄

 




使用hexdump工具追蹤EXT4檔案系統中的一個檔案

  昨天追蹤EXT4檔案系統的過程中出了點問題,就是找不到檔案,於是試了一下追蹤FAT32檔案系統的,成功之後有了點信心,今天繼續嗑EXT4檔案系統,終於找到啦,記錄一下。

  • 作業系統:linux(centos 6.5)
  • 檔案系統:EXT4
  • 工具:hexdump,windows自帶計算器
  • 參考資源:《資料重現-檔案系統原理精解與資料恢復最佳實踐》(馬林 著)

         《基於EXT4檔案系統的資料恢復方法研究》(徐國天)

         題為《Ext4檔案系統架構分析》的系列部落格

         題為《 深入理解ext4(一)----extent區段》的部落格

         題為《ext4的Extent解析》的部落格

         題為《ext4_ext_find_extent解析》的部落格


EXT4檔案系統架構(非原創):

  

補充說明:EXT4檔案系統中只有0號塊組的超級塊和塊組描述符表的位置是固定的,其他都不固定。其中,超級塊總是開始於偏移位置1024(位元組),佔據1024個位元組,塊組描述符表緊隨超級塊後面,佔用的大小是不定。

步驟:

1、檢視檔案系統基本情況,新建子目錄和檔案

  

可以看到掛載在/boot目錄下的檔案系統型別是EXT4,因此在改目錄下新建子目錄及檔案:

檔案內容為:“This test is belong to Boot folder!”檔案基本資訊如下:

2、檢視超級塊,找到0號塊組起始塊號、塊大小、每塊組所含塊數、每塊組i節點數、第一個非保留i節點、每個i節點大小。

命令:hexdump -s 1024 -n 1024 -C /dev/sda1

檢視結果:

首先可以看到0x38-0x39是EXT系列檔案系統的簽名標誌:“53 ef”

0x14-0x17是0號塊組起始塊號:0x01,說明超級塊前面有一個塊為保留塊,用來儲存載入程式。

0x18-0x1b是塊大小:0x00,這裡的值指的是將1024位元組左移的位數,移動0位也就是1024位元組,移動一位相當於乘以2,就是2048位元組。

0x20-0x23是每塊組所含塊數:0x2000(十進位制8192)

0x28-0x2b是每塊組所含i節點數:0x07f0(十進位制2032)

0x54-0x57是第一個非保留i節點號:0x0b(11),一般為lost+found目錄

0x58-0x59是每個i節點結構的大小:0x80(十進位制128),也就是每個i節點表項佔用128個位元組。

3、檢視塊組描述符表,找到塊點陣圖塊、i節點點陣圖塊、i節點表起始塊號、塊組目錄數。

命令:hexdump -s 2048 -n 1024 -C /dev/sda1

檢視結果:

塊組描述符表中每個塊組使用32個位元組來描述,因此第一個32位元組描述的就是0號塊組。

0x00-0x04是塊點陣圖塊起始塊號:0x0104

0x05-0x07是i節點點陣圖塊起始塊號:0x0114

0x08-0x0b是i節點表起始塊號:0x0124

0x10-0x11是該塊組的目錄數:0x02

這裡獲取的起始塊號是邏輯塊號(將檔案系統所有的塊從0開始遞增編號),因此在計算偏移量時可以直接乘以每塊位元組數(0x400,也就是十進位制的1024)

這裡補充說明一下:EXT3檔案系統的塊點陣圖塊號、i節點點陣圖塊和i節點表起始塊號是遞增的,而這裡他們三個之間卻是相差一個常量:16。

因為這裡使用了一個EXT4新引進的結構:Flexible 塊組(flex_bg)

Flexible 塊組

  Flexible 塊組的設計目的是組成更大的邏輯塊組,儘量讓大檔案連續,將後設資料聚集加快後設資料載入。因此它的做法是將幾個塊組的塊點陣圖塊,i節點點陣圖塊,i節點表塊放在這個邏輯塊組的第一個塊組中,這樣剩下的塊組中就只儲存了該塊組的超級塊和塊組描述表。

上面的塊組描述表中可以看出這個Flexible 塊組是將16個塊組合成了一個邏輯塊組。

  說起Flexible 塊組就要提起元塊組(Media Block Group),因為他和Flexible 塊組是“有你沒我”的關係。Flexible 塊組是移動了塊點陣圖塊、i節點點陣圖塊、i節點表塊,元塊組是減少了塊組描述符表的備份,原本塊組描述符表和超級塊一起備份在塊組號為0或者3、5、7的冪的塊組,元塊組是隻在一個元塊組的第一、二個塊組和最後一個塊組中備份塊組描述符表,增加元塊組儲存資料的空間。

 

 

 

 

 

 

 

 

 

 

3、從根目錄中找到子目錄

  第一步我們提到了第一個非保留i節點號為11,那麼前面的10個保留i節點的作用是什麼呢(i節點號從1開始編號),這裡只說明2號節點是儲存的是根目錄i節點號,因此我們讀取i節點表的2號表項值就可以找到根目錄所在塊號了。

  計算i節點表項的偏移量涉及到了塊組描述符表中的i節點表起始塊號:0x0124。

  某i節點表項起始位元組=i節點起始塊號*每塊所佔位元組數+(該i節點號-1)*每個i節點表項所佔位元組數

   0x0124*0x400+(0x02-0x01)*0x80=0x49080

下面就可以讀取根目錄i節點表項值了。

命令:hexdump -s 0x49080 -n 128 -C /dev/sda1

檢視結果:

0xa8-0xd7是12個直接塊指標,其中四個位元組為一個單位,表示一個塊號。

(這裡要解釋的是:EXt4檔案系統將12個直接塊指標、1個一級間接塊指標、1個二級間接塊指標、1個三級間接塊指標,一共60個位元組用extent結構來替換,但前提是偏移0xa0-0xa3處的標誌位置為“00 00 08 00”,而這裡全為0,則證明沒有使用extent結構,因此依舊按照塊指標形式查詢根目錄)

圖中可以看出根目錄只佔用了一個塊,塊號為:0x1104

  根目錄的起始偏移位元組為=根目錄所在塊號*每塊所佔位元組數

則根目錄的起始偏移位元組:0x1104*0x400=0x441000

使用命令:hexdump -s 0x441000 -n 1024 -C /dev/sda1 檢視根目錄內容:

檢視/boot目錄下的檔案:

可以看到兩者的內容是相符的,說明我們找的沒有錯。根目錄中BOOTDIR的目錄項用黑色底紋標註。

0x6c-0x6f是該檔案內容所在i節點號:0x7f01

0x70-0x71是本目錄項長度:0x10(16位元組)

0x72是本目錄項名字長度0x07(7個位元組)

0x73是本檔案型別:0x02(表示目錄)

0x74開始是檔名的ASCCI碼:“42 4f 4f 54 44 49 52 00”

在這一步中與FAT32檔案系統的區別有兩個:

  一是怎麼尋找根目錄。FAT32中根目錄在資料區的開頭,因此我們可以直接去資料區讀取;而EXT4檔案系統中,我們需要透過2號i節點表找到根目錄所在的塊號,才能看到根目錄內容,這裡就可以看出EXT4檔案系統將目錄也看作檔案了,因為他的讀取方式和普通檔案是一樣的,只不過普通檔案需要從目錄中得到i節點號,而根目錄是一開始就定好了i節點號。

  二是目錄的大小。FAT32中目錄的大小是固定的(短檔名目錄佔32位元組,長檔名目錄佔多個32位元組),所以當檔名過長時,使用了長檔名機制來解決,而EXT4檔案系統的目錄項大小是在目錄項中靈活定的。比如這一步中我們檢視到的根目錄結果中,開始的12個位元組是本目錄項,緊接著12個位元組是根目錄項,而我們要找的目標目錄項的長度是16個位元組,其中說明部分(i節點號,本目錄項長度位元組數,名字長度,檔案型別)佔用都是一樣的,差就差在檔名部分。但我們也看到檔名後面總有“00”補齊,這是因為目錄項的長度總要是4的倍數,因此不夠時會用0補齊。

4、從i節點表中找到子目錄所在塊號

第三步中我們找到指向子目錄的i節點號為0x7f01,也是邏輯i節點號,因此我們要先找到0x7f01在哪個塊組中:

  某i節點所在塊組=該i節點號/每塊組i節點個數

  0x7f01/0x7f0=0x10(十進位制16)

  某i節點所在i節點表號=該i節點號%每塊組i節點個數

  0x7f01%0x7f0=0x01

因此0x7f01在16號塊組的i節點表中,在改i節點表的1號表項中。

接下來我們要從塊組描述符表中找到16號塊組的i節點表起始塊號,以便找到子目錄所在塊號。

  某塊組在塊組描述符表中偏移位元組=塊組描述符表起始位元組+塊組號*每塊組描述符表項位元組數

  2048+16*32=2560位元組

我們讀取2560偏移位元組開始的32位元組:

可以看到:0x08-0x0b為i節點表起始塊號:0x020021

讀取16號塊組i節點表的1號i節點表項值:

這裡需要重點注意:0x20-0x23處的標誌內容為“00 00 08 00”也就是0x080000,表示使用了extent結構,因此這裡檔案子目錄的搜尋就需要按照extent結構來讀取0x28-0x63這60個位元組的內容。

有個疑問:EXT4檔案系統什麼時候使用extent結構,檢視0號塊組的10個保留i節點時,看到只有8號也就是日誌節點啟用了extent結構,其他都沒有使用,而其他塊組中似乎是都預設啟用extent結構,但也發現了例外,因此不能確定EXT4關於啟用extent結構的規定,後續需要注意!

下面介紹一下extent的結構,內容有參考。

每個extent結構佔用12個位元組,所以每個i節點表項中可以有60/12=5個extent結構,這其中第一個extent作為extent頭(extent header是一個B+樹的描述頭),剩下的4個是extent體(extent body,由於extent樹中的節點有兩種:索引節點和葉子節點,因此當節點為索引節點時(可以從extent header中區分索引節點和葉子節點)extent body儲存的是下一級extent樹節點資訊,當節點為葉子節點時extent body 中儲存的是資料塊塊號資訊)

extent樹結構

 

extent資料結構

extent header

 

這裡要說明的是:魔數是一個校驗值,只有當校驗結果是0xf30a時B+樹的塊才正確

        節點在extent樹中的深度是從葉子節點算起,因此根節點的深度是最深的(看到有人說根節點的最大深度不超過5),當深度為0時表明是葉子節點,那麼這個節點就是資料節點,他後面的extent body就是指向的資料塊,儲存資料塊號;當深度大於0,後面的extent body表示索引節點。

extent body

當為索引節點時

當為葉子節點時

 

補充說明:當extent body表示索引節點時最後最後兩個節點冗餘是為了遷就葉子節點。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

從0x28-0x63是extent結構。

extent頭中說明的資訊有:本區段有一個extent body,最大區段個數為4,本段在extent樹中深度為0,是葉子節點。

後面緊著的12個位元組是extent body說明的資訊有:本區段的第一個塊號是0,本區段含有一個塊,本區段指向的資料塊塊號為0x021002。

該塊的偏移位元組:0x8400800

5、從子目錄對應的i節點號得到目標檔案塊號

檢視結果第4步中子目錄塊內容:

加黑色底紋的是本目錄(“.”)和根目錄(“..”)接下來就是目標檔案:BOOTTEXT.txt,他的i節點號為:0x7f04

 檢視i節點表,找到目標檔案的塊號:

  該i節點表項的偏移位元組為:0x020021*0x400+(0x7f04%0x7f0-1)*0x80=0x8008580

讀取該偏移位元組處開始的128位元組內容:

同樣目標檔案的i節點表項也啟用了extent結構,按照與第4步同樣的方法分析,得帶目標檔案所在塊號0x024005(偏移位元組為0x9001400)。

接下來讀取該塊內容:

找到啦!和第一步中使用cat命令檢視的檔案內容一致。

 



hexdump是Linux下的一個二進位制檔案檢視工具,可以將二進位制檔案轉換為ASCII、10進位制、16進位制或8進位制進行檢視。

首先我們準備一個測試用的檔案test,十六進位制如下:

 

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F

選項:

 

-n length

只格式化輸入檔案的前length個位元組

 

-C

輸出十六進位制和對應字元

輸入:

 

hexdump -n 13 -C test

輸出:

 

00000000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c |.............|0000000d

 

-s 從偏移量開始輸出

輸入:

 

hexdump -n 13 -C -s 30 test

輸出:

 

0000001e 1e 1f 20 21 22 23 24 25 26 27 28 29 2a |.. !"#$%&'()*|0000002b


hexdump高階用法:
-e 指定格式字串,格式字串包含在一對單引號中,格式字串形如:'a/b "format1" "format2"'

每個格式字串由三部分組成,每個由空格分隔,

第一個形如a/b,b表示對每b個輸入位元組應用format1格式,a表示對每a個輸入位元組應用format2格式,一般a>b,且b只能為1,2,4,另外a可以省略,省略則a=1。

format1和format2中可以使用類似printf的格式字串,

如:%02d:兩位十進位制

%03x:三位十六進位制

%02o:兩位八進位制

%c:單個字元

 

還有一些特殊的用法:

%_ad:標記下一個輸出位元組的序號,用十進位制表示%_ax:標記下一個輸出位元組的序號,用十六進位制表示
%_ao:標記下一個輸出位元組的序號,用八進位制表示

%_p:對不能以常規字元顯示的用.代替同一行如果要顯示多個格式字串,則可以跟多個-e選項








About Me

.............................................................................................................................................

● 本文作者:小麥苗,部分內容整理自網路,若有侵權請聯絡小麥苗刪除

● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、部落格園(http://www.cnblogs.com/lhrbest)和個人微信公眾號(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/

● 本文部落格園地址:http://www.cnblogs.com/lhrbest

● 本文pdf版、個人簡介及小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● DBA寶典今日頭條號地址:

.............................................................................................................................................

● QQ群號:230161599(滿)、618766405

● 微信群:可加我微信,我拉大家進群,非誠勿擾

● 聯絡我請加QQ好友646634621,註明新增緣由

● 於 2018-01-01 06:00 ~ 2018-01-31 24:00 在魔都完成

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

.............................................................................................................................................

小麥苗的微店

小麥苗出版的資料庫類叢書http://blog.itpub.net/26736162/viewspace-2142121/

好訊息:小麥苗OCP、OCM開班啦,詳情請點選http://blog.itpub.net/26736162/viewspace-2148098/

.............................................................................................................................................

使用微信客戶端掃描下面的二維碼來關注小麥苗的微信公眾號(xiaomaimiaolhr)及QQ群(DBA寶典),學習最實用的資料庫技術。

小麥苗的微信公眾號小麥苗的DBA寶典QQ群2《DBA筆試面寶典》讀者群小麥苗的微店

   小麥苗的微信公眾號      小麥苗的DBA寶典QQ群2     《DBA筆試面試寶典》讀者群       小麥苗的微店

.............................................................................................................................................

在AIX或Linux下,如何檢視磁碟是否包含資料?
DBA筆試面試講解群
《DBA寶典》讀者群 歡迎與我聯絡



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2149976/,如需轉載,請註明出處,否則將追究法律責任。

相關文章