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

Docker容器里進程的 pid 是如何申請出來的?

開發 架構
不知道大家是否和我一樣好奇容器進程中的 pid 是如何申請出來的?和宿主機中申請 pid 有什么不同?內核又是如何顯示容器中的進程號的?

大家好,我是飛哥!

如果大家有過在容器中執行 ps 命令的經驗,都會知道在容器中的進程的 pid 一般是比較小的。例如下面我的這個例子。

# ps -ef
PID USER TIME COMMAND
1 root 0:00 ./demo-ie
13 root 0:00 /bin/bash
21 root 0:00 ps -ef

不知道大家是否和我一樣好奇容器進程中的 pid 是如何申請出來的?和宿主機中申請 pid 有什么不同?內核又是如何顯示容器中的進程號的?

前面我們在《Linux進程是如何創建出來的?》中介紹了進程的創建過程。事實上進程的 pid 命名空間、pid 也都是在這個過程中申請的。我今天就來帶大家深入理解一下 docker 核心之一 pid 命名空間的工作原理。

一、Linux 的默認 pid 命名空間

前面的文章《Linux進程是如何創建出來的?》中我們提到了進程的命名空間成員 nsproxy。

//file:include/linux/sched.h
struct task_struct {
...
/* namespaces */
struct nsproxy *nsproxy;
}

Linux 在啟動的時候會有一套默認的命名空間,定義在 kernel/nsproxy.c 文件下。

//file:kernel/nsproxy.c
struct nsproxy init_nsproxy = {
.count = ATOMIC_INIT(1),
.uts_ns = &init_uts_ns,
.ipc_ns = &init_ipc_ns,
.mnt_ns = NULL,
.pid_ns = &init_pid_ns,
.net_ns = &init_net,
};

其中默認的 pid 命名空間是 init_pid_ns,它定義在 kernel/pid.c 下。

//file:kernel/pid.c
struct pid_namespace init_pid_ns = {
.kref = {
.refcount = ATOMIC_INIT(2),
},
.pidmap = {
[ 0 ... PIDMAP_ENTRIES-1] = { ATOMIC_INIT(BITS_PER_PAGE), NULL }
},
.last_pid = 0,
.level = 0,
.child_reaper = &init_task,
.user_ns = &init_user_ns,
.proc_inum = PROC_PID_INIT_INO,
};

在 pid 命名空間里我覺得最需要關注的是兩個字段。一個是 level 表示當前 pid 命名空間的層級。另一個是 pidmap,這是一個 bitmap,一個 bit 如果為 1,就表示當前序號的 pid 已經分配出去了。

另外默認命名空間的 level 初始化是 0。這是一個表示樹的層次結構的節點。如果有多個命名空間創建出來,它們之間會組成一棵樹。level 表示樹在第幾層。根節點的 level 是 0。

圖片

INIT_TASK 0號進程,也叫 idle 進程,它固定使用這個默認的 init_nsproxy。

//file:include/linux/init_task.h
#define INIT_TASK(tsk) \
{
.state = 0, \
.stack = &init_thread_info, \
.usage = ATOMIC_INIT(2), \
.flags = PF_KTHREAD, \
.prio = MAX_PRIO-20, \
.static_prio = MAX_PRIO-20, \
.normal_prio = MAX_PRIO-20, \
...
.nsproxy = &init_nsproxy, \
......
}

所有進程都是一個派生一個的方式生成出來的。如果不指定命名空間,所有進程使用的都是使用缺省的命名空間。

圖片

二、Linux 新 pid 命名空間創建

在這里,我們假設我們創建進程時指定了 CLONE_NEWPID 要創建一個獨立的 pid 命名空間出來(Docker 容器就是這么干的)。

在 《Linux進程是如何創建出來的?》一文中我們已經了解了進程的創建過程。整個創建過程的核心是在于 copy_process 函數。

在這個函數中會申請和拷貝進程的地址空間、打開文件列表、文件目錄等關鍵信息,另外就是pid 命名空間的創建也是在這里完成的。

