色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux的文件系統及文件緩存的知識點

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2023-02-13 13:52 ? 次閱讀

文件系統的特點

文件系統要有嚴格的組織形式,使得文件能夠以塊為單位進行存儲。

文件系統中也要有索引區,用來方便查找一個文件分成的多個塊都存放在了什么位置。

如果文件系統中有的文件是熱點文件,近期經常被讀取和寫入,文件系統應該有緩存層。

文件應該用文件夾的形式組織起來,方便管理和查詢。

Linux內核要在自己的內存里面維護一套數據結構,來保存哪些文件被哪些進程打開和使用。

總體來說,文件系統的主要功能梳理如下:

e3f339e2-aa86-11ed-bfe3-dac502259ad0.png

inode與塊的存儲

硬盤分成相同大小的單元,我們稱為塊(Block)。一塊的大小是扇區大小的整數倍,默認是4K。在格式化的時候,這個值是可以設定的。

一大塊硬盤被分成了一個個小的塊,用來存放文件的數據部分。這樣一來,如果我們像存放一個文件,就不用給他分配一塊連續的空間了。我們可以分散成一個個小塊進行存放。這樣就靈活得多,也比較容易添加、刪除和插入數據。

inode就是文件索引的意思,我們每個文件都會對應一個inode;一個文件夾就是一個文件,也對應一個inode。

inode數據結構如下:

structext4_inode{
__le16i_mode;/*Filemode*/
__le16i_uid;/*Low16bitsofOwnerUid*/
__le32i_size_lo;/*Sizeinbytes*/
__le32i_atime;/*Accesstime*/
__le32i_ctime;/*InodeChangetime*/
__le32i_mtime;/*Modificationtime*/
__le32i_dtime;/*DeletionTime*/
__le16i_gid;/*Low16bitsofGroupId*/
__le16i_links_count;/*Linkscount*/
__le32i_blocks_lo;/*Blockscount*/
__le32i_flags;/*Fileflags*/
......
__le32i_block[EXT4_N_BLOCKS];/*Pointerstoblocks*/
__le32i_generation;/*Fileversion(forNFS)*/
__le32i_file_acl_lo;/*FileACL*/
__le32i_size_high;
......
};

inode里面有文件的讀寫權限i_mode,屬于哪個用戶i_uid,哪個組i_gid,大小是多少i_size_io,占用多少個塊i_blocks_io,i_atime是access time,是最近一次訪問文件的時間;i_ctime是change time,是最近一次更改inode的時間;i_mtime是modify time,是最近一次更改文件的時間等。

所有的文件都是保存在i_block里面。具體保存規則由EXT4_N_BLOCKS決定,EXT4_N_BLOCKS有如下的定義:

#defineEXT4_NDIR_BLOCKS12
#defineEXT4_IND_BLOCKEXT4_NDIR_BLOCKS
#defineEXT4_DIND_BLOCK(EXT4_IND_BLOCK+1)
#defineEXT4_TIND_BLOCK(EXT4_DIND_BLOCK+1)
#defineEXT4_N_BLOCKS(EXT4_TIND_BLOCK+1)

在ext2和ext3中,其中前12項直接保存了塊的位置,也就是說,我們可以通過i_block[0-11],直接得到保存文件內容的塊。

e41babd4-aa86-11ed-bfe3-dac502259ad0.jpg

但是,如果一個文件比較大,12塊放不下。當我們用到i_block[12]的時候,就不能直接放數據塊的位置了,要不然i_block很快就會用完了。

那么可以讓i_block[12]指向一個塊,這個塊里面不放數據塊,而是放數據塊的位置,這個塊我們稱為間接塊。如果文件再大一些,i_block[13]會指向一個塊,我們可以用二次間接塊。二次間接塊里面存放了間接塊的位置,間接塊里面存放了數據塊的位置,數據塊里面存放的是真正的數據。如果文件再大點,那么i_block[14]同理。

