久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

揭秘!Containerd鏡像文件丟失問題,竟是鏡像生成惹得禍

2022-10-10    分類: 網站建設

導語

作者李志宇,騰訊云后臺開發工程師,日常負責集群節點和運行時相關的工作,熟悉 containerd、docker、runc 等運行時組件。近期在為某位客戶提供技術支持過程中,遇到了 containerd 鏡像丟失文件問題,經過一系列分析、推斷、復現、排查,最終成功找到根因并給出解決方案。現將整個詳細處理過程整理成文分享出來,希望能夠為大家提供一個有價值的問題處理思路以及幫助大家更好地理解相關原理。

揭秘!Containerd 鏡像文件丟失問題,竟是鏡像生成惹得禍

containerd 鏡像丟失文件問題說明

近期有客戶反映某些容器鏡像出現了文件丟失的奇怪現象,經過模擬復現匯總出丟失情況如下:

某些特定的鏡像會穩定丟失文件;

“丟失”在某些發行版穩定復現,但在 ubuntu 上不會出現;

v1.2 版本的 containerd 會文件丟失,而 v1.3 不會。

通過閱讀源碼和文檔,最終解決了這個 containerd 鏡像丟失問題,并寫下了這篇文章,希望和大家分享下解決問題的經歷和鏡像生成的原理。為了方便某些心急的同學,本文接下來將首先揭曉該問題的答案~

根因和解決方案

由于內核 overlay 模塊 Bug,當 containerd 從鏡像倉庫下載鏡像的“壓縮包”生成鏡像的“層”時,overlay 錯誤地把trusted.overlay.opaque=y這個 xattrs 從下層傳遞到了上層。如果某個目錄設置了這個屬性,overlay 則會認為這個目錄是不透明的,以至于在進行聯合掛載時該目錄將會把下面的目錄覆蓋掉,進而導致鏡像文件丟失的問題。

這個問題的解決方案可以有兩種,一種簡單粗暴,直接升級內核中 overlay 模塊即可。

另外一種可以考慮把 containerd 從 v1.2 版本升級到 v1.3,原因在于 containerd v1.3 中會主動設置上述 opaque 屬性,該版本 containerd 不會觸發 overlayfs 的 bug。當然,這種方式是規避而非徹底解決 Bug。

snapshotter 生成鏡像原理分析

雖然根本原因看起來比較簡單,但分析的過程還是比較曲折的。在分享下這個問題的排查過程和收獲之前,為了方便大家理解,本小節將集中講解問題排查過程涉及到的 containerd 和 overlayfs 的知識,比較了解或者不感興趣的同學可以直接跳過。

與 docker daemon 一開始的設計不同,為了減少耦合性,containerd 通過插件的方式由多個模塊組成。結合下圖可以看出,其中與鏡像相關的模塊包含以下幾種:

揭秘!Containerd 鏡像文件丟失問題,竟是鏡像生成惹得禍

metadata 是 containerd 通過 bbolt 實現的 kv 存儲模塊,用來保存鏡像、容器或者層等元信息。比如命令行 ctr 列出所有 snapshot 或 kubelet 獲取所有 pod 都是通過 metadata 模塊查詢的數據。 content 是負責保存 blob 的模塊,其保存的關于鏡像的內容一般分為三種: 鏡像的 manifest(一個普通的 json,其中指定了鏡像的 config 和鏡像的 layers 數組) 鏡像的 config(同樣是個 json,其中指定鏡像的元信息,比如啟動命令、環境變量等) 鏡像的 layer(tar 包,解壓、處理后會生成鏡像的層) snapshots 是快照模塊總稱,可以設置使用不同的快照模塊,常見的模塊有 overlayfs、aufs 或 native。在 unpack 時 snapshots 會把生成鏡像層并保存到文件系統;當運行容器時,可以調用 snapshots 模塊給容器提供 rootfs 。

容器鏡像規范主要有 docker 和 oci v1、v2 三種,考慮到這三種規范在原理上大同小異,可以參考以下示例,將 manifest 當作是每個鏡像只有一份的元信息,用于指向鏡像的 config 和每層 layer。其中,config 即為鏡像配置,把鏡像作為容器運行時需要;layer 即為鏡像的每一層。

