精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

想徒手寫個文件系統(tǒng)?來一起呀

開發(fā) 前端
當(dāng)我們需要新建文件或者目錄項時,就需要從文件系統(tǒng)中獲取一塊可用空間。因此,如何高效的管理空閑空間,是個很重要的問題。我們使用兩個 bitmap 進(jìn)行管理,優(yōu)點是簡單,缺點是每次都得線性的掃描查找所有空閑 bit 位,且只能做到塊粒度,塊內(nèi)如果有剩余空間,就管不到了。

文件系統(tǒng)基本都是構(gòu)建于塊存儲之上的。但當(dāng)然,現(xiàn)在的一些分布式文件系統(tǒng),如 JuiceFS[2],底層是基于對象存儲的。但無論塊存儲還是對象存儲,其本質(zhì)都是按 “數(shù)據(jù)塊” 進(jìn)行尋址和數(shù)據(jù)交換的。

我們首先會探討一個完整的文件系統(tǒng)在硬盤上的數(shù)據(jù)結(jié)構(gòu),也即布局;然后再通過打開關(guān)閉、讀寫流程將各個子模塊串起來,從而完成對一個文件系統(tǒng)要點的覆蓋。

總體布局

假設(shè)我們的塊大小是 4KB,然后有一塊非常小的硬盤,只有 64 個塊(則總大小為 64 * 4KB = 256KB),且該硬盤只給文件系統(tǒng)用。由于硬盤是按塊進(jìn)行尋址的,則地址空間為 0~63 。

就這么點空間的迷你硬盤就這么點空間的迷你硬盤

基于此迷你硬盤,我們一起來逐步推導(dǎo)下這個極簡文件系統(tǒng)。

文件系統(tǒng)的首要目的肯定是存儲用戶數(shù)據(jù),為此我們在磁盤留出一塊數(shù)據(jù)區(qū)(Data Region)。假設(shè)我們使用后面 56 個塊作為數(shù)據(jù)區(qū)。為什么是 56 個呢?從后面就可以知道,其實是可以算出來的——我們可以大致算出元信息和真正數(shù)據(jù)的比例,進(jìn)而可以確定兩部分大小。

隔出來數(shù)據(jù)區(qū)隔出來數(shù)據(jù)區(qū)

接下來,我們需要為系統(tǒng)中的每個文件保存一些元信息,比如:

  1. 文件名
  2. 文件大小
  3. 文件歸屬者
  4. 訪問權(quán)限
  5. 創(chuàng)建、修改時間

等等。保存這些元信息的數(shù)據(jù)塊,我們通常稱為 inode (index node)。如下,我們給 inode 分配 5 個 block。

隔出來索引區(qū)隔出來索引區(qū)

元信息所占空間相對較小,比如 128B 或者 256B,我們這里假設(shè)每個 inode 占用 256B。則每個 4KB 塊能容納 16 個 inode,則我們的文件系統(tǒng)最多可以支持 5 * 16 = 80 個 inode,也即我們的迷你文件系統(tǒng)最多可以支持 80 個文件,但由于目錄也要占 inode,所以實際可用文件數(shù)要少于 80。

現(xiàn)在我們有了數(shù)據(jù)區(qū),有了文件元信息區(qū),但在一個正常使用的文件系統(tǒng)中,還需要追蹤哪些數(shù)據(jù)塊被用了,哪些還沒有被使用。這種數(shù)據(jù)結(jié)構(gòu)我們稱之為分配結(jié)構(gòu)(allocation structures)。業(yè)界常用的方法有空閑鏈表(free list),即把所有空閑塊按鏈表的方式串起來。但為了簡單,這里使用一種更簡單的數(shù)據(jù)結(jié)構(gòu):位圖(bitmap),數(shù)據(jù)區(qū)用一個,稱數(shù)據(jù)位圖(data bitmap);inode 表用一個,稱 inode 位圖(inode bitmap)。

位圖的思想很簡單,即為每一個 inode 或者數(shù)據(jù)塊使用一個數(shù)據(jù)位,來標(biāo)記是否空閑:0 表示空閑,1 表示有數(shù)據(jù)。一個 4KB 的 bitmap 最多能追蹤 32K 的對象。為了方便,我們給 inode 表和數(shù)據(jù)池各分配一個完整的塊(雖然用不完),于是便有了下圖。