這里面有一個非常顯著的問題,對于大文件來講,我們要多次讀取硬盤才能找到相應的塊,這樣訪問速度就會比較慢。

為了解決這個問題,ext4做了一定的改變。它引入了一個新的概念,叫作Extents。比方說,一個文件大小為128M,如果使用4k大小的塊進行存儲,需要32k個塊。如果按照ext2或者ext3那樣散著放,數量太大了。但是Extents可以用于存放連續的塊,也就是說,我們可以把128M放在一個Extents里面。這樣的話,對大文件的讀寫性能提高了,文件碎片也減少了。

Exents是一個樹狀結構:

e43d0194-aa86-11ed-bfe3-dac502259ad0.jpg

每個節點都有一個頭,ext4_extent_header可以用來描述某個節點。

structext4_extent_header{
__le16eh_magic;/*probablywillsupportdifferentformats*/
__le16eh_entries;/*numberofvalidentries*/
__le16eh_max;/*capacityofstoreinentries*/
__le16eh_depth;/*hastreerealunderlyingblocks?*/
__le32eh_generation;/*generationofthetree*/
};

eh_entries表示這個節點里面有多少項。這里的項分兩種,如果是葉子節點,這一項會直接指向硬盤上的連續塊的地址,我們稱為數據節點ext4_extent;如果是分支節點,這一項會指向下一層的分支節點或者葉子節點,我們稱為索引節點ext4_extent_idx。這兩種類型的項的大小都是12個byte。

/*
*Thisistheextenton-diskstructure.
*It'susedatthebottomofthetree.
*/
structext4_extent{
__le32ee_block;/*firstlogicalblockextentcovers*/
__le16ee_len;/*numberofblockscoveredbyextent*/
__le16ee_start_hi;/*high16bitsofphysicalblock*/
__le32ee_start_lo;/*low32bitsofphysicalblock*/
};
/*
*Thisisindexon-diskstructure.
*It'susedatallthelevelsexceptthebottom.
*/
structext4_extent_idx{
__le32ei_block;/*indexcoverslogicalblocksfrom'block'*/
__le32ei_leaf_lo;/*pointertothephysicalblockofthenext*
*level.leafornextindexcouldbethere*/
__le16ei_leaf_hi;/*high16bitsofphysicalblock*/
__u16ei_unused;
};如果文件不大,inode里面的i_block中,可以放得下一個ext4_extent_header和4項ext4_extent。所以這個時候,eh_depth為0,也即inode里面的就是葉子節點,樹高度為0。

如果文件比較大,4個extent放不下,就要分裂成為一棵樹,eh_depth>0的節點就是索引節點,其中根節點深度最大,在inode中。最底層eh_depth=0的是葉子節點。

除了根節點,其他的節點都保存在一個塊4k里面,4k扣除ext4_extent_header的12個byte,剩下的能夠放340項,每個extent最大能表示128MB的數據,340個extent會使你的表示的文件達到42.5GB。

inode位圖和塊位圖

inode的位圖大小為4k,每一位對應一個inode。如果是1,表示這個inode已經被用了;如果是0,則表示沒被用。block的位圖同理。

在Linux操作系統里面,想要創建一個新文件,會調用open函數,并且參數會有O_CREAT。這表示當文件找不到的時候,我們就需要創建一個。那么open函數的調用過程大致是:要打開一個文件,先要根據路徑找到文件夾。如果發現文件夾下面沒有這個文件,同時又設置了O_CREAT,就說明我們要在這個文件夾下面創建一個文件。

創建一個文件,那么就需要創建一個inode,那么就會從文件系統里面讀取inode位圖,然后找到下一個為0的inode,就是空閑的inode。對于block位圖,在寫入文件的時候,也會有這個過程。

文件系統的格式 數據塊的位圖是放在一個塊里面的,共4k。每位表示一個數據塊,共可以表示4?1024?8=215個數據塊。如果每個數據塊也是按默認的4K,最大可以表示空間為215?4?1024=227個byte,也就是128M,那么顯然是不夠的。