type manifest struct { c config layers []layer }

鏡像下載流程與圖 1 中數字標注出來的順序一致,每個步驟作用總結如下:

首先在 metadata 模塊中添加一個 image,這樣我們在執行 list image 時可看到這個 image。

其次是需要下載鏡像,因為鏡像是有 manifest、config、layers 等多個部分組成,所以先下載鏡像的 manifest 并保存到 content 模塊,再解析 manifest 獲取 config 的地址和 layers 的地址。接下來分別把 config 和每個 layer 下載并保存到 content 模塊,這里需要強調鏡像的 layer 本來應該是目錄,當創建容器時聯合掛載到 root 下,但是為了方便網絡傳輸和存儲,這里會用 tar + 壓縮的方式保存。這里保存到 content 也是不解壓的。

③、④、⑤的作用關聯性比較強,此處放在一起解釋。snapshot 模塊去 content 模塊讀取 manifest,找到鏡像的所有層,再去 content 模塊把這些層自“下”而“上”讀取出來,逐一解壓并加工,最后放到 snapshot 模塊的目錄下,像圖 1 中的 1001/fs、1002/fs 這些都是鏡像的層。(當創建容器時,需要把這些層聯合掛載生成容器的 rootfs,可以理解成1001/fs + 1002/fs + ... => 1008/work)。

整個流程的函數調用關系如下圖 2,喜歡閱讀源碼的同學可以照著這個去看下。

揭秘!Containerd 鏡像文件丟失問題,竟是鏡像生成惹得禍

為了方便理解,接下來用 layer 表示 snapshot 中的層,把剛下載未經過加工的“層”稱之為鏡像層的 tar 包或者是 tar 包。

下載鏡像保存入 content 的流程比較簡單,直接跳過就好。而通過鏡像的 tar 包生成 snapshot 中的 layer 這個過程比較巧妙,甚至 bug 也是出現在這里,接下來進行重點描述。

首先通過 content 拿到了鏡像的 manifest,這樣我們得知鏡像是有哪些層組成的。最下面一層鏡像比較簡單,直接解壓到 snapshot 提供的目錄就可以了,比如 10/fs。假設接下來要在 11/fs 生成第二層(此時 11/fs 還是空的),snapshot 會使用mount -t overlay overlay -o lowerdir=10/fs,upperdir=11/fs,workdir=11/work tmp把已經生成好的 layer 10 和還未生成的 layer 11 掛載到一個 tmp 目錄上,其中寫入層是 11/fs 也就是我們想要生成的 layer。去 content 中拿到 layer 11 對應的 tar 包,遍歷這個 tar 包,根據 tar 包中不同的文件對掛載點 tmp 進行寫入或者刪除文件的操作(因為是聯合掛載,所以對于掛載點的操作都會變成對寫入層的操作)。把 tar 包轉化成 layer 的具體邏輯和下面經過簡化的源碼一致,可以看到如果 tar 包中存在 whiteout 文件或者當前的層比如 11/fs 和之前的層有沖突比如 10/fs,會把底層目錄刪掉。在把 tar 包的文件寫入到目錄后,會根據 tar 包中記錄的 PAXRecords 給文件添加 xattr,PAXRecords 可以看做是 tar 中每個文件都帶有的 kv 數組,可以用來映射文件系統中文件屬性。

// 這里的tmp就是overlay的掛載點   applyNaive(tar, tmp) {     for tar.hashNext() {       tar_file := tar.Next()                                        // tar包中的文件       real_file := path.Join(root, file.base)        // 現實世界的文件       // 按照規則刪除文件       if isWhiteout(info) {         whiteRM(real_file)       }       if !(file.IsDir() && IsDir(real_file)) {         rm(real_file)       }        // 把tar包的文件寫入到layer中       createFileOrDir(tar_file, real_file)       for k, v := range tar_file.PAXRecords {         setxattr(real_file, k, v)       }     }   }  

需要刪除的這些情況總結如下:

如果存在同名目錄,兩者進行 merge

如果存在同名但不都是目錄,需要刪除掉下層目錄(上文件下目錄、上目錄下文件、上文件下文件)