//file:kernel/fork.c
static struct task_struct *copy_process(...)
{
...
//2.1 拷貝進程的命名空間 nsproxy
retval = copy_namespaces(clone_flags, p);

//2.2 申請 pid
pid = alloc_pid(p->nsproxy->pid_ns);

//2.3 記錄 pid
p->pid = pid_nr(pid);
p->tgid = p->pid;
attach_pid(p, PIDTYPE_PID, pid);
...
}

2.1 創建進程時構造新命名空間

在上面的 copy_process 代碼中我們看到對 copy_namespaces 函數的調用。命名空間就是在這個函數中操作的。

//file:kernel/nsproxy.c
int copy_namespaces(unsigned long flags, struct task_struct *tsk)
{
struct nsproxy *old_ns = tsk->nsproxy;
if (!(flags & (CLONE_NEWNS | CLONE_NEWUTS | CLONE_NEWIPC |
CLONE_NEWPID | CLONE_NEWNET)))
return 0;

new_ns = create_new_namespaces(flags, tsk, user_ns, tsk->fs);
tsk->nsproxy = new_ns;
...
}

如果在創建進程時候沒有傳入 CLONE_NEWNS 等幾個 flag,還是會復用之前的默認命名空間。這幾個 flag 的含義如下。

  • CLONE_NEWPID: 是否創建新的進程編號命名空間,以便與宿主機的進程 PID 進行隔離
  • CLONE_NEWNS: 是否創建新的掛載點(文件系統)命名空間,以便隔離文件系統和掛載點
  • CLONE_NEWNET: 是否創建新的網絡命名空間,以便隔離網卡、IP、端口、路由表等網絡資源
  • CLONE_NEWUTS: 是否創建新的主機名與域名命名空間,以便在網絡中獨立標識自己
  • CLONE_NEWIPC: 是否創建新的 IPC 命名空間,以便隔離信號量、消息隊列和共享內存
  • CLONE_NEWUSER: 用來隔離用戶和用戶組的。

因為我們本節開頭假設傳入了 CLONE_NEWPID 標記。所以會進入到 create_new_namespaces 中來申請新的命名空間。

//file:kernel/nsproxy.c
static struct nsproxy *create_new_namespaces(unsigned long flags,
struct task_struct *tsk, struct user_namespace *user_ns,
struct fs_struct *new_fs)
{
//申請新的 nsproxy
struct nsproxy *new_nsp;
new_nsp = create_nsproxy();
......
//拷貝或創建 PID 命名空間
new_nsp->pid_ns = copy_pid_ns(flags, user_ns, tsk->nsproxy->pid_ns);
}

create_new_namespaces 中會調用 copy_pid_ns 來完成實際的創建,真正的創建過程是在 create_pid_namespace 中完成的。

//file:kernel/pid_namespace.c
static struct pid_namespace *create_pid_namespace(...)
{
struct pid_namespace *ns;

//新 pid namespace level + 1
unsigned int level = parent_pid_ns->level + 1;

//申請內存
ns = kmem_cache_zalloc(pid_ns_cachep, GFP_KERNEL);
ns->pidmap[0].page = kzalloc(PAGE_SIZE, GFP_KERNEL);
ns->pid_cachep = create_pid_cachep(level + 1);

//設置新命名空間 level
ns->level = level;

//新命名空間和舊命名空間組成一棵樹
ns->parent = get_pid_ns(parent_pid_ns);

//初始化 pidmap
set_bit(0, ns->pidmap[0].page);
atomic_set(&ns->pidmap[0].nr_free, BITS_PER_PAGE - 1);

for (i = 1; i < PIDMAP_ENTRIES; i++)
atomic_set(&ns->pidmap[i].nr_free, BITS_PER_PAGE);

return ns;
}

在 create_pid_namespace 真正申請了新的 pid 命名空間,為它的 pidmap 申請了內存(在 create_pid_cachep 中申請的),也進行了初始化。