這個時候就需要用到塊組,數據結構為ext4_group_desc,這里面對于一個塊組里的inode位圖bg_inode_bitmap_lo、塊位圖bg_block_bitmap_lo、inode列表bg_inode_table_lo,都有相應的成員變量。

這樣一個個塊組,就基本構成了我們整個文件系統的結構。因為塊組有多個,塊組描述符也同樣組成一個列表,我們把這些稱為塊組描述符表。

我們還需要有一個數據結構,對整個文件系統的情況進行描述,這個就是超級塊ext4_super_block。里面有整個文件系統一共有多少inode,s_inodes_count;一共有多少塊,s_blocks_count_lo,每個塊組有多少inode,s_inodes_per_group,每個塊組有多少塊,s_blocks_per_group等。這些都是這類的全局信息

最終,整個文件系統格式就是下面這個樣子。

e4581966-aa86-11ed-bfe3-dac502259ad0.jpg

默認情況下,超級塊和塊組描述符表都有副本保存在每一個塊組里面。防止這些數據丟失了,導致整個文件系統都打不開了。

由于如果每個塊組里面都保存一份完整的塊組描述符表,一方面很浪費空間;另一個方面,由于一個塊組最大128M,而塊組描述符表里面有多少項,這就限制了有多少個塊組,128M * 塊組的總數目是整個文件系統的大小,就被限制住了。

因此引入Meta Block Groups特性。

首先,塊組描述符表不會保存所有塊組的描述符了,而是將塊組分成多個組,我們稱為元塊組(Meta Block Group)。每個元塊組里面的塊組描述符表僅僅包括自己的,一個元塊組包含64個塊組,這樣一個元塊組中的塊組描述符表最多64項。

我們假設一共有256個塊組,原來是一個整的塊組描述符表,里面有256項,要備份就全備份,現在分成4個元塊組,每個元塊組里面的塊組描述符表就只有64項了,這就小多了,而且四個元塊組自己備份自己的。

e470ecca-aa86-11ed-bfe3-dac502259ad0.jpg

根據圖中,每一個元塊組包含64個塊組,塊組描述符表也是64項,備份三份,在元塊組的第一個,第二個和最后一個塊組的開始處。

如果開啟了sparse_super特性,超級塊和塊組描述符表的副本只會保存在塊組索引為0、3、5、7的整數冪里。所以上圖的超級塊只在索引為0、3、5、7等的整數冪里。

目錄的存儲格式

其實目錄本身也是個文件,也有inode。inode里面也是指向一些塊。和普通文件不同的是,普通文件的塊里面保存的是文件數據,而目錄文件的塊里面保存的是目錄里面一項一項的文件信息。這些信息我們稱為ext4_dir_entry。

在目錄文件的塊中,最簡單的保存格式是列表,每一項都會保存這個目錄的下一級的文件的文件名和對應的inode,通過這個inode,就能找到真正的文件。第一項是“.”,表示當前目錄,第二項是“…”,表示上一級目錄,接下來就是一項一項的文件名和inode。

如果在inode中設置EXT4_INDEX_FL標志,那么就表示根據索引查找文件。索引項會維護一個文件名的哈希值和數據塊的一個映射關系。

如果我們要查找一個目錄下面的文件名,可以通過名稱取哈希。如果哈希能夠匹配上,就說明這個文件的信息在相應的塊里面。然后打開這個塊,如果里面不再是索引,而是索引樹的葉子節點的話,那里面還是ext4_dir_entry的列表,我們只要一項一項找文件名就行。通過索引樹,我們可以將一個目錄下面的N多的文件分散到很多的塊里面,可以很快地進行查找。

e487466e-aa86-11ed-bfe3-dac502259ad0.jpg

Linux中的文件緩存

ext4文件系統層

對于ext4文件系統來講,內核定義了一個ext4_file_operations。

conststructfile_operationsext4_file_operations={
......
.read_iter=ext4_file_read_iter,
.write_iter=ext4_file_write_iter,
......
}

