乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      干貨!大話EXT4文件系統(tǒng)完整版

       張宏韜 2019-12-08

      一:VFS

      VFS架構

      要說Linux文件系統(tǒng),不得不說VFS:Virtual File System,如上圖,Linux設計了一個文件系統(tǒng)的中間層,上層用戶都直接和VFS打交道,文件系統(tǒng)開發(fā)者再把VFS轉換為自己的格式。這樣做的優(yōu)點主要有:

      • 用戶層應用不用關心具體用的是什么文件系統(tǒng), 使用統(tǒng)一的標準接口進行文件操作;

      • 如果一個系統(tǒng)包含不同分區(qū),不同分區(qū)使用不同的文件系統(tǒng),他們之間可以通過這個VFS交互,比如從U盤、網盤拷數(shù)據(jù)到硬盤就得通過VFS轉換管理信息,如下圖;

      • 可以動態(tài)支持很多文件系統(tǒng),添加一個只需要安裝驅動就可以了,不需要內核重新編譯。

        我們來看看這張文件系統(tǒng)層次圖中的每一層。

      1. 用戶層:最上面用戶層就是我們日常使用的各種程序,需要的接口主要是文件的創(chuàng)建、刪除、打開、關閉、寫、讀等。

      2. VFS層:我們知道Linux分為用戶態(tài)和內核態(tài),用戶態(tài)請求硬件資源需要調用System Call通過內核態(tài)去實現(xiàn)。用戶的這些文件相關操作都有對應的System Call函數(shù)接口,接口調用 VFS對應的函數(shù)。

      3. 文件系統(tǒng)層:不同的文件系統(tǒng)實現(xiàn)了VFS的這些函數(shù),通過指針注冊到VFS里面。所以,用戶的操作通過VFS轉到各種文件系統(tǒng)。文件系統(tǒng)把文件讀寫命令轉化為對磁盤LBA的操作,起了一個翻譯和磁盤管理的作用。

      4. 緩存層:文件系統(tǒng)底下有緩存,Page Cache,加速性能。對磁盤LBA的讀寫數(shù)據(jù)緩存到這里。

      5. 塊設備層:塊設備接口Block Device是用來訪問磁盤LBA的層級,讀寫命令組合之后插入到命令隊列,磁盤的驅動從隊列讀命令執(zhí)行。Linux設計了電梯算法等對很多LBA的讀寫進行優(yōu)化排序,盡量把連續(xù)地址放在一起。

      6. 磁盤驅動層:磁盤的驅動程序把對LBA的讀寫命令轉化為各自的協(xié)議,比如變成ATA命令,SCSI命令,或者是自己硬件可以識別的自定義命令,發(fā)送給磁盤控制器。Host Based SSD甚至在塊設備層和磁盤驅動層實現(xiàn)了FTL,變成對Flash芯片的操作。

      7. 磁盤物理層:讀寫物理數(shù)據(jù)到磁盤介質。

      網絡文件系統(tǒng)NFS把文件層之后的操作在遠端實現(xiàn)。下面是NFS基本原理。




      VFS組成

      盡管Linux內核是C語言寫的,但VFS是一種面向對象的框架,把文件相關的東西分為4個對象:

      • Superblock:一個文件系統(tǒng)有一個,含有文件系統(tǒng)的屬性和接口,

        • 屬性:文件系統(tǒng)的一些參數(shù);

        • 接口:mount和umount接口等。

      • Inode:一個文件有一個,含有文件的屬性和文件屬性的接口(不是文件讀寫的接口)。文件夾也當成文件處理,有自己的inode。

        • 屬性:文件名,創(chuàng)建時間,修改時間,訪問權限,文件保存的LBA等;

        • 接口:創(chuàng)建,刪除文件夾等。

      • Dentry :一個目錄有一個,用來方便目錄查找等。訪問文件的時候,用戶發(fā)下來文件路徑,VFS通過Hash的方法直接通過路徑查到最終Dentry,找到inode,來直接查找一個路徑,而不是一級級翻下來。

        • 屬性:目錄名等;

        • 接口:查找文件路徑等。

      • File :對文件進行操作的接口,這個是大家最熟悉的了,讀寫都通過它。

        • 屬性:文件鎖,當前訪問的偏移地址等;

        • 接口:fopen,fclose,fwrite,fread,fsync,異步讀寫等。

      這些對象平時保存在磁盤上,使用時加載到內存并給各種屬性和接口賦值,同時inode和dentry都是有緩存的,這樣每次查找一個路徑,就不用等啊等啊讀磁盤了,翻一下緩存就能快速找到。

      下面是一個文件結構示例:


      Unix風格文件

      那么問題來了,挖掘機技術到底哪家強?有人要問,真的靠一個VFS能統(tǒng)一所有的文件系統(tǒng)操作嗎?微軟那么配合啊,會采用和Linux一樣的接口?所以VFS要求文件系統(tǒng)要有Unix風格,主要是三種Style:

      • 文件夾和文件都是一樣的處理;

      • 文件的信息和文件數(shù)據(jù)分開,文件信息放在inode里面,數(shù)據(jù)放在數(shù)據(jù)塊里面;

      • Superblock來表示文件系統(tǒng)的信息。

      Windows的文件系統(tǒng)FAT,NTFS其實不太一致,有的文件信息不專門用inode來存,有的文件夾和文件區(qū)別開來,這些文件系統(tǒng)磁盤里面沒有superblock,inode,需要在內存中生成inode和superblock來模擬。

      引用

      Robert Love, Linux Kernel Development.

      https://swbae98./tag/ext4/

      二:餓想她超市血拼記

      自從二十多年前一些追尋自由的人建立了Linux市以來,餓想她超市就開始經營超市業(yè)務,并且不斷擴大,每開一家新店,就會用更先進的技術管理商品,給顧客更好的購物體驗,所以現(xiàn)在餓想她已經是Linux市最有人氣的大超市了,市民們的各種日用品都去里面采購,每天人聲鼎沸,熙熙攘攘。

      話說有一個小青年叫蛋蛋,剛從著名的Linux市代碼農業(yè)職業(yè)技術學院畢業(yè),成為了一名光榮的碼農。租好了房之后,他聽說著名的”餓想她”超市在附近新開了第四家分店,叫做EXT4,蛋蛋決定去買些吃的回來。這里我們要提醒一句了,Linux市已經進入了信息化社會,信息就是能量,居民們吃的食物叫做數(shù)據(jù),單位是字節(jié)。

      貨架Block Group

      民以食為天,蛋蛋懷著饑餓的心情,來到餓想她超市大門口,看到了亮閃閃的Logo,興奮的已經飽了半分。餓想她是個工業(yè)化的超市,所有的物品都放在一個叫做sector的盒子里,每個sector大小是512字節(jié),但是餓想她真正登記貨物的最小盒子叫Block,里面放了8個sector,總大小4k字節(jié)。

      餓想她超市把整個超市劃分成很多貨架,叫做Block Group,每個貨架上放了32768個Block盒子。每個貨架上的東西如下圖,后面將一一介紹。Superblock是超市概覽,Group Descriptor 是貨架介紹,Block bitmap是盒子的分布表,Inode Bitmap是貨物標簽分布表,Inode Table是標簽存放的地方,Data Block是貨物存放的地方。

      超市概覽Superblock

      如上圖,蛋蛋提著個購物籃快步走到了一個長長的貨架前面,看著玲瑯滿目的商品,不禁一頭霧水:天哪,我該怎么找東西???還好,旁邊有一位美麗的導購姐姐帶蛋蛋來到貨架最前面,拿起一本小冊子給蛋蛋,上面是整個餓想她超市的介紹,叫做Superblock。里面的主要內容就是下面這張表,冒出了一大堆的名詞,但誰叫蛋蛋是農業(yè)技術學校畢業(yè)的呢,一看就明白了。這里面說了,超市有多少個block盒子,多少個貨物的標簽inode,每個貨架有多少的盒子block per group,超市的開張時間mount time,蛋蛋想一定要記住,周年慶了就來撿便宜貨,嘿嘿~

      引用

      https://ext4.wiki./index.php/Ext4_Disk_Layout

      三:超市貨架的秘密

      上回說到,蛋蛋來到餓想她超市第四家分店EXT4,發(fā)現(xiàn)每個貨架Block Group上都有一份超市概覽Super block的副本供顧客查閱。憑著代碼農業(yè)扎實的基礎,蛋蛋終于搞清楚了貨架的秘密。

      首先我們還是得介紹一下Linux市民和我們當代人類的有一個不同??催^三體的人都知道,三體人沒有語言,而是直接看到對方的思想,不能掩藏自己的想法。Linux市民沒有嘴巴,他們只能通過數(shù)據(jù)來交流,這就是他們以數(shù)據(jù)為食物的原因:說多了,數(shù)據(jù)用沒了,餓了!

      貨架說明Block Group Descriptor

      蛋蛋看完了超市概覽,就把它放回第一個大盒子block里。然后,打開第二個大盒子,從這里開始的幾個大盒子是貨架說明,Block Group Descriptor。

      如下圖,這里面寫了這個貨架上標簽分布表inode bitmap、標簽表inode table在哪里,貨物分布表block bitmap在哪里,貨架上還有多少空盒子free block count,空標簽等等,最后還有一些特殊的字符checksum來幫助檢驗有些重要數(shù)據(jù)是不是寫錯了。

      標簽和數(shù)據(jù)分布表bitmap

      蛋蛋合起盒子,按照貨架說明的指示,打開后面的幾個盒子,分別找到了標簽分布表inode bitmap和盒子分布表block bitmap。前者表示標簽表inode table哪些條目是占用的,后者表示哪些盒子里面有數(shù)據(jù)。他們的內容都是用一個bit是0或者1表示空或者非空。Bit是Linux市民食物字節(jié)的基本元素,8個bit組成了一個字節(jié)。

      標簽表inode table

      蛋蛋看完兩個分布表,就知道貨架上的一個基本情況了,于是關起盒子,按照貨架說明的指示,打開了有一個盒子,上面寫著:標簽表。我們要透漏Linux市的第三個特征了,他們的貨物叫做文件,每個文件在超市里面都有一個標簽來說明和索引,方便查找和管理,叫做inode。

      標簽表里面有貨架上所有貨物的標簽,每個標簽的主要內容如下表。包括了:

      • 貨物的權限,是否是VIP專享,是不是私人定制的,是不是共享的。

      • 是不是某些特殊的貨物,他們并不是拿來吃的,而是一些設備,能夠使用。比如char設備,block設備,都是一些機器,char設備能夠執(zhí)行用戶的命令,block設備可以批量執(zhí)行用戶的一串命令,存數(shù)據(jù),查看數(shù)據(jù)。

      • 貨物的大小,用了多少個字節(jié),用了多少個盒子block。

      • 貨物的最近查看時間,維修時間,移走時間等。

      引用

      https://ext4.wiki./index.php/Ext4_Disk_Layout

      四:神奇的標簽

      上回我們說到,蛋蛋從標簽表中看到了一個標簽inode的內容,inode里面包含的東西除了那些,還有個更重要的就是貨物的位置:到底放哪些盒子里面?

        要知道Linux市的貨物是用字節(jié)組成的長串,有的只占了一個盒子,有的占了多個盒子,甚至成千上萬個盒子,而標簽表只留了60個字節(jié)保存查找信息,根本放不下那么多盒子的位置信息,那么到底該怎么辦?我們來看看聰明的餓想她超市怎么解決這個查找的難題。

      三級映射

      俗話說,有錢能使鬼推磨,為了降低成本,給顧客提供更大的便利,餓想她超市的老板命令工程師趕快解決上面這個問題,搞定了工資翻番,否則卷鋪蓋走人。工程師老蛋剛剛開始Linux的碼農生涯,就接了這么個活,站在自己家的大樹底下冥思苦想,想了幾天幾夜,還是沒有頭緒。一氣之下,他一頭撞在樹皮上,心想自己要跟月亮上的吳剛一樣,一輩子要跟這棵樹為伴了。唉,樹?。“?,樹!哈哈哈哈!大樹底下傳來了老蛋的四聲大笑:我終于明白了,在這個60個字節(jié)里面可以用三級映射來存放貨物的地址,就跟樹的枝干一樣,一級級細分。

      如下圖,開始是頭幾個數(shù)據(jù)盒子的位置,對那種小貨物足夠了。后面是一級映射表的盒子位置,找到這個盒子就能找到所有的1024個數(shù)據(jù)盒子,因為里面放了1024個盒子的位置。如果還不夠,那么就用后面的二級映射,里面是所有一級映射的位置,從一級映射的盒子里面再找到所有的數(shù)據(jù)盒子位置,這樣就是1024*1024個盒子了。尼瑪,還不夠,嘿嘿,后面還有三級映射,總共包含1024*1024*1024個數(shù)據(jù)盒子的位置。

      擴展樹:真正的樹

      老蛋得到了餓想她超市創(chuàng)始老板的嘉獎,成了公司技術骨干。但是,后來超市創(chuàng)始老板退休,少老板接班,新官上任三把火,決定建設一個更厲害的第四家分店ext4。他年輕有為,找到老蛋說:蛋仔,你這個三級映射太麻煩了,位置都是固定死的,修改什么的太麻煩,而且如果盒子都是連續(xù)放置的,還得在映射里面一條條保存他們的位置,一點都不高效,太浪費空間了。回去給我弄個更好的辦法,完不成提頭來見!

      老蛋覺得自己受到了侮辱,成名作被一個小年輕貶的一文不值,忍著內心的悲憤回到家,跟老婆說自己都想跳槽了。老婆聽了,瞪了他一眼:沒本事整更牛的,躲開算什么男人。老蛋一想,腦子也轉過來了,于是又來到熟悉的大樹下,想啊想,還是沒辦法。突然,他想,瞅瞅大樹肯定有辦法,一抬頭,心中頓時豁然開朗:樹啊樹,又是你幫了我,不禁老淚縱橫~

      老蛋這次設計了一棵真正的大樹來放貨物的地址。如下圖,樹有一個根節(jié)點,后面有很多子節(jié)點,每個節(jié)點都有一個header,header后面的數(shù)據(jù)有兩種類型,第一種是索引,就是樹枝的位置,第二種是葉子,放數(shù)據(jù)盒子的位置。這樣一級級就可以查到,而且數(shù)據(jù)節(jié)點表示的是一串連續(xù)盒子的開頭位置和數(shù)量,而不用全都一個個列出來。老蛋再次得到了少莊主的嘉獎,他得意地回家對老婆說:每一個成功的男人背后都有一個不認輸?shù)呐耍?/p>

      節(jié)點頭

      樹枝內容,指向更細的樹枝

      葉子內容

      引用

      https://ext4.wiki./index.php/Ext4_Disk_Layout http://www./2009/11/16/learn-more-about-ext4/ http://blog./uid-26430381-id-4559492.html

      五:按圖索驥找吃的

      蛋蛋自以為搞清楚了貨物標簽的來龍去脈,突然他發(fā)現(xiàn)了一個重要的問題:貨物的名字在哪里?是啊,標簽inode里面那么多東西,為什么偏偏沒有貨物的名字呢?那么文件名到底藏在哪里,蛋蛋帶著疑問繼續(xù)翻盒子,終于找到了真相。

      話說古代有個人,拿著馬經去找馬,按照圖紙牽了一匹馬回來,沒想到大家發(fā)現(xiàn)他找到的是一只大蟾蜍!這就是上面這張圖,按圖索驥的故事,諷刺刻板按照圖紙做事,但其實應該怪寫馬經的人,寫得不嚴謹,不精確,讓人找到錯的東西。Linux市經濟發(fā)達,貨物眾多,僅僅取個名很容易混淆,而且也不好管理。餓想她超市的人為了精確的表示每一個貨物,給每個貨物按個名字的同時,還加了個目錄,每個目錄里面有文件,也有目錄,最上面是個根目錄,這樣,從根目錄出發(fā),一級級找下去,就能找到最終的貨物。

      路徑Dentry

      如下圖,要找一個文件/var/test.txt,這條路有兩條路徑,/->var,var -> test.txt,合起來就成了完整的路。每一個目錄有一個inode,同時也有dentry。先拿到根目錄/的dentry,得到它的inode地址,從inode又知道了data block位置,data block里面是個大數(shù)組,依次放著所有這個目錄里面一級目錄和文件的dentry。把var和每一個dentry的文件名一一比較,就找到了var的dentry,按同樣的方法,繼續(xù)重新開始,最終就找到了test.txt的數(shù)據(jù)盒子block了。

      1. 通過根目錄/的dentry得到inode 2,到目錄盒子和每個dentry比較,發(fā)現(xiàn)var的dentry;

      2. 找到var的inode 10747905,到目錄盒子和每個dentry比較,發(fā)現(xiàn)test.txt的dentry;

      3. 找到test.txt的inode,知道了所有的數(shù)據(jù)盒子位置,可以訪問數(shù)據(jù)了。

      Dentry的內容如下,主要是文件名和inode的編號。

      Hash Tree快速查找

      了解到這里,蛋蛋真是煩透了:買個東西這么麻煩啊!要在每個dentry的盒子里面和所有下一級dentry一個個比較,真是累死人了!還想不想做生意了,搞得哥不爽,去別家買了。扭頭便走,走到門口又停下來了:我是不是低估了餓想她超市的智商,他們生意做得這么好,肯定不會一直用這么麻煩的流程。蛋蛋又回去逛了逛:原來前面那一套都是舊的超市用的過時的方法,最近新開的店都用了更先進的方法:Hash Tree。什么,又是一棵樹,你們超市工程師以前都是種樹的吧?

      如下圖,根目錄的盒子里面是個表,每個路徑用hash算法算出一個hash值,每個hash值有一個自己的盒子,里面是所有的dentry,如果多個路徑是同樣的hash值,那么就在這個hash的盒子里面放所有的dentry。這樣,最快查一次就查到一個路徑的dentry了,畢竟hash重復的概率還是不大的。

      每個hash條目的內容如下,32位Hash值和對應的盒子地址。

      引用

      https://ext4.wiki./index.php/Ext4_Disk_Layout

      http://www.cnblogs.com/vamei/p/3506566.html

      http://oldblog./2011/03/ext3adir-indexioo.html

      六:諾蘭,記憶碎片,掉電恢復

      自從蝙蝠俠系列,盜夢空間和星際穿越全球熱映之后,導演克里斯托弗·諾蘭成了票房的保證。


      諾蘭早期拍過一部電影——記憶碎片,主人公的妻子被人奸殺,自己腦部受傷,從此患上了一種失憶癥:沒辦法形成新的記憶,因為新的記憶只能持續(xù)10分鐘。但是他還是要找到真兇,為愛妻報仇。為了讓自己記憶,他不斷的在身上寫筆記,拍立得拍照片,腿上貼便簽,記下新的進展和下次的行動。每次醒來后從這些記錄搞清楚情況,繼續(xù)報仇之路。劇透就到這里,要想知道兇手的結局,請觀看這部精彩的影片。

      SSD掉電恢復

      老子說禍兮福之所倚,這個人經歷了這么多磨難,終于成為了一個杰出的存儲系統(tǒng)數(shù)據(jù)恢復專家。存儲系統(tǒng)掉電之后就類似于人的失憶,必須通過之前記的記錄恢復出數(shù)據(jù)的索引表。要像他一樣不斷做記錄,還要做的有規(guī)則,亂記了下次醒來就南轅北轍了。對于SSD來說,要恢復出映射表,才能知道用戶地址到內部物理地址的對應關系。具體掉電恢復的技術brokenegg大神已經介紹過,請點擊本文末尾的閱讀原文查看。

      Journal——EXT3/4文件系統(tǒng)掉電恢復利器


      本文介紹文件系統(tǒng)EXT4(不是EXO)的掉電恢復利器日志(Journal)。

      如果你看了公眾號前面文件系統(tǒng)的文章,就知道最核心的數(shù)據(jù)是lnode,文件系統(tǒng)的映射表,記錄了每個文件數(shù)據(jù)塊的地址。
      當文件數(shù)據(jù)已經寫入磁盤,但是inode還沒寫下去,發(fā)生了異常掉電,那么就沒辦法讀到這些數(shù)據(jù)了。日志的作用是為了加速異常掉電的恢復過程。對于要保護的數(shù)據(jù),每寫一份,就會在日志中留下一條記錄,日志數(shù)據(jù)會定期備份到磁盤上,叫做Checkpoint。

      以前的文件系統(tǒng),掉電恢復要掃描整個磁盤才能把inode和數(shù)據(jù)塊正確對應起來,有了日志之后,就不用這樣慢悠悠掃全盤了,只要把上次Checkpoint保存的日志掃一遍就可以了。已經刪除的文件,只要數(shù)據(jù)塊還沒被覆蓋,也能通過journal恢復出來。

      引用:

      https://view.officeapps./op/view.aspx?src=http%3A%2F%2Fwww.cs.umd.edu%2Fprojects%2Fshrug%2Fppt%2F5-Oct-2001.ppt

      七:最適合SSD的文件系統(tǒng)

      餓想她超市和GRE單詞

      我之前用餓想她超市的例子介紹了EXT4文件系統(tǒng),SSDFans的不少讀者從事技術研發(fā),功力深厚,覺得這樣寫顯得太業(yè)余了:還不如直接看技術文檔爽快!有個讀者回復讓我們直接改名叫SSD業(yè)余粉絲o(^▽^)o

      我先不直接說明原因,來說說GRE單詞吧。不少人可能背過俞敏洪的GRE紅寶書,為了幫助背單詞,俞敏洪把很多單詞進行了拆分聯(lián)想,幫助記憶。比如Vulnerable這個單詞,可以讀音理解成漢語的溫拿(winner),溫拿過得比較舒服,溫室里的花朵,很脆弱,所以就想到了單詞的意思:脆弱的,容易受傷害的。還有一種記憶法是重復,不斷重復背誦,再難的也記住了。我們工作中大部分記憶都是后者,為什么大家對自己的專業(yè)領域如此精通?就是通過一遍遍工作中的重復勞動牢牢掌握了這些技能,用的時候信手拈來。

      對于不了解文件系統(tǒng)的人,工作中也不會大量接觸,就沒辦法通過重復法記住,那只能通過聯(lián)想法了,這就是我用餓想她超市來類比文件系統(tǒng)的原因:不了解文件系統(tǒng)的人,只要記住文件系統(tǒng)是個超市,文件是貨物,放在盒子block里面,inode是貨物的標簽,記錄了貨物的盒子位置,就掌握了文件系統(tǒng)的精髓。如果只是看看技術文檔,估計過不了一個月就忘得一干二凈了。

      適合SSD的文件系統(tǒng)最需要什么?

      其實最需要的就是文件的inode映射表和SSD內部的FTL映射表統(tǒng)一成一個表,這樣就解決了大部分問題??梢詤⒖急菊镜膹拇?,SSD不用再偽裝成HDD(http://www./?p=832)一文,這樣做有幾個優(yōu)點:

      • 文件查詢快,F(xiàn)TL的查詢效率是很高的。

      • SSD通過文件知道數(shù)據(jù)的相關性,可以最高效的分布一個文件到每個chip上,提高讀寫速度。

      • 只需要在SSD做垃圾回收,整合磁盤整理。

      • SSD知道哪些文件被刪除了,這些刪除的數(shù)據(jù)不用再占用空間,因此垃圾回收的速度變快了。

      • 復制操作很簡單:復制映射表就可以了。為什么機械硬盤不能這么做?機械硬盤如果兩個文件對應到同樣的一組LBA,其中一個修改就很麻煩,需要把改動的LBA重新映射到新的LBA上,維護一個重定向表。其實很多存儲系統(tǒng)的snapshot就是這么做的,弄一個增量表。而對SSD而言,修改就是新的寫操作,需要寫到新的物理地址,必然要更新映射表,所以天然的實現(xiàn)了重定向。

      適合SSD的文件系統(tǒng)在哪里?

      這樣看來,目前并沒有免費開放的SSD專用文件系統(tǒng),因為大部分SSD為了適應HDD的框架,都是把LBA作為基本單位,文件系統(tǒng)來訪問LBA,機械硬盤時代發(fā)明的LBA隔斷了SSD和文件系統(tǒng)的聯(lián)系。就像上圖,SSD是那個鐵路和火車,但是悲哀的是沒有火車頭,車都是馬來拉的,速度自然提不上去了。

      SSD沒有一個通用的協(xié)議來開放內部數(shù)據(jù)通道給上層軟件,如果有這樣一個開放的接口,那么誕生可以融合SSD內部FTL的文件系統(tǒng)也是自然的事 。

      本文轉載自SSDFans:


      (完)


      Linux閱碼場原創(chuàng)精華文章匯總

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多