造兩個 map 作為空閑列表造兩個 map 作為空閑列表

可以看出,我們的基本思路是從后往前進(jìn)行數(shù)據(jù)布局,最后還剩一個塊。該塊我們是故意留的,用以充當(dāng)文件系統(tǒng)的超級塊(superblock)。超級塊作為一個文件系統(tǒng)的入口,通常會保存一些文件系統(tǒng)級別的元信息,比如本文件系統(tǒng)中有多少個 inode 和數(shù)據(jù)塊(80 和 56),inode 表的起始塊偏移量(3),等等。

最后一個 block 是入口,稱為超級塊最后一個 block 是入口,稱為超級塊

則當(dāng)文件系統(tǒng)被裝載( mount )時,操作系統(tǒng)會首先讀取超級塊(所以放最前面),并據(jù)此初始化一系列參數(shù),并將其作為數(shù)據(jù)卷掛載到文件系統(tǒng)樹中。有了這些基本信息,當(dāng)該卷中的文件被訪問到時,就能逐步找出其位置,也就是我們之后要講的讀寫流程。

但在講讀寫流程之前,需要先放大一些關(guān)鍵數(shù)據(jù)結(jié)構(gòu)看看其內(nèi)在布局。

索引節(jié)點(Inode)

inode 是索引節(jié)點(index node)的簡稱,是對文件和文件夾的索引節(jié)點。為了簡單,我們使用數(shù)組來組織索引節(jié)點,每個 inode 會關(guān)聯(lián)一個編號(inumber),也即其在數(shù)組中的下標(biāo)(偏移量)。

索引區(qū)的詳細(xì)布局索引區(qū)的詳細(xì)布局

上面提到過一嘴,每個 inode 占 256B。則給定一個 inumber,我們就可以計算出其在硬盤中的偏移量(12KB + inumber * 256),但由于內(nèi)外存交換是按塊來的,我們可以據(jù)此進(jìn)而計算出其所在磁盤塊。

inode 主要保存文件名、一些元信息(權(quán)限控制、各種事件、一些標(biāo)記位)和數(shù)據(jù)塊索引。數(shù)據(jù)塊索引其實也是元信息,單拎出來說是因為它很重要。

我們使用一種比較簡單的索引方式:間接指針(indirect pointer)。即 inode 中保存的不是直接指向數(shù)據(jù)塊的指針,而是指向一個指針塊(也在數(shù)據(jù)區(qū)分配,但保存的都是二級指針)。如果文件足夠大,可能還會引出三級指針(至于我們這個小系統(tǒng)是否用的著,大家可以估算下)。

但我們統(tǒng)計發(fā)現(xiàn),在大多數(shù)文件系統(tǒng)中,小文件占多數(shù)。小到什么地步呢?一個數(shù)據(jù)塊就可以存下。

UntitledUntitled

因此實踐中,我們在 inode 中使用一種直接指針和間接指針混合的方式進(jìn)行表示。在我們的文件系統(tǒng)中,就是使用 12 個直接指針和 1 個間接指針。所以只要文件尺寸不超過 12 個數(shù)據(jù)塊,就可以直接用直接指針。只有過大時,才使用間接指針,并且在數(shù)據(jù)區(qū)新分配數(shù)據(jù)塊,來存間接指針。

我們的數(shù)據(jù)區(qū)很小,只有 56 個 block,假設(shè)使用 4byte 進(jìn)行索引。則二級指針最多可支持 (12 + 1024) · 4K ,也就是 4144KB 大小的文件。

另一種實踐中常用的方式是數(shù)據(jù)段(extents)。即將每個連續(xù)數(shù)據(jù)區(qū)用起始指針和大小來表示,然后將一個文件的所有數(shù)據(jù)段串起來。但多段數(shù)據(jù)時,如果想訪問最后一個數(shù)據(jù)段或者隨機(jī)訪問,性能會很差(下一個數(shù)據(jù)段的指針都保存在上一個數(shù)據(jù)段中)。為了優(yōu)化訪問速度,常將該數(shù)據(jù)段的索引鏈表存在內(nèi)存中。Windows 的早期文件系統(tǒng) FAT 就是這么干的。