ext4_file_read_iter會調用generic_file_read_iter,ext4_file_write_iter會調用__generic_file_write_iter。

ssize_t
generic_file_read_iter(structkiocb*iocb,structiov_iter*iter)
{
......
if(iocb->ki_flags&IOCB_DIRECT){
......
structaddress_space*mapping=file->f_mapping;
......
retval=mapping->a_ops->direct_IO(iocb,iter);
}
......
retval=generic_file_buffered_read(iocb,iter,retval);
}


ssize_t__generic_file_write_iter(structkiocb*iocb,structiov_iter*from)
{
......
if(iocb->ki_flags&IOCB_DIRECT){
......
written=generic_file_direct_write(iocb,from);
......
}else{
......
written=generic_perform_write(file,from,iocb->ki_pos);
......
}
}generic_file_read_iter和__generic_file_write_iter有相似的邏輯,就是要區分是否用緩存。因此,根據是否使用內存做緩存,我們可以把文件的I/O操作分為兩種類型。

第一種類型是緩存I/O。大多數文件系統的默認I/O操作都是緩存I/O。對于讀操作來講,操作系統會先檢查,內核的緩沖區有沒有需要的數據。如果已經緩存了,那就直接從緩存中返回;否則從磁盤中讀取,然后緩存在操作系統的緩存中。對于寫操作來講,操作系統會先將數據從用戶空間復制到內核空間的緩存中。這時對用戶程序來說,寫操作就已經完成。至于什么時候再寫到磁盤中由操作系統決定,除非顯式地調用了sync同步命令。

第二種類型是直接IO,就是應用程序直接訪問磁盤數據,而不經過內核緩沖區,從而減少了在內核緩存和用戶程序之間數據復制。

如果在寫的邏輯__generic_file_write_iter里面,發現設置了IOCB_DIRECT,則調用generic_file_direct_write,里面同樣會調用address_space的direct_IO的函數,將數據直接寫入硬盤。

帶緩存的寫入操作

我們先來看帶緩存寫入的函數generic_perform_write。

ssize_tgeneric_perform_write(structfile*file,
structiov_iter*i,loff_tpos)
{
structaddress_space*mapping=file->f_mapping;
conststructaddress_space_operations*a_ops=mapping->a_ops;
do{
structpage*page;
unsignedlongoffset;/*Offsetintopagecachepage*/
unsignedlongbytes;/*Bytestowritetopage*/
status=a_ops->write_begin(file,mapping,pos,bytes,flags,
&page,&fsdata);
copied=iov_iter_copy_from_user_atomic(page,i,offset,bytes);
flush_dcache_page(page);
status=a_ops->write_end(file,mapping,pos,bytes,copied,
page,fsdata);
pos+=copied;
written+=copied;


balance_dirty_pages_ratelimited(mapping);
}while(iov_iter_count(i));
}

循環中主要做了這幾件事:

對于每一頁,先調用address_space的write_begin做一些準備;

調用iov_iter_copy_from_user_atomic,將寫入的內容從用戶態拷貝到內核態的頁中;

調用address_space的write_end完成寫操作;

調用balance_dirty_pages_ratelimited,看臟頁是否太多,需要寫回硬盤。所謂臟頁,就是寫入到緩存,但是還沒有寫入到硬盤的頁面。

對于第一步,調用的是ext4_write_begin來說,主要做兩件事:

第一做日志相關的工作。

ext4是一種日志文件系統,是為了防止突然斷電的時候的數據丟失,引入了日志(Journal)模式。日志文件系統比非日志文件系統多了一個Journal區域。文件在ext4中分兩部分存儲,一部分是文件的元數據,另一部分是數據。元數據和數據的操作日志Journal也是分開管理的。你可以在掛載ext4的時候,選擇Journal模式。這種模式在將數據寫入文件系統前,必須等待元數據和數據的日志已經落盤才能發揮作用。這樣性能比較差,但是最安全。