如果存在 .wh. 文件,需要移除底層應該被覆蓋掉的目錄,比如目錄下存在 .wh..wh.opaque 文件,就需要刪除 lowerdir 中的對應目錄。

當然這里的刪除也沒那么簡單,還記得當前的操作都是通過掛載點來刪除底層的文件么?在 overlay 中,如果通過掛載點刪除 lower 層的內容,不會把文件真的從 lower 的文件目錄中干掉,而是會在 upper 層中添加 whiteout,添加 whiteout 的其中一種方式就是設置上層目錄的 xattr trusted.overlay.opaque=y。

當 tar 包遍歷結束以后,對 tmp 做個 umount,得到的 11/fs 就是我們想要的 layer,當我們想要生成 12/fs 這個 layer 時,只需要把 10/fs,11/fs 作為 lowerdir,把 12/fs 作為 upperdir 聯合掛載就可以。也就是說,之后鏡像的每一個 layer 生成都是需要把之前的 layer 掛載,下面圖說明了整個流程。

可以考慮下為什么要這么大費周章?關鍵有兩點。

一是鏡像中的刪除下層文件是要遵循 image-spec 中對于 whiteout 文件的定義(image-spec),這個文件只會在 tar 包中作為標識,并不會產生真正的影響。而起到真正作用的是在 applyNaive 碰到了 whiteout 文件,會調用聯合文件系統對底層目錄進行刪除,當然這個刪除對于 overlay 就是標記 opaque。

二是因為存在文件和目錄相互覆蓋的現象,每一個 tar 包中的文件都需要和之前所有 tar包 中的內容進行比對,如果不借用聯合文件系統的“超能力”,我們就只能拿著 tar 中的每一個文件對之前的層遍歷。

問題排查過程

了解了鏡像相關的知識,我們來看看這個問題的排查過程。首先我們觀察用戶的容器,經過簡化和打碼目錄結構如下,其中目錄 modules 就是事故多發地。

/data   └── prom       ├── bin       └── modules           ├── file           └── lib/  

再觀察下用戶的鏡像的各個層。我們把鏡像的層按照從下往上用遞增的 ID 來標注,對這個目錄有修改的有 5099、5101、5102、5103、5104 這幾層。把容器運行起來后,看到的 modules 目錄和 5104 提供的一樣。并沒有把 5103 等“下面”的鏡像合并起來,相當于 5104 把下面的目錄都覆蓋掉了(當然,51045103 文件是有區別的)。

5104 下層目錄為何被覆蓋?

看到這里,首先想到是不是創建容器的 rootfs 時參數出現了問題,導致少 mount 了一些層?于是模擬手動掛載mount -t overlay overlay -o lowerdir=5104:5103 point把最上兩層掛載,結果 5104 依然把 5103 覆蓋了。這里推斷可能是存在 overlay 的 .wh. 文件,于是嘗試在這兩層中搜 .wh. 文件,無果。于是去查 overlayfs 的文檔:

A directory is made opaque by setting the xattr "trusted.overlay.opaque" to "y". Where the upper filesystem contains an opaque directory, any directory in the lower filesystem with the same name is ignored.

設置了屬性 trusted.overlay.opaque=y 的目錄會變成“不透明”的,當上層文件系統被設置為“不透明”時,下層中同名的目錄會被忽略。overlay 如果想要在上層把下層覆蓋掉,就需要設置這個屬性。

通過命令getfattr -n "trusted.overlay.opaque" dir查看發現,5104 下面的 /data/asr_offline/modules 果然帶有這個屬性,這一現象也進而導致了下層目錄被“覆蓋”。

[root@]$ getfattr -n "trusted.overlay.opaque" 5104/fs/data/asr_offline/modules   # file: 5102/fs/data/asr_offline/modules   trusted.overlay.opaque="y"  

一波多折,層層追究那么問題來了,為什么只有特定的發行版會出現這個現象?我們嘗試在 ubuntu 拉下鏡像,發現“同源”目錄居然沒有設置 opaque!由于鏡像的層通過把源文件解壓和解包生成的,我們決定在確保不同操作系統中的“鏡像源文件”的 md5 相同之后,在各個操作系統上把鏡像源文件通過tar -zxf進行解包并重新手動掛載,發現 5104 均不會把 5103 覆蓋。