另外還有一點比較重要的是新命名空間和舊命名空間通過 parent、level 等字段組成了一棵樹。其中 parent 指向了上一級命名空間,自己的 level 用來表示層次,設置成了上一級 level + 1。

其最終的效果就是新進程擁有了新的 pid namespace,并且這個新 pid namespace 和父 pidnamespace 串聯了起來,效果如下圖。

圖片

如果 pid 有多層的話,會組成更直觀的樹形結構。

2.2 申請進程id

創建完命名空間后,在 copy_process 中接下來接著就是調用 alloc_pid 來分配 pid。

//file:kernel/fork.c
static struct task_struct *copy_process(...)
{
...
//2.1 拷貝進程的命名空間 nsproxy
retval = copy_namespaces(clone_flags, p);
...

//2.2 申請 pid
pid = alloc_pid(p->nsproxy->pid_ns);
...
}

注意傳入的參數是 p->nsproxy->pid_ns。前面進程創建了新的 pid namespace,這個時候該命名空間就是 level 為 1 的新 pid_ns。我們繼續來看 alloc_pid 具體 pid 的過程。

//file:kernel/pid.c
struct pid *alloc_pid(struct pid_namespace *ns)
{
//申請 pid 內核對象
pid = kmem_cache_alloc(ns->pid_cachep, GFP_KERNEL);

//調用到alloc_pidmap來分配一個空閑的pid
tmp = ns;
pid->level = ns->level;
for (i = ns->level; i >= 0; i--) {
nr = alloc_pidmap(tmp);
if (nr < 0)
goto out_free;

pid->numbers[i].nr = nr;
pid->numbers[i].ns = tmp;
tmp = tmp->parent;
}
...
return pid;
}

在上面的代碼中要注意兩個細節。

我們平時說的 pid 在內核中并不是一個簡單的整數類型,而是一個小結構體來表示的(struct pid)。

申請 pid 并不是申請了一個,而是使用了一個 for 循環申請多個出來

之所以要申請多個,是因為對于容器里的進程來說,并不是在自己當前的命名空間申請就完事了,還要到其父命名空間中也申請一個。我們把 for 循環的工作工程用下圖表示一下。

圖片

首先到當前層次的命名空間申請一個 pid 出來,然后順著命名空間的父節點,每一層也都要申請一個,并都記錄到 pid->numbers 數組中。

這里多說一下,如果 pid 申請失敗的話,會報 -ENOMEM 錯誤,在用戶層看起來就是“fork:無法分配內存”,實際是由 pid 不足引起的。這個問題我在《明明還有大量內存,為啥報錯“無法分配內存”?》 提到過。

2.3 設置整數格式 pid

當申請并構造完 pid 后,將其設置在 task_struct 上,記錄起來。

//file:kernel/fork.c
static struct task_struct *copy_process(...)
{
...
//2.2 申請 pid
pid = alloc_pid(p->nsproxy->pid_ns);

//2.3 記錄 pid
p->pid = pid_nr(pid);
p->tgid = p->pid;
attach_pid(p, PIDTYPE_PID, pid);
...
}

其中 pid_nr 是獲取的根 pid 命名空間下的 pid 編號,參見 pid_nr 源碼。

//file:include/linux/pid.h
static inline pid_t pid_nr(struct pid *pid)
{
pid_t nr = 0;
if (pid)
nr = pid->numbers[0].nr;
return nr;
}

然后再調用 attach_pid 是把申請到的 pid 結構掛到自己的 pids[PIDTYPE_PID] 鏈表里了。

//file:kernel/pid.c
void attach_pid(struct task_struct *task, enum pid_type type,
struct pid *pid)
{
...
link = &task->pids[type];
link->pid = pid;
hlist_add_head_rcu(&link->node, &pid->tasks[type]);
}

task->pids 是一組鏈表。

三、容器進程 pid 查看