另一種模式是order模式。這個模式不記錄數據的日志,只記錄元數據的日志,但是在寫元數據的日志前,必須先確保數據已經落盤。這個折中,是默認模式。

還有一種模式是writeback,不記錄數據的日志,僅記錄元數據的日志,并且不保證數據比元數據先落盤。這個性能最好,但是最不安全。

第二調用grab_cache_page_write_begin來,得到應該寫入的緩存頁。

structpage*grab_cache_page_write_begin(structaddress_space*mapping,
pgoff_tindex,unsignedflags)
{
structpage*page;
intfgp_flags=FGP_LOCK|FGP_WRITE|FGP_CREAT;
page=pagecache_get_page(mapping,index,fgp_flags,
mapping_gfp_mask(mapping));
if(page)
wait_for_stable_page(page);
returnpage;
}

在內核中,緩存以頁為單位放在內存里面,每一個打開的文件都有一個struct file結構,每個struct file結構都有一個struct address_space用于關聯文件和內存,就是在這個結構里面,有一棵樹,用于保存所有與這個文件相關的的緩存頁。

對于第二步,調用iov_iter_copy_from_user_atomic。先將分配好的頁面調用kmap_atomic映射到內核里面的一個虛擬地址,然后將用戶態的數據拷貝到內核態的頁面的虛擬地址中,調用kunmap_atomic把內核里面的映射刪除。

size_tiov_iter_copy_from_user_atomic(structpage*page,
structiov_iter*i,unsignedlongoffset,size_tbytes)
{
char*kaddr=kmap_atomic(page),*p=kaddr+offset;
iterate_all_kinds(i,bytes,v,
copyin((p+=v.iov_len)-v.iov_len,v.iov_base,v.iov_len),
memcpy_from_page((p+=v.bv_len)-v.bv_len,v.bv_page,
v.bv_offset,v.bv_len),
memcpy((p+=v.iov_len)-v.iov_len,v.iov_base,v.iov_len)
)
kunmap_atomic(kaddr);
returnbytes;
}

第三步中,調用ext4_write_end完成寫入。這里面會調用ext4_journal_stop完成日志的寫入,會調用block_write_end->__block_commit_write->mark_buffer_dirty,將修改過的緩存標記為臟頁。可以看出,其實所謂的完成寫入,并沒有真正寫入硬盤,僅僅是寫入緩存后,標記為臟頁。

第四步,調用 balance_dirty_pages_ratelimited,是回寫臟頁。

/**
*balance_dirty_pages_ratelimited-balancedirtymemorystate
*@mapping:address_spacewhichwasdirtied
*
*Processeswhicharedirtyingmemoryshouldcallinhereonceforeachpage
*whichwasnewlydirtied.Thefunctionwillperiodicallycheckthesystem's
*dirtystateandwillinitiatewritebackifneeded.
*/
voidbalance_dirty_pages_ratelimited(structaddress_space*mapping)
{
structinode*inode=mapping->host;
structbacking_dev_info*bdi=inode_to_bdi(inode);
structbdi_writeback*wb=NULL;
intratelimit;
......
if(unlikely(current->nr_dirtied>=ratelimit))
balance_dirty_pages(mapping,wb,current->nr_dirtied);
......
}

在balance_dirty_pages_ratelimited里面,發現臟頁的數目超過了規定的數目,就調用balance_dirty_pages->wb_start_background_writeback,啟動一個背后線程開始回寫。

另外還有幾種場景也會觸發回寫:

用戶主動調用sync,將緩存刷到硬盤上去,最終會調用wakeup_flusher_threads,同步臟頁;

當內存十分緊張,以至于無法分配頁面的時候,會調用free_more_memory,最終會調用wakeup_flusher_threads,釋放臟頁;

臟頁已經更新了較長時間,時間上超過了設定時間,需要及時回寫,保持內存和磁盤上數據一致性。

帶緩存的讀操作

看帶緩存的讀,對應的是函數generic_file_buffered_read。

