blocklinux
『壹』 請問linux系統中inode和block的關系
1. inode和block
---------------------------------
提到inode,我們不得不先介紹硬碟的整體結構。硬碟中包含多個硬碟碟片,硬碟碟片為圓形,每個硬碟碟片都有一個可以讀寫的磁頭(Head),將這個磁
頭固定,使硬碟碟片旋轉一周,所走軌跡就是磁軌(Track)。硬碟內所有碟片的相同磁軌號的集合成為磁柱(Cylinder)。每一磁軌被劃分成許多區
域,每個區域叫一個扇區(Sector)。扇區是硬碟的最小存儲物理量,一個扇區的存儲容量大約是512位元組(約0.5K)。
知道了硬碟的大體結構之後,再來談談怎麼進行硬碟分區。進行硬碟分割的最小單位是磁柱,分割完之後自然就是格式化(format)。在Linux中進行格式化必須考慮Block與inode,Block還好理解,它是磁碟可以記錄的最小單位,是由數個扇區組成,所以大小通常為n*512Bytes,例如4K。
那麼inode是什麼呢Block是記錄文件內容的區域,inode則是記錄該文件的屬性及其放置在哪個Block之內的信息。所
以,每個文件都會佔用一個inode。當Linux系統要查找某個文件時,它會先搜索雀咐inode
table找到這個文件的屬性及數據存放地點,然後再查找數據存放的Block進而將數據取出。inode數量在一開始已被設定好,其設定方式通常是"硬
盤大小/一個容量",這個容頃嘩純量比Block大一些較佳,例如剛才將Block設為4K,那麼這個容量可以設為8K左右。所以,一塊1GB的硬碟如果以8K
大小劃分它的inode數,則會有131072個inode。一個inode的大小為128Byte,這樣,我們就可以清楚地知道,一個分區被格式化為一個文件系統之後,基本上它一定會有inode table與數據區域兩大塊,一個用來記錄文件的屬性信息與該文件存放的Block塊,一個用來記錄文件的內容。
2. 硬鏈接
---------------------------------
剛才說過,當系統要讀取某個文件時,它會先讀inode
table,然後根據inode的信息到數據區域將數據取出備用。硬鏈接就是再建立一個inode鏈接到文件放置的Block塊。也就是說,進行硬鏈接
時,實際上您的文件內容不會改變,只是原來的inode與後來添加的inode均可指定到該文件存放的地點,因此,讀取兩個inode的結果都是讀取同一
個文件的內容。不過,這樣一來就有個問題,因為inode會鏈接到Block塊,而"目錄"本身僅消耗inode,這樣,硬鏈接就不能鏈接目錄。所以,硬蘆純
鏈接有兩個最大的限制:
(1) 不能跨文件系統,因為不同的文件系統有不同的inode table;
(2) 不能鏈接目錄。
3. 軟鏈接(符號鏈接)
---------------------------------
相對於硬鏈接,符號鏈接比較好理解,基本上,它是再建立一個獨立文件,而這個文件會讓數據讀取操作指向它鏈接的那個文件。由於只是利用文件作為指向的動作,所以,當源文件被刪除,符號鏈接的文件就打不開了,屏幕會顯式"無法開啟某文件"。
因此,硬鏈接比較安全,因為即某一個inode被刪除,只要還有一個inode,該文件就能被找到。
4. 分區和文件系統
---------------------------------
磁碟分割的重點了: 也就是記錄每一個分割區(Partition)的起始與結束磁柱。好了,那麼這個分割區的起始與結束磁柱的信息放在哪裡呢? 存放在Master Boot Recorder(MBR)
告知系統分割區所在的起始與結束磁柱之後,接著需要將分割區格式化為操作系統認識的文件系統(Filesystem)。因為每個操作系統認識的文件系統並不相同,所以要針對操作系統來格式化分割區 。
一個分割區就是一個文件系統。硬碟的最小儲存單位是扇區(Sector),不過數據儲存的最小單位並不是扇區,因為用
扇區來存儲數據效率低下。因為一個扇區只有512Bytes,而磁頭是一個扇區一個扇區地讀取數據,如果文件有10MBytes,那麼為了讀這個文件,磁
頭必須要進行20480次讀取(I/O)操作。
為了克服這個效率上的困擾,引入了邏輯區塊(Block)。邏輯區塊是在對分割區進行格式化時,所指定的數據最小儲存單位,這個最小儲存單位是建立在扇區
的大小之上的(因為扇區是硬碟的最小物理儲存單位),所以,邏輯區塊的大小為扇區
的2的次方倍數。此時,磁頭一次可以讀取一個邏輯區塊(若干個連續的扇區),如果在格式化時,指定邏輯區塊為4KBytes(亦8個連續的扇區構成一個邏
輯區塊),那麼同樣一個10MBytes的文件,磁頭要讀取的次數則為2560次,可以大幅提高文件的讀取效率。
不過,邏輯區塊單位的規劃並不是越大越好。因為一個邏輯區塊最多僅能容納一個文件。假如邏輯區塊規劃為4KBytes,而一個文件大小為
0.1KBytes,這個小文件將佔用一個邏輯區塊的空間,該邏輯區塊雖然可以容納4Kbytes的容量,然而由於文件只佔用了0.1Kbytes,所
以,實際上剩下的3.9KBytes是不能再被使用了。在考慮邏輯區塊的規劃時,需要同時考慮到:
* 文件讀取的效率
* 文件大小可能造成的硬碟空間浪費
因此,在規劃磁碟時,需要根據主機的用途來進行規劃較佳。例如BBS主機由於文章較短, 邏輯區塊小一點的好;而如果主機主要用在儲存大容量的文件,那麼考慮到效率,邏輯區塊規劃的大一點會比較妥當。
『貳』 Linux裡面block代表什麼意思
在2.4 的 fs/buffers.c 的函數
static int __block_prepare_write(struct inode *inode, struct page *page,
unsigned from, unsigned to, get_block_t *get_block)
中有如下代碼:
if (!page->buffers)
create_empty_buffers(page, inode->i_dev, blocksize);
head = page->buffers;
bbits = inode->i_sb->s_blocksize_bits;
block = page->index << (PAGE_CACHE_SHIFT - bbits);
for(bh = head, block_start = 0; bh != head || !block_start;
block++, block_start=block_end, bh = bh->b_this_page) {
if (!bh)
BUG();
block_end = block_start+blocksize;
if (block_end <= from)
continue;
if (block_start >= to)
break;
if (!buffer_mapped(bh)) {
err = get_block(inode, block, bh, 1);
if (err)
goto out;
if (buffer_new(bh)) {
unmap_underlying_metadata(bh);
if (Page_Uptodate(page)) {
set_bit(BH_Uptodate, &bh->b_state);
continue;
}
if (block_end > to)
memset(kaddr+to, 0, block_end-to);
if (block_start < from)
memset(kaddr+block_start, 0, from-block_start);
if (block_end > to || block_start < from)
flush_dcache_page(page);
continue;
}
}
對unmap_underlying_metadata 的意義不是特別明確, 注釋說是釋放潛在的bh. 實現是從hash中找到bh代表的設備上, bh-->blocknr 那個塊的oldbh, 如果有的話把它釋放.
奇怪的是,既然是新分配的,為什麼慎雹在hash中能找到? 如宏孝察果hash中本來就有, 需要蔽茄新分配嗎?
/*
* We are taking a block for data and we don't want any output from any
* buffer-cache aliases starting from return from that function and
* until the moment when something will explicitly mark the buffer
* dirty (hopefully that will not happen until we will free that block ;-)
* We don't even need to mark it not-uptodate - nobody can expect
* anything from a newly allocated buffer anyway. We used to used
* unmap_buffer() for such invalidation, but that was wrong. We definitely
* don't want to mark the alias unmapped, for example - it would confuse
* anyone who might pick it with bread() afterwards...
*/
static void unmap_underlying_metadata(struct buffer_head * bh)
{
struct buffer_head *old_bh;
old_bh = get_hash_table(bh->b_dev, bh->b_blocknr, bh->b_size);
if (old_bh) {
mark_buffer_clean(old_bh);
wait_on_buffer(old_bh);
clear_bit(BH_Req, &old_bh->b_state);
/* Here we could run brelse or bforget. We use
bforget because it will try to put the buffer
in the freelist. */
__bforget(old_bh);
}
}
『叄』 linux系統存儲同一份文件的多個數據塊(block)是如何聯繫到一起的,和數據塊號的使用時如何聯系起來的
在linux文件系統中,一般是採用索引式文件系統,這種類型的文件系統在硬碟格式化的時候,會將硬碟上的數據塊分為兩種類型的塊,第一種是保存文件信息的inode塊,第二種就是實際存儲數據的data塊。data塊就是你所說的存放數據的地方,然後都有對應的編號,這些編號都是按照順序以表格的形式存放在inode塊中,。
因此,當你要讀取一個文件的內容時,它會先查找inode塊里信息,判斷你是否有許可權讀取這個文件,許可權判斷通過後,再去查找data塊編號變,然後根據編號表裡的編號依次查找所有的data塊,按順序拼接起來,就是一個完整文件的內容了。
『肆』 linux stat 命令顯示的 block 是扇區嗎
不是,是邏輯塊
扇區: 是硬碟片上的最小存儲單位,一個扇區一般是512位元組
邏輯塊(block): 分區進行格式化時所指定的「最小存儲單位」。即文件系統存儲的最小單位;EXT3 文件系統中的塊規格有 1024 Bytes, 2048 Bytes 和4096 Bytes 三種,它並不直接等於扇區的大小
『伍』 linux block 是不是越大越好
一般默認是4096byte,
block小的話,會節省空間,但是會影響讀取速度,
block大的話,對放置大文件,比如iso有幫助,可以提高讀取速度,但是對於雀帆小文件,會浪費很多頃稿雹空敬輪間。
這要看你的具體需求。
『陸』 Linux裡面block和superblock區別是什麼
superblock就相當於文件系統的元數據(MetaData),存儲了文件系統的概略信息,例如如果一個ext文件系統受損,如果superblock沒有問題的話有很大可能恢復
塊設備是一種以塊(block)為單位可以進行隨機存取的硬體設備。常見的塊設備有硬碟,軟盤,快閃記憶體等。
塊設備的最小定址單元是扇區(sector),一個扇區是2\^n個位元組,512Bytes是最常見的扇區大小。內核的文件系統使用塊(block)作為最小定址單元。 常見的block大小為512Bytes,1KB,4KB ; 默認的inode 是存放文件屬性信息的 默認大小128byte(c58) 256byte(c64);
一個文件至少需要佔用一個inode 和block
默認的情況下: inode是足夠的,block消耗的快;
『柒』 Linux中目錄佔用Block不
一般默認嫌裂握是4096byte, block小的話,會節省空間,但是會影響讀取速度, block大的話,對放置大文件,比如iso有幫助,可以提高芹慶讀取速度,但是對於小文件,會浪費很多空間。 這要看你的具體需求。
一般默認是4096byte, block小的話,會源爛節省空間,但是會影響讀取速度, block大的話,對放置大文件,比如iso有幫助,可以提高讀取速度,但是對於小文件,會浪費很多空間。 這要看你的具體需求。
『捌』 Linux系統分區
Linux默認可分為3個分區,分別是boot分區、swap分區和根分區。
boot分區
在linux中,boot是存儲內核及在引導過程中使用文件的分區,是啟動linux時使用的一些核心文件;在boot中包括了系統Kernel的配置文件、啟動管理程序GRUB的目錄、啟動時的模塊供應的主要來源Initrd文件和vmlinuz文件。
/boot分區就是操作系統的內核及在引導過程中使用的文件,一般是幾年前的版本要求劃分的一個區,大小為100MB左右,但現在的新版本都不需要對這個分區進行單獨劃分,也就是說你完全可以不分/boot。
安裝Linux只要求兩個基本分區,即根分區及交換分區,如果你的磁碟空間足夠大,可以多劃分空間給根分區,你也可以把常用的目錄新建到桌面,如下載的軟體包,放到桌面不影響你進入Linux系統的速度,當然這要求你有足夠大的根分區。
swap分區
SWAP就是LINUX下的虛擬內存分區,它的作用是在物理內存使用完之後,將磁碟空間(也就是SWAP分區)虛擬成內存來使用
它和Windows系統的交換文件作用類似,但是它是一段連續的磁碟空間,並且對用戶不可見。
需要注意的是,雖然這個SWAP分區能夠作為"虛擬"的內存,但它的速度比物理內存可是慢多了,因此如果需要更快的速度的話,並不能寄厚望於SWAP,最好的辦法仍然是加大物理內存。SWAP分區只是臨時的解決辦法.
根分區
linux根分區是系統分區的意思,系統內所有的東西都存放在根分區中,也被稱為root分區;Linux是一個樹形文件系統,根分區就是它的root節點,任何的目錄文件都會掛在根節點以下,並且linux只有一個根,不管對硬碟分多少個區,都要將這些分區掛載到根目錄底下才可以使用。
所謂根分區,說白了就是系統分區,是root分區,所有的東西都放在這裡面。
Linux是一個樹形文件系統,根分區就是它的root節點,任何的目錄文件都會掛在根節點以下。Linux只有一個根。你可以給你的硬碟進行分區,但是,分區設備一定掛載到linux根目錄下的指定位置,如/usr,/var,/home等。如果要對分區進行操作的話,只能到分區所掛載的目錄中進行操作。所以,不管對硬碟分多少個區,都要將這些分區掛載到根目錄底下才可以使用。