目錄組織

在我們的文件系統(tǒng)中,目錄組織得很簡單——即和文件一樣,每個目錄也占用一個 inode,但在 inode 指向的數(shù)據(jù)塊不是存文件內(nèi)容,而是存儲該目錄中所包含的所有文件和文件夾的信息,通常是用 List<entry name, inode number>  表示。當(dāng)然要轉(zhuǎn)為實際編碼,還要存文件名長度等信息(因為文件名是變長的)。

看一個簡單例子,設(shè)我們有一個文件夾 dir (inode 編號是 5),里面有三個文件(foor,bar 和 foobar),其對應(yīng)的 inode 編號分別是 12,13 和 24 。則在該文件夾的數(shù)據(jù)塊中存儲的信息如下:

dir 內(nèi)容的編碼dir 內(nèi)容的編碼

其中 reclen (record length)是文件名所占空間大小,strlen 是實際長度。點和點點是指向本文件夾和上級文件夾的兩個指針。記錄reclen 看著有點多此一舉,但要考慮到文件刪除問題(可以用特殊的 inum,比如 0 來標(biāo)記刪除)。如果文件夾下的某個文件或者目錄被刪除,存儲就會出現(xiàn)空洞。reclen 的存在,可以讓刪除留下的空洞為之后新增的文件復(fù)用。

需要說明的是,線性的組織一個目錄中的文件是最簡單的方式。實踐中,還有其他方式。比如說在 XFS 中,如果目錄中文件或者子文件夾特別多,會使用 B+ 樹進(jìn)行組織。從而在插入時,可以很快地知道是否有同名文件。

空閑空間管理

當(dāng)我們需要新建文件或者目錄項時,就需要從文件系統(tǒng)中獲取一塊可用空間。因此,如何高效的管理空閑空間,是個很重要的問題。我們使用兩個 bitmap 進(jìn)行管理,優(yōu)點是簡單,缺點是每次都得線性的掃描查找所有空閑 bit 位,且只能做到塊粒度,塊內(nèi)如果有剩余空間,就管不到了。

讀寫路徑

有了對磁盤上的數(shù)據(jù)結(jié)構(gòu)的把握之后,我們再來通過讀寫流程將不同的數(shù)據(jù)結(jié)構(gòu)串一下。我們假設(shè)文件系統(tǒng)已經(jīng)被掛載:即超級塊(superblock)已經(jīng)在內(nèi)存中。

讀取文件

我們的操作很簡單,就是打開一個文件(如 /foo/bar),進(jìn)行讀取,然后關(guān)閉。簡化起見,假設(shè)我們文件大小占一個 block,即 4k。

當(dāng)發(fā)起一個系統(tǒng)調(diào)用 open("/foo/bar", O RDONLY)時,文件系統(tǒng)需要首先找到文件 bar 對應(yīng)的 inode,以獲取其元信息和數(shù)據(jù)位置信息。但現(xiàn)在我們只有文件路徑,那怎么辦呢?

答曰:從根目錄往下遍歷。根目錄的 inode 編號,我們要么保存在超級塊中,要么就寫死(比如 2,大部分 Unix 文件系統(tǒng)都是從 2 開始的)。也即,必須能事先知道(well known)。

于是文件系統(tǒng)將該根目錄的 inode 從硬盤調(diào)入內(nèi)存,進(jìn)而再通過 inode 中的指針找到其指向數(shù)據(jù)塊,進(jìn)而從其包含所有子目錄和文件夾中找到 foo 文件夾和其對應(yīng) inode。遞歸的重復(fù)上述過程,open 系統(tǒng)調(diào)用的最后一步是將 bar 的 inode 載入內(nèi)存,進(jìn)行權(quán)限檢查(比對進(jìn)程用戶權(quán)限和 inode 訪問權(quán)限控制),分配文件描述符放到進(jìn)程打開文件表中,并將其返回給用戶。