staticssize_tgeneric_file_buffered_read(structkiocb*iocb,
structiov_iter*iter,ssize_twritten)
{
structfile*filp=iocb->ki_filp;
structaddress_space*mapping=filp->f_mapping;
structinode*inode=mapping->host;
for(;;){
structpage*page;
pgoff_tend_index;
loff_tisize;
page=find_get_page(mapping,index);
if(!page){
if(iocb->ki_flags&IOCB_NOWAIT)
gotowould_block;
page_cache_sync_readahead(mapping,
ra,filp,
index,last_index-index);
page=find_get_page(mapping,index);
if(unlikely(page==NULL))
gotono_cached_page;
}
if(PageReadahead(page)){
page_cache_async_readahead(mapping,
ra,filp,page,
index,last_index-index);
}
/*
*Ok,wehavethepage,andit'sup-to-date,so
*nowwecancopyittouserspace...
*/
ret=copy_page_to_iter(page,offset,nr,iter);
}
}

在generic_file_buffered_read函數中,我們需要先找到page cache里面是否有緩存頁。如果沒有找到,不但讀取這一頁,還要進行預讀,這需要在page_cache_sync_readahead函數中實現。預讀完了以后,再試一把查找緩存頁。

如果第一次找緩存頁就找到了,我們還是要判斷,是不是應該繼續預讀;如果需要,就調用page_cache_async_readahead發起一個異步預讀。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲
    +關注

    關注

    13

    文章

    4328

    瀏覽量

    85942
  • Linux
    +關注

    關注

    87

    文章

    11319

    瀏覽量

    209830
  • 文件系統
    +關注

    關注

    0

    文章

    287

    瀏覽量

    19926