根據以上現象推斷,可能是某些發行版下的 containerd 從 content 讀取 tar 包并解壓制作 snapshot 的 layer 時出現問題,錯誤地把 snapshot 的目錄設置上了這個屬性。

為驗證該推斷,決定進行源代碼梳理,由此發現了其中的疑點(相關代碼如下)——生成 layers 時遍歷 tar 包會讀取每個文件的 PAXRecords 并且把這個設置在文件的 xattr 上( tar 包給每個文件都準備了 PAXRecords,和 Pod 的 labels 等價)。

func applyNaive() {     // ...     for k, v := range tar_file.PAXRecords {           setxattr(real_file, k, v)     }   }      func setxattr(path, key, value string) error {       return unix.Lsetxattr(path, key, []byte(value), 0)   }  

因為之前實驗過 v1.3 的 containerd 不會出現這個問題,所以對照了下兩者的代碼,發現兩者從 tar 包中抽取 PAXRecords 設置 xattr 的邏輯兩者是不一樣的。v1.3 的代碼如下:

func setxattr(path, key, value string) error {       // Do not set trusted attributes       if strings.HasPrefix(key, "trusted.") {           return errors.Wrap(unix.ENOTSUP, "admin attributes from archive not supported")       }       return unix.Lsetxattr(path, key, []byte(value), 0)   }  

也就是說 v1.3.0 中不會設置以trusted.開頭的 xattr!如果 tar 包中某目錄帶有trusted.overlay.opaque=y這個 PAX,低版本的 containerd 可能就會把這些屬性設置到 snapshot 的目錄上,而高版本的卻不會。那么,當用戶在打包時,如果把 opaque 也打到 tar 包中,解壓得到的 layer 對應目錄也就會帶有這個屬性。5104 這個目錄可能就是這個原因才變成 opaque 的。

為了驗證這個觀點,我寫了一段簡單的程序來掃描與 layer 對應的 content 來尋找這個屬性,結果發現 5102、5103、5104 幾個層都沒有這個屬性。這時我也開始懷疑這個觀點了,畢竟如果只是 tar 包中有特別的標識,應該不會在不同的操作系統表現不同。

抱著最后一絲希望掃描了 50995101,果然也并沒有這個屬性。但在掃描的過程中,注意到 5101 的 tar 包里存在 /data/asr_offline/modules/.wh..wh.opq 這個文件。記得當時看代碼 applyNaive 時如果遇到了 .wh..wh.opq 對應的操作應該是在掛載點刪除 /data/asr_offline/modules,而在 overlay 中刪除 lower 目錄會給 upper 同名目錄加上trusted.overlay.opaque=y。也就是說,在生成 layer 5101 時(需要提前掛載好 51005099),遍歷 tar 包遇到了這個 wh 文件,應該先在掛載點刪除 modules,也就是會在 5101 對應目錄加上 opaque=y。

再次以驗證源代碼成果的心態,去 snapshot 的 5101/fs 下查看目錄 modules 的 opaque,果然和想象的一樣。這些文件應該都是在 lower層,所以對應的 overlayfs 的操作應該是在 upper 也就是 5101 層的 /data/asr_offline/modules 目錄設置trusted.overlay.opaque=y。去查看 5101 的這個目錄,果然帶有這個屬性,好奇心驅使著我繼續查看了 5102、5103、5104 這幾層的目錄,發現居然都有這個屬性。

也就是這些 layer 每個都會把下面的覆蓋掉?這好像不符合常理。于是,去表現正常的 ubuntu 中查看,發現只有 5101 有這個屬性。經過反復確認 5102、5103、5104 的 tar 包中的確沒有目錄 modules 的 whiteout 文件,也就是說鏡像原本的意圖就是讓 5101 把下面的層覆蓋掉,再把 5101、5102、51035104 這幾層的 modules 目錄 merge 起來。整個生成鏡像的流程里,只有“借用”overlay 生成 snapshot 的 layer 會涉及到操作系統。

云開霧散,大膽猜探

我們不妨大膽猜測一下,會不會像下圖這樣,在生成 layer 5102 時,因為內核或 overlay 的 bug 把 modules 也添加了不透明的屬性?

為了對這個特性做單獨的測試,寫了個簡單的腳本。運行腳本之后,果然發現在這個發行版中,如果 overlay 的低層目錄有這個屬性并且在 upper 層中創建了同樣的目錄,會把這個 opaque“傳播”到 upper 層的目錄中。如果像 containerd 那樣遞推生成鏡像,肯定從有 whiteout 層開始上面的每一層都會具有這個屬性,也就導致了最終容器在某些特定的目錄只能看到最上面一層。

`#!/bin/bash      mkdir 1 2 work p   mkdir 1/func   touch 1/func/min      mount -t overlay overlay p -o lowerdir=1,upperdir=2,workdir=work   rm -rf p/func   mkdir -p p/func   touch p/func/max   umount p   getfattr -n "trusted.overlay.opaque" 2/func      mkdir 3   mount -t overlay overlay p -o lowerdir=2:1,upperdir=3,workdir=work   touch p/func/sqrt   umount p   getfattr -n "trusted.overlay.opaque" 3/func`  

最終總結

在幾個內核大佬的幫助下,確認了是內核 overlayfs 模塊的 bug。在 lower 層調用 copy_up 時并沒有檢測 xattr,從而導致 opaque 這個 xattr 傳播到了 upper 層。做聯合掛載時,如果上層的文件得到了這個屬性,自然會把下層文件覆蓋掉,也就出現了鏡像中丟失文件的現象。反思整個排查過程,其實很難在一開始就把問題定位到內核的某個模塊上,好在可以另辟蹊徑通過測試和閱讀源碼逐步逼近“真相”,成功尋得解決方案。

網站題目:揭秘!Containerd鏡像文件丟失問題,竟是鏡像生成惹得禍
鏈接分享:http://www.js-pz168.com/news33/204333.html

成都網站建設公司_創新互聯,為您提供品牌網站制作微信小程序品牌網站設計、網站營銷、靜態網站、微信公眾號

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網站建設公司
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
性感美女久久精品| 2014国产精品| 国模精品一区二区三区| 亚洲一区不卡在线| 欧美大尺度电影在线| 亚洲男人的天堂av| 国内成人免费视频| 九九久久99| 欧美日韩在线不卡| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 看片的网站亚洲| 成人在线观看网址| 欧美性受xxxx| 中文字幕在线不卡国产视频| 久久国产欧美日韩精品| 鬼打鬼之黄金道士1992林正英| 在线丝袜欧美日韩制服| 久久久久亚洲蜜桃| 日本vs亚洲vs韩国一区三区二区| 99国产精品一区| 91久久线看在观草草青青| 久久久99免费| 久久99久久精品| 精品伦精品一区二区三区视频| 欧美性生活一区| 亚洲欧洲av在线| 丰满白嫩尤物一区二区| 日韩少妇中文字幕| 久久理论电影网| 蜜臀精品久久久久久蜜臀| 国产麻豆日韩| 日韩一区二区免费在线观看| 亚洲综合激情另类小说区| 成人av集中营| 在线欧美日韩精品| 亚洲欧美日韩电影| 波多野结衣91| 欧美在线不卡一区| 亚洲精品一二三| 91啪亚洲精品| 欧美另类z0zxhd电影| 亚洲国产精品久久久久婷婷884| 99re视频精品| 欧美日韩在线三区| 亚洲影院久久精品| 风间由美久久久| 91精品国产一区二区三区| 性做久久久久久久免费看| 99热国产免费| 日韩午夜激情电影| 免费日韩伦理电影| 日本不卡一区| 国产精品免费久久| 成人毛片视频在线观看| 91久久精品日日躁夜夜躁欧美| 亚洲色图在线看| 91麻豆精品秘密| 欧美一区国产二区| 麻豆国产精品一区二区三区 | 99久久免费国产| 欧美日韩一区视频| 五月综合激情网| 欧美国产视频在线观看| 久久精品欧美日韩精品| 国产**成人网毛片九色| 欧美亚洲愉拍一区二区| 午夜精品免费在线| 免费亚洲精品视频| 欧美国产国产综合| eeuss影院一区二区三区| 欧美日本乱大交xxxxx| 日韩中文字幕麻豆| 日韩中文字幕一区| 亚洲同性gay激情无套| 99在线国产| 久久久精品免费网站| 国产成人精品三级| 制服丝袜激情欧洲亚洲| 久久99久久99小草精品免视看| 自拍偷拍一区二区三区| 亚洲一区国产视频| 日本一区免费观看| 亚洲欧洲综合另类| 久久99精品久久久久久三级| 欧美韩国一区二区| dy888夜精品国产专区| 久久免费精品国产久精品久久久久| 国内精品国产成人国产三级粉色 | 亚洲欧洲精品一区| 亚洲一区二区综合| 欧美一区二区三区在线播放| 成人免费视频在线观看| 国产精品一区二区a| 日本一区二区三区dvd视频在线 | 麻豆精品国产91久久久久久| 一本大道av一区二区在线播放| 亚洲成a人片在线观看中文| 日韩欧美第二区在线观看| 亚洲最色的网站| 日韩片电影在线免费观看| 一区二区久久久久久| 日韩av一区二区三区在线观看 | 精品国产不卡一区二区三区| 不卡一区二区三区四区| 亚洲精品在线电影| 91网站在线播放| 国产目拍亚洲精品99久久精品| 成人av网站观看| 国产精品嫩草99a| 久久五月天婷婷| 一区二区三区日韩精品视频| 日本一区免费看| 天天爽夜夜爽夜夜爽精品视频| 色综合久久天天| 久久99精品久久久久久| 欧美精品1区2区3区| 丁香桃色午夜亚洲一区二区三区| 欧美成人免费网站| 97人人模人人爽视频一区二区| 国产欧美日韩麻豆91| 国产午夜精品在线| 一区二区三区在线观看视频| 亚洲国产精品久久久久婷婷老年| 亚瑟在线精品视频| 欧美天堂一区二区三区| 国产精品一线二线三线精华| 欧美成人乱码一区二区三区| 91精品久久久久久蜜桃| 国产精品久久久久久妇女6080| 欧美另类一区| 天天综合色天天综合色h| 欧美主播一区二区三区美女| 国产精品一区二区在线播放 | 国产伦精品一区二区三区在线| 亚洲精品日韩专区silk| 亚洲国产日韩欧美| 久久精品国产99| 欧美精品一区二区三区久久久 | 国产精品久久久久久久久免费桃花 | 欧美婷婷久久| 日本va欧美va瓶| 欧美一区二区三区爱爱| 成人av中文| 亚洲一区二区三区小说| 欧美伊人久久大香线蕉综合69| 成人一级黄色片| 中文字幕中文字幕一区二区 | 亚洲午夜免费视频| 欧美视频一区二区| 99麻豆久久久国产精品免费| 自拍偷拍国产精品| 色婷婷国产精品| 成人性色生活片| 亚洲婷婷在线视频| 91成人在线精品| jlzzjlzz亚洲日本少妇| 日韩一区在线看| 91国偷自产一区二区三区观看 | 日本一区二区三区精品视频| 蜜臀av在线播放一区二区三区| 欧美tk—视频vk| 免费试看一区| 韩国精品免费视频| 日本一二三不卡| 色综合天天天天做夜夜夜夜做| 成人影视亚洲图片在线| 亚洲视频一区二区在线| 91福利国产成人精品照片| 99国产精品一区| 亚洲第一综合色| 91精品福利在线一区二区三区| 国产一区二区不卡视频| 欧美a一区二区| 久久精品综合网| 中文字幕99| 91亚洲精品久久久蜜桃网站| 亚洲国产精品一区二区久久| 欧美一区二区三区的| 欧美日韩一区二区视频在线| 国产一区二区三区高清播放| 国产精品超碰97尤物18| 欧美性一级生活| 国内精品二区| 国产精品一区二区三区99| 一区二区中文视频| 欧美高清视频不卡网| 久久久99国产精品免费| 国模少妇一区二区三区| 亚洲天堂成人在线观看| 欧美日韩视频在线一区二区| 国产精品视频入口| 国产一区亚洲一区| 亚洲精品乱码久久久久久久久| 3d动漫精品啪啪一区二区竹菊| 久久久久久高清| 成人一区在线观看| 亚洲gay无套男同| 国产日韩欧美精品综合| 欧美三级三级三级| 免费久久久一本精品久久区|