一旦文件被打開后,就可以繼而發(fā)起 read() 的系統(tǒng)調(diào)用 ,真正地去讀取數(shù)據(jù)。讀取時,首先會根據(jù)文件的 inode 信息,找到第一個 block(除非讀前實現(xiàn)用 lseek() 修改過偏移量),然后讀取。同時,可能會更改 inode 的一些元信息,比如說訪問時間。繼而,更新進(jìn)程中該文件描述符的偏移量,繼續(xù)往下讀,直到某個時刻,調(diào)用 close() 關(guān)閉該文件描述符。

進(jìn)程關(guān)閉文件時,所需工作要少得多,只需要釋放文件描述符即可,并不會有真正的磁盤 IO。

最后,我們再捋一下這個讀文件過程。從根目錄的 inode 編號開始,我們交替地讀取 inode 和相應(yīng)數(shù)據(jù)塊,直到最終找到待查找文件。然后要進(jìn)行數(shù)據(jù)讀取,還要更新其 inode 的訪問時間等元信息,進(jìn)行寫回。下表簡單地總結(jié)了下這個過程,可以看出,讀取路徑全程不會涉及分配結(jié)構(gòu)—— data bitmap 和 inode bitmap。

文件讀取時間線文件讀取時間線

從深度上來說,如果我們的待查找路徑層級非常多,這個過程會線性增長;從廣度上來說,如果中間查找時涉及到的文件夾,其包含的目錄子項特別多,即文件樹“很寬”,則每次在目錄中進(jìn)行查找時,可能需要讀取不止一個數(shù)據(jù)塊。

寫入硬盤

寫文件和讀取文件的流程很類似,也是打開文件(從根目錄一路找到對應(yīng)文件);然后開始寫入,最后關(guān)閉。但與讀取文件不同的是,寫入需要分配新的數(shù)據(jù)塊,這就需要涉及我們之前的 bitmap 了,通常來說,一次寫入至少需要五次 IO:

  1. 讀取 data bitmap(以找到空閑塊,并在內(nèi)存中標(biāo)記使用)
  2. 寫回 data bitmap(以對其他進(jìn)程可見)
  3. 讀取 inode(增加新的數(shù)據(jù)位置指針)
  4. 寫回 inode
  5. 在找到的空閑塊中寫入數(shù)據(jù)

這還只是對已經(jīng)存在的文件進(jìn)行寫入。如果是尚未存在的文件進(jìn)行創(chuàng)建并寫入,那流程還要更為復(fù)雜:還要創(chuàng)建 inode,這就會引入一系列新的 IO:

  1. 一次對 inode bitmap 的讀取(找到空閑 inode)
  2. 一次對 inode bitmap 的寫回(標(biāo)記某個 inode 被占用)
  3. 一次對 inode 本身的寫入(初始化)
  4. 一次對父文件夾所對應(yīng)目錄子項數(shù)據(jù)塊的讀寫(增加新建的文件和 inode 對)
  5. 一次對父文件夾 inode 的讀寫(更新修改日期)

如果父文件夾的數(shù)據(jù)塊不夠用,還得需要新分配空間,就又得讀 data bitmap,和 data block。下圖是創(chuàng)建 /foo/bar 文件的時間線上涉及到的 IO:

創(chuàng)建文件的時間線創(chuàng)建文件的時間線

緩存和緩沖

從上面對讀寫流程的分析可以看出,即便如此簡單的讀寫操作,都會涉及大量 IO,這在實踐中是不可接受的。為了解決這個問題,大部分工業(yè)上的文件系統(tǒng),會充分利用內(nèi)存,將重要的(也就是頻繁訪問的)數(shù)據(jù)塊緩存(cache)在內(nèi)存中;與此同時,為了避免頻繁刷盤,會將修改先應(yīng)用到內(nèi)存緩沖區(qū)(buffer)里,然后積攢后一塊落盤。