原文標題:Linux 的文件系統及文件緩存知識點整理

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux文件系統知識點詳解

    今天浩道跟大家分享關于Linux文件及目錄屬性知識點的硬核干貨,可以說只要你認真看完這篇文章內容,其相關知識點都不在話下,感興趣又想快速掌握的小伙伴們,可以收藏起來隨時查看!
    的頭像 發表于 11-02 09:29 ?682次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>文件系統</b><b class='flag-5'>知識點</b>詳解

    關于proc文件系統知識點總結的太棒了

    關于proc文件系統知識點總結的太棒了
    發表于 04-28 06:50

    Linux文件系統課程

    本章學習目標理解什么是文件系統了解文件系統工作原理理解Fedora Core Linux文件系統的結構掌握Fedora Core Linux
    發表于 04-10 17:07 ?0次下載

    Linux文件系統簡介

    Linux文件系統簡介 什么是根文件   根文件系統首先是一種文件系統,但是相對于普通的文件系統
    發表于 04-21 17:01 ?5113次閱讀

    玩轉Linux,先把文件系統搞懂

    Linux 支持多種文件系統,包括 ext2 、 ext3 、 vfat 、 ntfs 、 iso9660 、 jffs 、 romfs 和 nfs 等,為了對各類文件系統進行統一管理, Li
    發表于 08-16 10:50 ?2078次閱讀
    玩轉<b class='flag-5'>Linux</b>,先把<b class='flag-5'>文件系統</b>搞懂

    Linux設備驅動開發詳解》第5章、Linux文件系統與設備文件系統

    Linux設備驅動開發詳解》第5章、Linux文件系統與設備文件系統
    發表于 10-27 14:13 ?0次下載
    《<b class='flag-5'>Linux</b>設備驅動開發詳解》第5章、<b class='flag-5'>Linux</b><b class='flag-5'>文件系統</b>與設備<b class='flag-5'>文件系統</b>

    Linux 內核/sys 文件系統介紹

    linux2.6內核引入sysfs文件系統,sysfs可以看成與proc,devfs和devpty同類別的文件系統,該文件系統是虛擬的文件系統
    發表于 04-25 16:20 ?4301次閱讀
    <b class='flag-5'>Linux</b> 內核/sys <b class='flag-5'>文件系統</b>介紹

    可以了解的Linux 文件系統結構

    Linux中的文件是什么?它的文件系統又是什么?那些配置文件又在哪里?我下載好的程序保存在哪里了?在 Linux
    發表于 04-27 14:06 ?722次閱讀
    可以了解的<b class='flag-5'>Linux</b> <b class='flag-5'>文件系統</b>結構

    Linux最新UBI文件系統介紹

    嵌入式linux中文站關注嵌入式linux文件系統的發展。在linux-2.6.27以前,談到Flash文件系統,大家很多時候多會想到cra
    發表于 04-27 19:37 ?6394次閱讀

    linux文件系統中的虛擬文件系統設計詳解

    Linux 中允許眾多不同的文件系統共存,如 ext2, ext3, vfat 等。通過使用同一套文件 I/O 系統 調用即可對 Linux
    發表于 04-02 14:37 ?1833次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>文件系統</b>中的虛擬<b class='flag-5'>文件系統</b>設計詳解

    Linux文件系統解析

    Linux 中,最直觀、最可見的部分就是 文件系統(file system)。下面我們就來一起探討一下關于 Linux 中國的文件系統,系統
    的頭像 發表于 09-16 11:29 ?2476次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>文件系統</b>解析

    rootfs根文件系統制作

    本文記錄了根文件系統的一些知識點,Busybox 工具的使用和 最小根文件系統的制作。
    發表于 10-31 11:56 ?2次下載

    適用于Linux的最佳通用文件系統 Linux文件系統的安裝

    為您的計算機選擇正確的文件系統可能是一個困難的過程。您可能會想知道:為什么文件系統很重要?有沒有適用于安裝 Linux 的特定文件系統? 事實證明,有兩種
    發表于 08-03 10:22 ?349次閱讀
    適用于<b class='flag-5'>Linux</b>的最佳通用<b class='flag-5'>文件系統</b> <b class='flag-5'>Linux</b><b class='flag-5'>文件系統</b>的安裝

    Linux文件系統特點

    ,近期經常被讀取和寫入,文件系統應該有緩存層。 文件應該用文件夾的形式組織起來,方便管理和查詢。 Linux內核要在自己的內存里面維護一套數
    的頭像 發表于 11-09 14:48 ?1216次閱讀
    <b class='flag-5'>Linux</b>的<b class='flag-5'>文件系統</b>特點

    Linux文件系統的掛載過程

    Linux文件系統(rootfs)是Linux系統中所有其他文件系統和目錄的起點,它是內核啟動時掛載的第一個
    的頭像 發表于 10-05 16:50 ?443次閱讀
    主站蜘蛛池模板: 欧美xxxxx18| 一本道本线中文无码| 97精品少妇偷拍AV| 牛牛免费视频| c了瑜伽老师嗷嗷叫一节课视频| 高h 大尺度纯肉 np快穿| 四川少妇大战4黑人| 国产一区亚洲| 在线免费国产| 人妻夜夜爽99麻豆AV| 父皇轻点插好疼H限| 亚洲 中文 自拍 无码| 久久久久久久久女黄| jizz非洲| 亚洲高清中文字幕免费| 龙岩综合频道| 丰满少妇69激懒啪啪无码| 亚洲精品国产精品麻豆99| 麻豆免费观看高清完整视频| 赤兔CHINESE最新男18GUY| 亚洲AV成人片色在线观看网站| 毛片在线播放网址| 国产精品96久久久久久AV网址 | 区一区二视频免费观看| 国产无遮挡无码视频在线观看不卡 | 蜜桃最新网址| 成在线人免费| 亚洲综合无码一区二区| 日本精品久久久久中文字幕| 精品国产在线亚洲欧美| YELLOW免费观看2019| 亚洲精品天堂无码中文字幕影院 | 草莓视频在线观看免费观看高清| 幸福草电视剧演员表介绍| 免费观看视频成人国产| 国产精品一区二区20P| 97色伦在色在线播放| 亚洲激情一区| 色戒床震视频片段| 暖暖视频 免费 高清 日本8| 黑人 尺寸 强行害怕 痛哭|