pid 已經申請好了,那在容器中是如何查看當前層次的進程號的呢?比如我們在容器中看到的 demo-ie 進程的 id 就是 1。

# ps -ef
PID USER TIME COMMAND
1 root 0:00 ./demo-ie
...

內核提供了個函數用來查看進程在當前某個命名空間的命名號。

//file:kernel/pid.c
pid_t pid_vnr(struct pid *pid)
{
return pid_nr_ns(pid, task_active_pid_ns(current));
}

其中在容器中查看進程 pid 使用的是 pid_vnr,pid_vnr 調用 pid_nr_ns 來查看進程在特定命名空間里的進程號。

函數 pid_nr_ns 接收連個參數

第一個參數是進程里記錄的 pid 對象(保存有在各個層次申請到的 pid 號)

第二個參數是指定的 pid 命名空間(通過 task_active_pid_ns(current)獲取)。

當具備這兩個參數后,就可以根據 pid 命名空間里記錄的層次 level 取得容器進程的當前 pid 了

//file:kernel/pid.c
pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns)
{
struct upid *upid;
pid_t nr = 0;

if (pid && ns->level <= pid->level) {
upid = &pid->numbers[ns->level];
if (upid->ns == ns)
nr = upid->nr;
}
return nr;
}

在 pid_nr_ns 中通過判斷 level 就把容器 pid 整數值查出來了。

四、總結

最后,舉個例子,假如有一個進程在 level 0 級別的 pid 命名空間里申請到的進程號是 1256,在 level 1 容器 pid 命名空間里申請到的進程號是 5。那么這個進程以及其 pid 在內存中的形式是下圖這個樣子的。

圖片

那么容器在查看進程的 pid 號的時候,傳入容器的 pid 命名空間,就可以將該進程在容器中的 pid 號 5 給打印出來了!!

責任編輯:武曉燕 來源: 開發內功修煉
相關推薦

2022-09-29 09:17:47

進程Linux創建

2022-10-08 00:00:02

Docker項目技術

2016-01-11 10:29:36

Docker容器容器技術

2021-06-11 11:28:22

多線程fork單線程

2021-09-22 13:02:38

容器技術Docker

2011-07-27 18:41:24

TOGAF企業架構

2025-04-01 08:50:48

2018-12-14 08:00:00

2023-06-16 16:06:02

lazydockerDocker容器

2021-10-26 10:42:49

NET進程托管

2015-08-21 17:47:38

Docker安全EC2容器服務

2025-04-18 00:00:01

2015-07-09 10:32:23

Windows Ser云計算應用架構

2018-07-12 10:33:50

Docker容器內存

2019-09-23 13:10:02

容器進程

2020-11-27 14:33:00

QQ紅包設計

2021-04-16 08:00:00

容器Docker工具

2018-11-05 09:23:19

開源Docker容器鏡像

2009-08-23 09:38:14

2010-04-30 12:38:38

Oracle進程
點贊
收藏

51CTO技術棧公眾號