早期的文件系統(tǒng)引入了固定尺寸緩存(fixed-size cache),如果滿了,會利用 LRU 等替換算法進(jìn)行頁面淘汰。其缺點在于當(dāng)緩存不滿的時候浪費空間,滿了又可能頻繁換頁。我們稱這種風(fēng)格為靜態(tài)分區(qū)(static partitioning)。大部分現(xiàn)代文件系統(tǒng),都是用動態(tài)分區(qū)(dynamic partitioning)技術(shù)。比如,將虛擬內(nèi)存頁和文件系統(tǒng)頁放到一個池子中,稱為統(tǒng)一頁面緩存(unified page cache),從而上兩者分配和更加彈性。上了緩存之后,對于同一個目錄中多個文件的讀取,后面的讀取就可以省下很多 IO。

寫流程由于前半程根據(jù)路徑查找數(shù)據(jù)塊時牽扯到讀,所以也會從緩存中受益。但對于寫的部分,我們可以通過緩沖區(qū)(writing buffering),來延遲刷盤。延遲刷盤有很多好處,比如說可以多次修改 bitmap 可能只需要刷一次;積攢一批更改,可以提高 IO 帶寬利用率;如果文件先增后刪,可能就直接省了刷盤。

但這些性能的提升是有代價的——意外宕機(jī)可能會造成數(shù)據(jù)丟失。所以,雖然現(xiàn)代文件系統(tǒng)大部分開啟了讀寫緩沖,但也通過 direct I/O 的方式,來允許用戶繞過緩存,直接寫磁盤。對丟失數(shù)據(jù)很敏感的應(yīng)用,可以利用其對應(yīng)的系統(tǒng)調(diào)用 fsync() 來即時刷盤。

小結(jié)

至此,我們完成了一個至簡的文件系統(tǒng)的實現(xiàn)。其“麻雀雖小,五臟俱全”,我們從中可以看出文件系統(tǒng)設(shè)計一些基本的理念:

  1. 使用 inode 存儲文件粒度的元信息;使用數(shù)據(jù)塊存真正的文件數(shù)據(jù)
  2. 目錄是一種特殊的文件,只不過存的不是文件內(nèi)容,而是文件夾子目錄項
  3. 除了 inode 和數(shù)據(jù)塊外,還需要一些其他的數(shù)據(jù)結(jié)構(gòu),比如 bitmap 來追蹤空閑塊

從這個基本的文件系統(tǒng)出發(fā),我們其實可以看到特別多的可以取舍和優(yōu)化的點,如果感興趣,大家可以在本文基礎(chǔ)上,去看看一些工業(yè)上的文件系統(tǒng)的設(shè)計。

參考資料

[1]Operating Systems: Three Easy Pieces: https://pages.cs.wisc.edu/~remzi/OSTEP/

[2]JuiceFS: https://github.com/juicedata/juicefs

責(zé)任編輯:武曉燕 來源: 木鳥雜記
相關(guān)推薦

2022-04-07 09:29:04

文件系統(tǒng)硬盤操作系統(tǒng)

2024-03-11 10:30:31

Linux文件系統(tǒng)

2022-10-09 15:05:50

NAPI框架鴻蒙

2022-09-20 14:40:55

開源鴻蒙操作系統(tǒng)

2012-09-10 13:42:55

PHP項目管理

2012-04-14 20:47:45

Android

2012-06-25 09:37:24

Web

2024-08-02 09:49:35

Spring流程Tomcat

2010-05-10 15:31:35

Unix文件

2020-06-11 18:35:23

C++編程語言

2012-11-08 17:33:53

智慧云

2012-11-30 11:31:15

Visual StudVisual StudVS

2022-10-17 14:29:24

鴻蒙應(yīng)用開發(fā)

2021-06-17 08:22:23

服務(wù)器Go Redis

2021-09-15 19:02:42

Node.jsFs模塊

2021-06-09 08:15:50

volatileJava開發(fā)

2022-09-22 08:06:29

計算機(jī)平板微信

2021-06-17 14:53:13

GoRedis 服務(wù)器

2010-05-21 17:32:07

IIS服務(wù)器

2009-10-29 16:32:34

Oracle表空間
點贊
收藏

51CTO技術(shù)棧公眾號

九九热国产视频| 日韩精品人妻中文字幕有码| 韩国成人在线视频| 美女视频黄频大全不卡视频在线播放| 色偷偷偷亚洲综合网另类| 亚洲综合中文网| 亚洲性受xxx喷奶水| 亚洲丝袜自拍清纯另类| 久久99久久精品国产| 性色av一区二区三区四区| 国产尤物精品| 伊人激情综合网| 动漫av在线免费观看| 国产极品久久久久久久久波多结野| 1000部国产精品成人观看| 久久免费看av| 亚洲精品福利网站| 麻豆91在线观看| 2020久久国产精品| 国产小视频在线看| 999国产精品999久久久久久| 亚洲精品www久久久| 一区二区三区国产好的精华液| 都市激情亚洲综合| 亚洲一区二区四区蜜桃| 国产福利片一区二区| 黄色电影免费在线看| 成人av在线影院| 91超碰在线免费观看| 中文字幕在线观看1| 久久精品首页| 97不卡在线视频| 久久久久性色av无码一区二区| 日本一二区不卡| 亚洲欧美国产日韩天堂区| 精品人妻伦一二三区久| 精品国产不卡一区二区| 欧美精选一区二区| 向日葵污视频在线观看| 456亚洲精品成人影院| 欧美视频免费在线| 69堂免费视频| 黑人精品一区| 色偷偷成人一区二区三区91| 黄色影院一级片| 多野结衣av一区| 亚洲成av人片在线观看无码| 精品视频在线观看一区| 国产经典三级在线| 亚洲五月六月丁香激情| 日韩精品一区在线视频| 8x8ⅹ拨牐拨牐拨牐在线观看| 一区二区三区美女| 成人一级生活片| 波多野结衣中文在线| 亚洲成av人片| 免费在线观看亚洲视频 | 成人精品视频一区二区三区尤物| 成人在线一区二区| 国产成人毛毛毛片| 国产白丝精品91爽爽久久| 国产精品一区二区三区免费| 免费的黄色av| 久久综合999| 视频在线观看成人| 九义人在线观看完整免费版电视剧| 最近日韩中文字幕| 加勒比成人在线| 在线看片福利| 欧美丝袜自拍制服另类| 91精品国产三级| 成人自拍在线| 精品视频偷偷看在线观看 | 成人免费在线观看入口| 青青草综合视频| а√在线天堂官网| 在线免费观看日本欧美| 一区二区三区四区毛片| 66精品视频在线观看| 亚洲欧美一区二区三区久久| 俄罗斯毛片基地| 一区二区中文| 69国产精品成人在线播放| 欧美一区免费看| 国产在线精品一区二区| 精品国产一区二区三区四区精华| 国产h在线观看| 亚洲精品视频观看| 欧美 日韩 国产在线观看| 日本精品网站| 亚洲第一精品夜夜躁人人爽| 69精品无码成人久久久久久| 欧美一区二区三区免费看| 96精品视频在线| 国产精品高潮呻吟AV无码| 成人免费视频一区| 亚洲午夜精品久久| 高潮在线视频| 欧美一区二区三区视频在线观看| 一本加勒比波多野结衣| 欧美激情理论| 欧美亚洲另类在线| 国产高清在线免费| 亚洲国产精品二十页| www.成年人视频| 国产成+人+综合+亚洲欧美| 亚洲精品在线观看视频| 久久精品亚洲a| 免费亚洲网站| 国产精品大全| 国产原创精品视频| 欧美午夜在线一二页| 911亚洲精选| 亚洲精品91| 国产精品久久久久久久9999| 午夜成人鲁丝片午夜精品| 亚洲欧美视频在线观看| 一级片视频免费观看| 亚洲日产av中文字幕| 欧美激情亚洲激情| 国产精品丝袜黑色高跟鞋| 久久久99精品免费观看| 精品视频在线观看一区| 亚洲三区欧美一区国产二区| 久久精品国产v日韩v亚洲| 欧美另类高清videos的特点| 久久综合久久鬼色中文字| 老子影院午夜伦不卡大全| 国产精品毛片无码| 日韩亚洲国产中文字幕| 国产精品免费无遮挡无码永久视频| 成人精品免费看| 99中文字幕在线观看| 亚洲国产伊人| xxxxx91麻豆| 亚洲无码精品国产| 国产精品丝袜久久久久久app| 国产精品免费成人| 综合亚洲自拍| 日本电影亚洲天堂| 蜜桃视频在线观看网站| 色综合天天视频在线观看 | 国产xxxx在线观看| 亚洲欧美日韩电影| 杨幂一区二区国产精品| 午夜精品国产| 成人自拍爱视频| 波多野结衣中文字幕久久| 精品国产百合女同互慰| 国产在线欧美在线| 99国产精品久久| 日韩精品视频一区二区在线观看| 丝袜连裤袜欧美激情日韩| 欧美在线视频在线播放完整版免费观看 | 美女主播视频一区| 一区二区电影免费观看| 亚洲色图国产精品| 高潮无码精品色欲av午夜福利| 国产日韩欧美电影| 青青草原国产在线视频| 亚洲美女视频| 国产亚洲一区二区三区在线播放| 三妻四妾完整版在线观看电视剧 | sm在线观看| 日韩av在线看| av首页在线观看| 日韩一区欧美小说| 动漫美女无遮挡免费| 9久re热视频在线精品| 欧美精品一区三区在线观看| av成人在线播放| 欧美另类交人妖| 同心难改在线观看| 欧美视频一区二区三区在线观看 | 九色蝌蚪在线| 欧美人妖巨大在线| 久久亚洲av午夜福利精品一区| 99久久精品情趣| 狠狠热免费视频| 欧美精品一卡| 欧美日韩精品久久久免费观看| 久久麻豆视频| 91成人在线观看国产| av影片在线看| 亚洲国产福利在线| 中文字幕 欧美激情| 亚洲一区在线观看网站| a毛片毛片av永久免费| 国产中文字幕一区| 超碰网在线观看| 亚洲91中文字幕无线码三区| 久久精品一区二区三区不卡免费视频| 成人在线观看免费播放| 久久久久免费视频| 婷婷在线视频观看| 日韩美女一区二区三区| 波多野结衣电影在线播放| 一区二区三区免费在线观看| 亚洲一区视频在线播放| 国产69精品一区二区亚洲孕妇| 国产精品-区区久久久狼| 欧美激情第10页| 亚州欧美一区三区三区在线| 成人午夜网址| 91亚洲一区精品| 91欧美精品| 欧美一级视频在线观看| 日本精品600av| 中文字幕日韩欧美在线| 亚洲 欧美 激情 另类| 91精品国产综合久久国产大片| 成人公开免费视频| 精品动漫一区二区| 九九视频免费观看| 日韩理论片中文av| 亚洲欧洲久久久| 91一区二区三区在线播放| 亚洲午夜精品在线观看| 久久成人免费日本黄色| 88av.com| 久久aⅴ国产紧身牛仔裤| 91九色丨porny丨国产jk| 一区二区蜜桃| 亚洲最大免费| 久久人人88| 日韩一区二区三区高清| 国产99精品| 女女同性女同一区二区三区91| 精品三级av在线导航| 成人免费视频视频在| 免费观看亚洲天堂| 91手机视频在线观看| 欧美性生活一级| 国产区精品视频| 欧美另类激情| 成人精品aaaa网站| 亚洲色图图片| 91在线高清视频| 日韩视频1区| 国产精品久久久久久久久久久久冷| 精品国模一区二区三区欧美| 成人久久久久久久| 免费观看亚洲天堂| 99久久自偷自偷国产精品不卡| 国产不卡精品| 99久久综合狠狠综合久久止| 日韩精品视频在线看| 97人人澡人人爽| 白嫩白嫩国产精品| 久久综合色一本| 亚洲午夜久久| 日本一区视频在线播放| 日韩精品影视| 欧美性视频在线播放| 欧美在线高清| 成人精品视频在线播放| 亚洲女同同性videoxma| 日日碰狠狠躁久久躁婷婷| 久久一区二区三区超碰国产精品| 亚洲成色www.777999| 蜜臀av国产精品久久久久| 欧美成年人视频在线观看| 精品午夜久久福利影院| 久久久久无码精品| 99视频精品在线| 亚洲精品乱码久久久久久久久久久久| 中文字幕乱码一区二区免费| 男女做暖暖视频| 亚洲成av人在线观看| 亚洲精品成人在线视频| 欧美日韩一级二级| 亚洲国产欧美另类| 亚洲欧美制服第一页| 天天影视久久综合| 97精品视频在线播放| 日韩精品三区| 亚洲自拍中文字幕| 日韩av午夜| 一区二区精品在线观看| 激情久久久久久| 国产天堂在线播放| 国产99久久久国产精品潘金网站| 精品黑人一区二区三区观看时间| 亚洲国产精品精华液ab| 久久精品这里有| 在线视频中文字幕一区二区| 国产美女明星三级做爰| 精品视频偷偷看在线观看| 久cao在线| 日韩av电影中文字幕| 久久伊人影院| 日韩精品电影网站| 在线成人av| 岛国av免费在线| 91美女精品福利| 免费人成视频在线| 欧美视频日韩视频在线观看| 亚洲女人18毛片水真多| 在线亚洲午夜片av大片| av在线资源| 亚洲va久久久噜噜噜久久天堂| 自拍欧美一区| 久久国产精品网| 国内精品久久久久影院薰衣草| www.自拍偷拍| 亚洲地区一二三色| 国产熟女一区二区丰满| 一本色道久久综合狠狠躁篇的优点 | 91肉色超薄丝袜脚交一区二区| 日韩成人中文电影| 欧美78videosex性欧美| 91精品久久久久久久久| 国产精品手机在线播放| 99热久久这里只有精品| 国产精品一区二区三区99| 综合 欧美 亚洲日本| 欧美日韩性视频在线| 亚洲国产精品久久人人爱潘金莲| 日韩中文综合网| 88xx成人网| 国内一区二区在线视频观看| 欧美在线观看天堂一区二区三区| 精品日韩久久久| 国产亚洲精久久久久久| 69视频免费在线观看| 亚洲精品一区二区三区在线观看| 国产在线激情视频| 91久久久在线| 91亚洲国产| 潘金莲激情呻吟欲求不满视频| 国产女主播视频一区二区| 国产一级18片视频| 日韩高清a**址| 在线观看福利电影| 免费看成人午夜电影| 久久精品亚洲| 鲁丝一区二区三区| 欧美少妇bbb| 欧美96在线| 91久久国产婷婷一区二区| 久久久久久久久久久久久久久久久久| 午夜剧场在线免费观看| 国产精品高潮呻吟| 国产深喉视频一区二区| 欧美成人激情视频免费观看| 激情不卡一区二区三区视频在线| 色撸撸在线观看| 国产乱码精品一区二区三区av| 三级av在线免费观看| 91精品国产色综合久久不卡蜜臀 | 亚洲人成影院在线观看| 国产强被迫伦姧在线观看无码| 欧美精品在线免费播放| 亚洲欧美日本国产| 日韩视频在线视频| 久久美女艺术照精彩视频福利播放 | 精品福利av| www国产视频| 欧美性少妇18aaaa视频| 手机福利在线| 国产精品普通话| 亚洲国产精品久久久天堂| 女人扒开双腿让男人捅| 精品久久久久久久久中文字幕| 欧美日韩在线精品一区二区三区激情综| 国产成人精品在线观看| 久久久国产精品| 国产人成视频在线观看| 一本一本大道香蕉久在线精品| av在线免费一区| 2020国产精品久久精品不卡| 亚洲福利精品| 美国黑人一级大黄| 日韩欧美国产成人一区二区| av漫画网站在线观看| 亚洲精美视频| 成人免费看黄yyy456| 中文字幕在线天堂| 九九久久综合网站| 久久综合亚洲| 久久6免费视频| 丰满岳妇乱一区二区三区| 在线激情小视频| 国产伦一区二区三区色一情| 青青草国产精品97视觉盛宴 | 黄色综合网站| 国产手机在线观看| 日韩精品专区在线影院重磅| 欧美成人性网| 男人天堂手机在线视频| 欧美国产丝袜视频| 韩国av免费在线| 国产日韩欧美综合| 亚洲中字在线| 毛片aaaaa| 日韩在线视频导航| 蜜臀91精品国产高清在线观看| 性生活一级大片| 欧美三级日韩在线| 色吧亚洲日本|