91精品国产高清自在线| 欧美日韩午夜在线视频| 国产精品日韩一区二区| 欧美精品亚洲精品日韩精品| 日韩欧美国产大片| 欧美性高清videossexo| 久久免费一级片| 亚洲日本国产精品| 久久99久久99精品免视看婷婷| 久久香蕉频线观| 国产又粗又长又爽| 久久精品黄色| 疯狂做受xxxx高潮欧美日本 | 熟女熟妇伦久久影院毛片一区二区| 性少妇videosexfreexxx片| 久久aⅴ国产紧身牛仔裤| 日韩视频精品在线| 国产精品无码毛片| 久久久久毛片免费观看| 色国产综合视频| 福利在线一区二区| 欧美成人hd| 91麻豆蜜桃一区二区三区| 91精品综合久久久久久五月天| 国产成人无码精品| 午夜精品剧场| 中国china体内裑精亚洲片| 国产av一区二区三区传媒| 国产第一精品| 色94色欧美sute亚洲13| 欧美交换配乱吟粗大25p| 97最新国自产拍视频在线完整在线看| 成人黄色777网| 91精品视频在线看| 成人黄色片在线观看| 亚洲一区二区毛片| 久久久久久久一区二区| 国产免费无码一区二区视频| 波多野结衣在线观看一区二区三区 | 老司机亚洲精品一区二区| 欧美综合视频在线观看| 97成人在线观看视频| 岛国片av在线| 亚洲蜜桃精久久久久久久| 亚洲电影网站| 91精品国产高清自在线看超| 欧洲av无码放荡人妇网站| 青青青草视频在线| 亚洲免费观看高清完整| 在线亚洲美日韩| 色三级在线观看| 国产精品三级视频| 亚洲成人网上| 日本中文字幕在线视频| 国产精品久久久久久一区二区三区 | 91精品国产91| 免费毛片一区二区三区| 国模大胆一区二区三区| 久久99久久亚洲国产| 美女福利视频在线观看| 欧美日韩1区2区3区| 欧美另类第一页| 国产小视频在线观看免费| 伊人久久大香线蕉综合四虎小说| 久久艳片www.17c.com | 欧美视频一区二区| 久久人人爽av| 成人日韩视频| 日韩视频一区二区三区在线播放| 日本黄色www| 北条麻妃在线一区二区免费播放| 精品sm捆绑视频| 亚洲综合色一区| 成人综合久久| 久久夜色撩人精品| 久久午夜无码鲁丝片午夜精品| 精品1区2区3区4区| 热久久这里只有精品| 日韩精品一区不卡| 精品一区二区在线免费观看| 国产主播在线一区| 亚洲国产精品一| 91蝌蚪porny九色| 亚洲五月六月| 麻豆福利在线观看| 色综合久久中文综合久久牛| 九九九在线观看视频| 麻豆国产精品| 亚洲欧美日韩在线一区| 很污很黄的网站| 韩日在线一区| 国产精品永久免费观看| www.亚洲黄色| 久久久99精品免费观看| 爱爱爱视频网站| 国产福利电影在线播放| 欧美亚洲日本国产| 无码国产精品一区二区高潮| 老司机凹凸av亚洲导航| 伊人久久免费视频| 国产第一页在线播放| 日韩1区2区3区| 成人午夜电影在线播放| 国产小视频在线播放| 亚洲欧美日韩久久| 蜜臀av午夜一区二区三区| 亚洲一区av| 亚洲人成欧美中文字幕| 九九热视频精品| 蜜臀av一区二区三区| 国产乱码精品一区二区三区不卡| a天堂中文在线88| 婷婷成人激情在线网| 亚洲一区二区福利视频| 亚洲都市激情| 午夜精品久久久久久久久久久久久| 这里只有久久精品视频| 9人人澡人人爽人人精品| 亚洲国产精品女人| 色天使综合视频| 亚洲国产欧美一区| 午夜免费激情视频| 卡一卡二国产精品| 麻豆av一区二区三区| 丁香影院在线| 精品少妇一区二区三区视频免付费 | 97人妻一区二区精品免费视频| 久久综合视频网| 久久成人福利视频| 一区二区三区欧洲区| 久久精品视频在线| 波多野结衣电影在线播放| 99国产精品久| 欧美大片在线播放| 好吊妞国产欧美日韩免费观看网站| 久久久精品在线| 国产又粗又大又黄| 国产精品久久午夜| 亚洲最大综合网| 精品国产91乱码一区二区三区四区| 97免费在线视频| 手机看片一区二区三区| 亚洲一级二级三级| 亚洲精品一区二区18漫画| 亚洲精品在线观看91| 成人亚洲欧美一区二区三区| 麻豆系列在线观看| 欧美精品一二三| 日本二区三区视频| 韩国欧美国产1区| 久久久久亚洲av无码专区喷水| 欧美一级做a| 日韩在线观看高清| 国产老女人乱淫免费| 综合精品久久久| 男生和女生一起差差差视频| 99久久夜色精品国产亚洲96| 国产男女猛烈无遮挡91| 欧美jizz18性欧美| 91精品国产欧美一区二区| 精品欧美一区二区久久久久| 国产不卡免费视频| 久久久亚洲国产精品| 日本天堂一区| 国产精品久久久久久婷婷天堂| 午夜影院免费视频| 色久优优欧美色久优优| 粉嫩精品久久99综合一区| 精品在线免费观看| 亚洲精品无码国产| 国产精品超碰| 国产999精品视频| 麻豆免费在线观看| 亚洲成人av片在线观看| 伊人手机在线视频| 中文字幕第一区第二区| 在线免费看污网站| 亚洲日本欧美| 亚洲国产精品久久久久婷婷老年 | 欧美凹凸一区二区三区视频 | 亚洲二区视频| 日本一区二区三区四区在线观看| 久久久精品一区二区毛片免费看| 欧美xxxx14xxxxx性爽| 好吊色一区二区| 日本久久一区二区三区| 久久精品一区二区三区四区五区| 成人黄色在线网站| 污色网站在线观看| 国内精品99| 亚洲精品白虎| 91精品国产自产在线丝袜啪| 国产成人91久久精品| h网站久久久| 亚洲人a成www在线影院| 国产丰满美女做爰| 黑人巨大精品欧美一区二区一视频| 久久久久久久久福利| 丁香婷婷深情五月亚洲| 亚洲人成无码www久久久| 欧美/亚洲一区| 欧美日韩三区四区| av成人资源| 国产中文欧美精品| 台湾佬成人网| 欧美激情网站在线观看| 午夜视频在线观看网站| 亚洲精品电影网站| 国产叼嘿视频在线观看| 欧美三级电影在线看| 激情五月色婷婷| 亚洲欧美国产三级| 国产三级黄色片| av电影天堂一区二区在线观看| 久久国产精品国产精品| 亚洲综合好骚| 中文字幕无码精品亚洲资源网久久| 9999国产精品| 日本在线播放不卡| 老牛精品亚洲成av人片| 亚洲综合中文字幕在线观看| 3d性欧美动漫精品xxxx软件| 97色在线播放视频| 午夜成年人在线免费视频| 最新69国产成人精品视频免费| 天堂中文字幕在线| 精品国产一二三| 国内精品久久久久久久久久久| 欧美视频一区在线观看| 久久久久久久久久成人| 精品成人国产在线观看男人呻吟| 久操免费在线视频| 亚洲激情在线播放| 乱老熟女一区二区三区| 国产精品麻豆网站| jizz日本在线播放| 国产欧美一区二区精品性色超碰 | 水蜜桃精品av一区二区| 日韩一区国产在线观看| 国产精品中文字幕亚洲欧美| 久久久久久九九| 偷拍视屏一区| 麻豆精品视频| 精品久久久久久久久久久aⅴ| 久久亚洲高清| 国产a久久精品一区二区三区| 精品一区2区三区| 蜜桃久久久久| 美脚丝袜一区二区三区在线观看| 久久a爱视频| 精品国产乱码久久久久久郑州公司 | 国产成人亚洲一区二区三区| 国产精品美女www| 久久亚洲国产精品尤物| 91精品国产自产在线老师啪| 亚州欧美在线| 国产欧美日韩综合精品| av一级久久| www日韩av| 欧美freesex8一10精品| 欧美激情第六页| 成人一区不卡| 精品嫩模一区二区三区| 激情久久中文字幕| 日本免费黄视频| 奇米影视一区二区三区小说| 天天爽夜夜爽一区二区三区| 久久99国产精品免费| 丰满少妇一区二区三区专区| 岛国一区二区在线观看| 亚洲乱码国产乱码精品精大量 | 99鲁鲁精品一区二区三区| 亚洲乱码日产精品bd| 国产精品成人免费一区二区视频| 欧美日韩亚洲高清| 中文字幕在线观看1| 日韩欧美一区在线| 三级毛片在线免费看| 中文国产亚洲喷潮| 手机在线免费看av| 2019精品视频| 欧洲亚洲精品| 国产视频一区二区三区四区| 国产九一精品| 日韩精品一区二区三区电影| 99精品国产在热久久| 男女视频在线看| 成人黄色一级视频| 丁香花五月婷婷| 亚洲伊人伊色伊影伊综合网| 91丨九色丨海角社区| 日韩一区二区精品| 青青草在线播放| 美日韩精品免费视频| 黑人精品一区| 99r国产精品视频| 国语产色综合| 成人免费在线网| 久久精品国产99久久6| 加勒比精品视频| 亚洲天堂2014| 久久久精品毛片| 亚洲精品在线电影| 日本高清在线观看wwwww色| 亚州精品天堂中文字幕| 婷婷久久综合九色综合99蜜桃| 精品久久久久久乱码天堂| 天天综合久久| 无码日韩人妻精品久久蜜桃| 成人精品小蝌蚪| 亚洲天堂黄色片| 欧美性极品少妇| 蜜桃成人在线视频| 久久久久亚洲精品| 超碰国产精品一区二页| 日本公妇乱淫免费视频一区三区| 黄色日韩在线| 国产人妻精品久久久久野外| 欧美国产欧美亚州国产日韩mv天天看完整 | 91精彩在线视频| 国产91av在线| 国内精品麻豆美女在线播放视频 | 久久久久性色av无码一区二区| 欧美艳星brazzers| 手机福利在线| 97国产精品视频| xxxx日韩| 日本黄色片一级片| 国产精品一区免费在线观看| 国产精品理论在线| 在线免费观看日本一区| 日本不卡视频一区二区| 欧美国产日韩一区二区在线观看| 热久久久久久| 亚洲精品欧洲精品| 免费人成精品欧美精品| 欧美激情aaa| 色哟哟一区二区三区| 色哟哟在线观看| 2020国产精品视频| 日韩精品丝袜美腿| 国产l精品国产亚洲区久久| 99国产精品久久久久久久久久| 日韩久久精品视频| 亚洲精品国产欧美| 一本大道色婷婷在线| 久久久久久久久久久久久9999| 99亚洲伊人久久精品影院红桃| 黄色网址在线视频| 欧美特级www| 国产小视频在线观看| 91综合国产| 99久久精品无码一区二区毛片 | 中文字幕亚洲情99在线| 456成人影院在线观看| 婷婷四房综合激情五月| 蜜臀久久99精品久久久画质超高清| 黄色三级生活片| 欧美精三区欧美精三区| 成人午夜在线影视| av成人在线电影| 亚洲国产午夜| 久久精品国产亚洲av麻豆| 色综合中文字幕国产| 国产午夜在线观看| 成人性生交大片免费看小说 | 欧美性一区二区三区| 国产不卡av一区二区| 国产精品久久久毛片| 1024成人网色www| 性欧美8khd高清极品| 欧美影院久久久| 999精品在线| 亚洲成a人无码| 色综合久久天天综合网| 亚乱亚乱亚洲乱妇| av在线不卡一区| 久久久久免费| 日本aⅴ在线观看| 日韩精品在线免费| 香蕉久久一区| 欧美二区在线视频| 中文字幕在线观看不卡| 亚洲精华国产精华精华液网站| 欧美怡春院一区二区三区| 欧美丰满日韩| 超碰男人的天堂| 欧美二区乱c少妇| 手机在线理论片| 欧美精品一区二区性色a+v| av一区二区三区| 91欧美日韩麻豆精品| 97色在线视频| 99久久精品费精品国产| 手机在线成人av| 在线播放亚洲一区| 国产精品伦理| 青草网在线观看| 国产精品毛片无遮挡高清| 色呦呦免费观看|