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

Docker基礎技術:Linux Namespace(上)

運維 系統運維
時下最熱的技術莫過于Docker了,Docker和Docker衍生的東西用到了很多很酷的技術,我會用幾篇 文章來把這些技術給大家做個介紹,希望通過這些文章大家可以自己打造一個山寨版的docker。

[[171779]]

時下最熱的技術莫過于Docker了,很多人都覺得Docker是個新技術,其實不然,Docker除了其編程語言用go比較新外,其實它還真不是個新東西,也就是個新瓶裝舊酒的東西,所謂的The New “Old Stuff”。Docker和Docker衍生的東西用到了很多很酷的技術,我會用幾篇 文章來把這些技術給大家做個介紹,希望通過這些文章大家可以自己打造一個山寨版的docker。

當然,文章的風格一定會尊重時下的“流行”——我們再也沒有整塊整塊的時間去看書去專研,而我們只有看微博微信那樣的碎片時間(那怕我們有整塊的時間,也被那些在手機上的APP碎片化了)。所以,這些文章的風格必然堅持“馬桶風格”(希望簡單到占用你拉一泡屎就時間,而且你還不用動腦子,并能學到些東西)

廢話少說,我們開始。先從Linux Namespace開始。

簡介

Linux Namespace是Linux提供的一種內核級別環境隔離的方法。不知道你是否還記得很早以前的Unix有一個叫chroot的系統調用(通過修改根目錄把用戶jail到一個特定目錄下),chroot提供了一種簡單的隔離模式:chroot內部的文件系統無法訪問外部的內容。Linux Namespace在此基礎上,提供了對UTS、IPC、mount、PID、network、User等的隔離機制。

舉個例子,我們都知道,Linux下的超級父親進程的PID是1,所以,同chroot一樣,如果我們可以把用戶的進程空間jail到某個進程分支下,并像chroot那樣讓其下面的進程 看到的那個超級父進程的PID為1,于是就可以達到資源隔離的效果了(不同的PID namespace中的進程無法看到彼此)

šLinux Namespace 有如下種類,官方文檔在這里《Namespace in Operation

主要是š三個系統調用

  • šclone() – 實現線程的系統調用,用來創建一個新的進程,并可以通過設計上述參數達到隔離。
  • šunshare() – 使某進程脫離某個namespace
  • šsetns() – 把某進程加入到某個namespace

unshare() 和 setns() 都比較簡單,大家可以自己man,我這里不說了。

下面還是讓我們來看一些示例(以下的測試程序最好在Linux 內核為3.8以上的版本中運行,我用的是ubuntu 14.04)。

clone()系統調用

首先,我們來看一下一個最簡單的clone()系統調用的示例,(后面,我們的程序都會基于這個程序做修改):

  1. #define _GNU_SOURCE 
  2. #include <sys/types.h> 
  3. #include <sys/wait.h> 
  4. #include <stdio.h> 
  5. #include <sched.h> 
  6. #include <signal.h> 
  7. #include <unistd.h> 
  8.  
  9. /* 定義一個給 clone 用的棧,棧大小1M */ 
  10. #define STACK_SIZE (1024 * 1024) 
  11. static char container_stack[STACK_SIZE]; 
  12.  
  13. char* const container_args[] = { 
  14.     "/bin/bash", 
  15.     NULL 
  16. }; 
  17.  
  18. int container_main(void* arg) 
  19.     printf("Container - inside the container!\n"); 
  20.     /* 直接執行一個shell,以便我們觀察這個進程空間里的資源是否被隔離了 */ 
  21.     execv(container_args[0], container_args);  
  22.     printf("Something's wrong!\n"); 
  23.     return 1; 
  24.  
  25. int main() 
  26.     printf("Parent - start a container!\n"); 
  27.     /* 調用clone函數,其中傳出一個函數,還有一個棧空間的(為什么傳尾指針,因為棧是反著的) */ 
  28.     int container_pid = clone(container_main, container_stack+STACK_SIZE, SIGCHLD, NULL); 
  29.     /* 等待子進程結束 */ 
  30.     waitpid(container_pid, NULL, 0); 
  31.     printf("Parent - container stopped!\n"); 
  32.     return 0; 

從上面的程序,我們可以看到,這和pthread基本上是一樣的玩法。但是,對于上面的程序,父子進程的進程空間是沒有什么差別的,父進程能訪問到的子進程也能。

下面, 讓我們來看幾個例子看看,Linux的Namespace是什么樣的。

UTS Namespace

下面的代碼,我略去了上面那些頭文件和數據結構的定義,只有最重要的部分。

  1. int container_main(void* arg) 
  2.     printf("Container - inside the container!\n"); 
  3.     sethostname("container",10); /* 設置hostname */ 
  4.     execv(container_args[0], container_args); 
  5.     printf("Something's wrong!\n"); 
  6.     return 1; 
  7.  
  8. int main() 
  9.     printf("Parent - start a container!\n"); 
  10.     int container_pid = clone(container_main, container_stack+STACK_SIZE,  
  11.             CLONE_NEWUTS | SIGCHLD, NULL); /*啟用CLONE_NEWUTS Namespace隔離 */ 
  12.     waitpid(container_pid, NULL, 0); 
  13.     printf("Parent - container stopped!\n"); 
  14.     return 0; 

運行上面的程序你會發現(需要root權限),子進程的hostname變成了 container。

  1. hchen@ubuntu:~$ sudo ./uts 
  2. Parent - start a container! 
  3. Container - inside the container! 
  4. root@container:~# hostname 
  5. container 
  6. root@container:~# uname -n 
  7. container 

IPC Namespace

IPC全稱 Inter-Process Communication,是Unix/Linux下進程間通信的一種方式,IPC有共享內存、信號量、消息隊列等方法。所以,為了隔離,我們也需要把IPC給隔離開來,這樣,只有在同一個Namespace下的進程才能相互通信。如果你熟悉IPC的原理的話,你會知道,IPC需要有一個全局的ID,即然是全局的,那么就意味著我們的Namespace需要對這個ID隔離,不能讓別的Namespace的進程看到。

要啟動IPC隔離,我們只需要在調用clone時加上CLONE_NEWIPC參數就可以了。

  1. int container_pid = clone(container_main, container_stack+STACK_SIZE,  
  2.             CLONE_NEWUTS | CLONE_NEWIPC | SIGCHLD, NULL); 

首先,我們先創建一個IPC的Queue(如下所示,全局的Queue ID是0)

  1. hchen@ubuntu:~$ ipcmk -Q  
  2. Message queue id: 0 
  3.  
  4. hchen@ubuntu:~$ ipcs -q 
  5. ------ Message Queues -------- 
  6. key        msqid      owner      perms      used-bytes   messages     
  7. 0xd0d56eb2 0          hchen      644        0            0 

如果我們運行沒有CLONE_NEWIPC的程序,我們會看到,在子進程中還是能看到這個全啟的IPC Queue。

  1. hchen@ubuntu:~$ sudo ./uts  
  2. Parent - start a container! 
  3. Container - inside the container! 
  4.  
  5. root@container:~# ipcs -q 
  6.  
  7. ------ Message Queues -------- 
  8. key        msqid      owner      perms      used-bytes   messages     
  9. 0xd0d56eb2 0          hchen      644        0            0 

但是,如果我們運行加上了CLONE_NEWIPC的程序,我們就會下面的結果:

  1. root@ubuntu:~$ sudo./ipc 
  2. Parent - start a container! 
  3. Container - inside the container! 
  4.  
  5. root@container:~/linux_namespace# ipcs -q 
  6.  
  7. ------ Message Queues -------- 
  8. key        msqid      owner      perms      used-bytes   messages 

我們可以看到IPC已經被隔離了。

PID Namespace

我們繼續修改上面的程序:

  1. int container_main(void* arg) 
  2.     /* 查看子進程的PID,我們可以看到其輸出子進程的 pid 為 1 */ 
  3.     printf("Container [%5d] - inside the container!\n", getpid()); 
  4.     sethostname("container",10); 
  5.     execv(container_args[0], container_args); 
  6.     printf("Something's wrong!\n"); 
  7.     return 1; 
  8.  
  9. int main() 
  10.     printf("Parent [%5d] - start a container!\n", getpid()); 
  11.     /*啟用PID namespace - CLONE_NEWPID*/ 
  12.     int container_pid = clone(container_main, container_stack+STACK_SIZE,  
  13.             CLONE_NEWUTS | CLONE_NEWPID | SIGCHLD, NULL);  
  14.     waitpid(container_pid, NULL, 0); 
  15.     printf("Parent - container stopped!\n"); 
  16.     return 0; 

運行結果如下(我們可以看到,子進程的pid是1了):

  1. hchen@ubuntu:~$ sudo ./pid 
  2. Parent [ 3474] - start a container! 
  3. Container [    1] - inside the container! 
  4. root@container:~# echo $$ 

你可能會問,PID為1有個毛用啊?我們知道,在傳統的UNIX系統中,PID為1的進程是init,地位非常特殊。他作為所有進程的父進程,有很多特權(比如:屏蔽信號等),另外,其還會為檢查所有進程的狀態,我們知道,如果某個子進程脫離了父進程(父進程沒有wait它),那么init就會負責回收資源并結束這個子進程。所以,要做到進程空間的隔離,首先要創建出PID為1的進程,最好就像chroot那樣,把子進程的PID在容器內變成1。

但是,我們會發現,在子進程的shell里輸入ps,top等命令,我們還是可以看得到所有進程。說明并沒有完全隔離。這是因為,像ps, top這些命令會去讀/proc文件系統,所以,因為/proc文件系統在父進程和子進程都是一樣的,所以這些命令顯示的東西都是一樣的。

所以,我們還需要對文件系統進行隔離。

Mount Namespace

下面的例程中,我們在啟用了mount namespace并在子進程中重新mount了/proc文件系統。

  1. int container_main(void* arg) 
  2.     printf("Container [%5d] - inside the container!\n", getpid()); 
  3.     sethostname("container",10); 
  4.     /* 重新mount proc文件系統到 /proc下 */ 
  5.     system("mount -t proc proc /proc"); 
  6.     execv(container_args[0], container_args); 
  7.     printf("Something's wrong!\n"); 
  8.     return 1; 
  9.  
  10. int main() 
  11.     printf("Parent [%5d] - start a container!\n", getpid()); 
  12.     /* 啟用Mount Namespace - 增加CLONE_NEWNS參數 */ 
  13.     int container_pid = clone(container_main, container_stack+STACK_SIZE,  
  14.             CLONE_NEWUTS | CLONE_NEWPID | CLONE_NEWNS | SIGCHLD, NULL); 
  15.     waitpid(container_pid, NULL, 0); 
  16.     printf("Parent - container stopped!\n"); 
  17.     return 0; 

運行結果如下:

  1. hchen@ubuntu:~$ sudo ./pid.mnt 
  2. Parent [ 3502] - start a container! 
  3. Container [    1] - inside the container! 
  4. root@container:~# ps -elf  
  5. F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD 
  6. 4 S root         1     0  0  80   0 -  6917 wait   19:55 pts/2    00:00:00 /bin/bash 
  7. 0 R root        14     1  0  80   0 -  5671 -      19:56 pts/2    00:00:00 ps -elf 

上面,我們可以看到只有兩個進程 ,而且pid=1的進程是我們的/bin/bash。我們還可以看到/proc目錄下也干凈了很多:

  1. root@container:~# ls /proc 
  2. 1          dma          key-users   net            sysvipc 
  3. 16         driver       kmsg        pagetypeinfo   timer_list 
  4. acpi       execdomains  kpagecount  partitions     timer_stats 
  5. asound     fb           kpageflags  sched_debug    tty 
  6. buddyinfo  filesystems  loadavg     schedstat      uptime 
  7. bus        fs           locks       scsi           version 
  8. cgroups    interrupts   mdstat      self           version_signature 
  9. cmdline    iomem        meminfo     slabinfo       vmallocinfo 
  10. consoles   ioports      misc        softirqs       vmstat 
  11. cpuinfo    irq          modules     stat           zoneinfo 
  12. crypto     kallsyms     mounts      swaps 
  13. devices    kcore        mpt         sys 
  14. diskstats  keys         mtrr        sysrq-trigger 

下圖,我們也可以看到在子進程中的top命令只看得到兩個進程了。

 

 

這里,多說一下。在通過CLONE_NEWNS創建mount namespace后,父進程會把自己的文件結構復制給子進程中。而子進程中新的namespace中的所有mount操作都只影響自身的文件系統,而不對外界產生任何影響。這樣可以做到比較嚴格地隔離。

你可能會問,我們是不是還有別的一些文件系統也需要這樣mount? 是的。

Docker的 Mount Namespace

下面我將向演示一個“山寨鏡像”,其模仿了Docker的Mount Namespace。

首先,我們需要一個rootfs,也就是我們需要把我們要做的鏡像中的那些命令什么的copy到一個rootfs的目錄下,我們模仿Linux構建如下的目錄:

  1. hchen@ubuntu:~/rootfs$ ls 
  2. bin  dev  etc  home  lib  lib64  mnt  opt  proc  root  run  sbin  sys  tmp  usr  var 

然后,我們把一些我們需要的命令copy到 rootfs/bin目錄中(sh命令必需要copy進去,不然我們無法 chroot )

  1. hchen@ubuntu:~/rootfs$ ls ./bin ./usr/bin 
  2.   
  3. ./bin: 
  4. bash   chown  gzip      less  mount       netstat  rm     tabs  tee      top       tty 
  5. cat    cp     hostname  ln    mountpoint  ping     sed    tac   test     touch     umount 
  6. chgrp  echo   ip        ls    mv          ps       sh     tail  timeout  tr        uname 
  7. chmod  grep   kill      more  nc          pwd      sleep  tar   toe      truncate  which 
  8.  
  9. ./usr/bin: 
  10. awk  env  groups  head  id  mesg  sort  strace  tail  top  uniq  vi  wc  xargs 

注:你可以使用ldd命令把這些命令相關的那些so文件copy到對應的目錄:

  1. hchen@ubuntu:~/rootfs/bin$ ldd bash 
  2.     linux-vdso.so.1 =>  (0x00007fffd33fc000) 
  3.     libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f4bd42c2000) 
  4.     libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f4bd40be000) 
  5.     libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4bd3cf8000) 
  6.     /lib64/ld-linux-x86-64.so.2 (0x00007f4bd4504000) 

下面是我的rootfs中的一些so文件:

  1. hchen@ubuntu:~/rootfs$ ls ./lib64 ./lib/x86_64-linux-gnu/ 
  2.  
  3. ./lib64: 
  4. ld-linux-x86-64.so.2 
  5.  
  6. ./lib/x86_64-linux-gnu/: 
  7. libacl.so.1      libmemusage.so         libnss_files-2.19.so    libpython3.4m.so.1 
  8. libacl.so.1.1.0  libmount.so.1          libnss_files.so.2       libpython3.4m.so.1.0 
  9. libattr.so.1     libmount.so.1.1.0      libnss_hesiod-2.19.so   libresolv-2.19.so 
  10. libblkid.so.1    libm.so.6              libnss_hesiod.so.2      libresolv.so.2 
  11. libc-2.19.so     libncurses.so.5        libnss_nis-2.19.so      libselinux.so.1 
  12. libcap.a         libncurses.so.5.9      libnss_nisplus-2.19.so  libtinfo.so.5 
  13. libcap.so        libncursesw.so.5       libnss_nisplus.so.2     libtinfo.so.5.9 
  14. libcap.so.2      libncursesw.so.5.9     libnss_nis.so.2         libutil-2.19.so 
  15. libcap.so.2.24   libnsl-2.19.so         libpcre.so.3            libutil.so.1 
  16. libc.so.6        libnsl.so.1            libprocps.so.3          libuuid.so.1 
  17. libdl-2.19.so    libnss_compat-2.19.so  libpthread-2.19.so      libz.so.1 
  18. libdl.so.2       libnss_compat.so.2     libpthread.so.0 
  19. libgpm.so.2      libnss_dns-2.19.so     libpython2.7.so.1 
  20. libm-2.19.so     libnss_dns.so.2        libpython2.7.so.1.0 

包括這些命令依賴的一些配置文件:

  1. hchen@ubuntu:~/rootfs$ ls ./etc 
  2. bash.bashrc  group  hostname  hosts  ld.so.cache  nsswitch.conf  passwd  profile   
  3. resolv.conf  shadow 

你現在會說,我靠,有些配置我希望是在容器起動時給他設置的,而不是hard code在鏡像中的。比如:/etc/hosts,/etc/hostname,還有DNS的/etc/resolv.conf文件。好的。那我們在rootfs外面,我們再創建一個conf目錄,把這些文件放到這個目錄中。

  1. hchen@ubuntu:~$ ls ./conf 
  2. hostname     hosts     resolv.conf 

這樣,我們的父進程就可以動態地設置容器需要的這些文件的配置, 然后再把他們mount進容器,這樣,容器的鏡像中的配置就比較靈活了。

好了,終于到了我們的程序。

  1. #define _GNU_SOURCE 
  2. #include <sys/types.h> 
  3. #include <sys/wait.h> 
  4. #include <sys/mount.h> 
  5. #include <stdio.h> 
  6. #include <sched.h> 
  7. #include <signal.h> 
  8. #include <unistd.h> 
  9.  
  10. #define STACK_SIZE (1024 * 1024) 
  11.  
  12. static char container_stack[STACK_SIZE]; 
  13. char* const container_args[] = { 
  14.     "/bin/bash", 
  15.     "-l", 
  16.     NULL 
  17. }; 
  18.  
  19. int container_main(void* arg) 
  20.     printf("Container [%5d] - inside the container!\n", getpid()); 
  21.  
  22.     //set hostname 
  23.     sethostname("container",10); 
  24.  
  25.     //remount "/proc" to make sure the "top" and "ps" show container's information 
  26.     if (mount("proc", "rootfs/proc", "proc", 0, NULL) !=0 ) { 
  27.         perror("proc"); 
  28.     } 
  29.     if (mount("sysfs", "rootfs/sys", "sysfs", 0, NULL)!=0) { 
  30.         perror("sys"); 
  31.     } 
  32.     if (mount("none", "rootfs/tmp", "tmpfs", 0, NULL)!=0) { 
  33.         perror("tmp"); 
  34.     } 
  35.     if (mount("udev", "rootfs/dev", "devtmpfs", 0, NULL)!=0) { 
  36.         perror("dev"); 
  37.     } 
  38.     if (mount("devpts", "rootfs/dev/pts", "devpts", 0, NULL)!=0) { 
  39.         perror("dev/pts"); 
  40.     } 
  41.     if (mount("shm", "rootfs/dev/shm", "tmpfs", 0, NULL)!=0) { 
  42.         perror("dev/shm"); 
  43.     } 
  44.     if (mount("tmpfs", "rootfs/run", "tmpfs", 0, NULL)!=0) { 
  45.         perror("run"); 
  46.     } 
  47.     /*  
  48.      * 模仿Docker的從外向容器里mount相關的配置文件  
  49.      * 你可以查看:/var/lib/docker/containers/<container_id>/目錄, 
  50.      * 你會看到docker的這些文件的。 
  51.      */ 
  52.     if (mount("conf/hosts", "rootfs/etc/hosts", "none", MS_BIND, NULL)!=0 || 
  53.           mount("conf/hostname", "rootfs/etc/hostname", "none", MS_BIND, NULL)!=0 || 
  54.           mount("conf/resolv.conf", "rootfs/etc/resolv.conf", "none", MS_BIND, NULL)!=0 ) { 
  55.         perror("conf"); 
  56.     } 
  57.     /* 模仿docker run命令中的 -v, --volume=[] 參數干的事 */ 
  58.     if (mount("/tmp/t1", "rootfs/mnt", "none", MS_BIND, NULL)!=0) { 
  59.         perror("mnt"); 
  60.     } 
  61.  
  62.     /* chroot 隔離目錄 */ 
  63.     if ( chdir("./rootfs") != 0 || chroot("./") != 0 ){ 
  64.         perror("chdir/chroot"); 
  65.     } 
  66.  
  67.     execv(container_args[0], container_args); 
  68.     perror("exec"); 
  69.     printf("Something's wrong!\n"); 
  70.     return 1; 
  71.  
  72. int main() 
  73.     printf("Parent [%5d] - start a container!\n", getpid()); 
  74.     int container_pid = clone(container_main, container_stack+STACK_SIZE,  
  75.             CLONE_NEWUTS | CLONE_NEWIPC | CLONE_NEWPID | CLONE_NEWNS | SIGCHLD, NULL); 
  76.     waitpid(container_pid, NULL, 0); 
  77.     printf("Parent - container stopped!\n"); 
  78.     return 0; 

sudo運行上面的程序,你會看到下面的掛載信息以及一個所謂的“鏡像”:

  1. hchen@ubuntu:~$ sudo ./mount  
  2. Parent [ 4517] - start a container! 
  3. Container [    1] - inside the container! 
  4. root@container:/# mount 
  5. proc on /proc type proc (rw,relatime) 
  6. sysfs on /sys type sysfs (rw,relatime) 
  7. none on /tmp type tmpfs (rw,relatime) 
  8. udev on /dev type devtmpfs (rw,relatime,size=493976k,nr_inodes=123494,mode=755
  9. devpts on /dev/pts type devpts (rw,relatime,mode=600,ptmxmode=000
  10. tmpfs on /run type tmpfs (rw,relatime) 
  11. /dev/disk/by-uuid/18086e3b-d805-4515-9e91-7efb2fe5c0e2 on /etc/hosts type ext4 (rw,relatime,errors=remount-ro,data=ordered
  12. /dev/disk/by-uuid/18086e3b-d805-4515-9e91-7efb2fe5c0e2 on /etc/hostname type ext4 (rw,relatime,errors=remount-ro,data=ordered
  13. /dev/disk/by-uuid/18086e3b-d805-4515-9e91-7efb2fe5c0e2 on /etc/resolv.conf type ext4 (rw,relatime,errors=remount-ro,data=ordered
  14.  
  15. root@container:/# ls /bin /usr/bin 
  16. /bin: 
  17. bash   chmod  echo  hostname  less  more    mv   ping  rm   sleep  tail  test     top    truncate  uname 
  18. cat    chown  grep  ip        ln    mount   nc   ps    sed  tabs   tar   timeout  touch  tty       which 
  19. chgrp  cp     gzip  kill      ls    mountpoint  netstat  pwd   sh   tac    tee   toe      tr     umount 
  20.  
  21. /usr/bin: 
  22. awk  env  groups  head  id  mesg  sort  strace  tail  top  uniq  vi  wc  xargs 

關于如何做一個chroot的目錄,這里有個工具叫DebootstrapChroot,你可以順著鏈接去看看(英文的哦)

接下來的事情,你可以自己玩了,我相信你的想像力 。:)

今天的內容就介紹到這里,在Docker 基礎技術:Linux Namespace(下篇)中,我將向你介紹User Namespace、Network Namespace以及Namespace的其它東西。

責任編輯:趙寧寧 來源: H2EX
相關推薦

2016-09-20 22:04:55

Docker Linux Names

2021-07-10 08:29:13

Docker內核Namespace

2021-07-14 10:33:22

Docker內核Mount Names

2022-08-04 07:25:22

Docker部署項目

2012-03-18 21:41:40

linux虛擬化

2023-11-09 16:13:53

2018-02-26 08:14:20

LinuxDocker容器

2013-10-30 11:27:25

Linux基礎網絡設備

2015-08-26 11:27:26

DockerDeviceMappe分層鏡像

2018-06-03 09:26:58

云計算數據技術層

2014-05-07 10:04:57

DockerLinux容器Ubuntu

2014-05-07 09:56:48

Docker管理Linux容器

2022-10-30 15:00:50

2014-09-18 14:13:54

Docker

2021-03-05 18:36:00

Linux網橋Docker

2022-08-30 19:11:12

Docker虛擬化技術

2014-07-07 09:49:13

UbuntuDocker

2021-01-09 09:20:08

Linux發行版Docker

2016-10-28 22:22:35

nodenode.jsdocker

2009-12-25 10:05:00

Linux虛擬化Xen虛擬化
點贊
收藏

51CTO技術棧公眾號

国产日本欧美一区二区| 在线日韩欧美| 日韩一区二区视频| 欧美 国产 综合| av中文字幕在线| 国产真实乱子伦精品视频| 久久久噜噜噜久久| 夫妇露脸对白88av| 国产精品网在线观看| 欧美中文字幕一区二区三区亚洲| 国产欧美综合一区| 青青视频在线观| 精品一区二区在线视频| 97精品一区二区视频在线观看| 真实乱视频国产免费观看| 日韩精品一区二区三区免费视频| 日韩欧美国产免费播放| 国产又爽又黄ai换脸| 日本人妖在线| 成人午夜av电影| 国产精品入口免费视| 久久午夜无码鲁丝片午夜精品| 精品少妇av| 亚洲国产精品国自产拍av秋霞| 手机看片一级片| 中国字幕a在线看韩国电影| 亚洲激情成人在线| 亚洲欧美综合一区| 欧美高清电影在线| 成人不卡免费av| 91久久极品少妇xxxxⅹ软件| 亚洲一级特黄毛片| 日韩不卡一二三区| 97成人精品区在线播放| 久久久久久久九九九九| 国产高清一区| 中文字幕欧美日韩在线| 国产色视频一区二区三区qq号| 国产精品99久久免费观看| 91精品久久久久久久91蜜桃| 五月婷婷六月合| 欧美成人精品三级网站| 欧美日韩国产丝袜另类| 日本手机在线视频| 好看的中文字幕在线播放| 国产精品久久久久久久久动漫 | 国产乱码在线观看| 性欧美长视频| 欧美中文在线字幕| 久久国产视频精品| 性8sex亚洲区入口| 日韩av大片免费看| 成年人视频免费| 日av在线不卡| 国产欧美一区二区三区四区| 一区二区自拍偷拍| 国产在线不卡一区| 91成人免费视频| www.五月天激情| 成人综合婷婷国产精品久久免费| 99热最新在线| 男人天堂综合网| 波多野结衣一区二区三区| 国产一区精品视频| 天堂影院在线| 国产欧美日韩中文久久| 日韩亚洲一区在线播放| 日本中文字幕伦在线观看| 国产精品色婷婷久久58| 强开小嫩苞一区二区三区网站| 91亚洲天堂| 亚洲国产日韩一区二区| 伊人成色综合网| 91看片一区| 欧美一区二区精品久久911| 国产香蕉精品视频| 外国成人在线视频| 综合久久五月天| 欧美丰满艳妇bbwbbw| 99国产精品私拍| 国产精品久久久久7777婷婷| 国产美女明星三级做爰| 成人性色生活片| 日韩在线第一区| av网站大全在线| 黑人巨大精品欧美一区二区一视频| 国产在线青青草| 亚洲狼人在线| 亚洲成av人片在线观看香蕉| 91网站免费视频| 欧美一区国产在线| 欧美中文在线视频| 国产高清免费av| 久久久久久久综合| av在线免费观看国产| 欧美18av| 亚洲精品在线一区二区| 国产综合精品久久久久成人av| 欧美在线高清| 国产精品www网站| 神宫寺奈绪一区二区三区| 欧美韩国一区二区| 超碰人人爱人人| 在线成人视屏| 亚洲精品国产电影| jizz亚洲少妇| 日韩电影免费一区| 精品视频一区二区三区四区| 麻豆传媒视频在线观看免费| 精品久久久久久国产| 91欧美视频在线| 香蕉久久夜色精品国产使用方法| 成人444kkkk在线观看| 国产黄网在线观看| av在线播放不卡| 男女h黄动漫啪啪无遮挡软件| 欧美特大特白屁股xxxx| 精品日韩欧美在线| 久久精品亚洲a| 日产欧产美韩系列久久99| 国产一区二区精品免费| 国产一二区在线| 欧美日韩国产美| 白白色免费视频| 国产一区二区你懂的| 成人看片视频| 最近中文字幕免费mv2018在线| 91福利在线观看| 亚洲av综合一区二区| 日韩午夜av| 国产伦精品一区二区| 大地资源网3页在线观看| 精品视频在线免费| 国产伦精品一区二区三区视频女| 国产日韩欧美一区在线| 国产精品免费在线播放| 少女频道在线观看高清 | 女人18毛片一区二区三区| 亚洲欧美日韩精品久久久久| 天天色天天综合网| 99视频精品全国免费| 国产剧情日韩欧美| av天在线观看| 欧美日韩国产天堂| 国产精品久久久免费看| 久久99久久99| 欧美aaa在线观看| av日韩久久| 欧美成人免费全部| 亚洲AV无码一区二区三区性| 亚洲美女少妇撒尿| 午夜福利三级理论电影| 亚洲茄子视频| 免费国产一区| 日韩av免费| 色午夜这里只有精品| 国产精品人妻一区二区三区| 亚洲色图19p| 香蕉视频1024| 国产日韩欧美三区| 午夜老司机精品| 天堂综合在线播放| 欧美精品性视频| 日韩一级免费毛片| 欧美午夜影院在线视频| 亚洲av熟女国产一区二区性色| 免费人成在线不卡| 欧美大片免费播放| 国产美女撒尿一区二区| 日韩av电影中文字幕| 在线免费av网站| 日韩免费高清视频| wwwwww国产| 国产精品久久精品日日| 人妻体体内射精一区二区| 尤物精品在线| 人禽交欧美网站免费| 国产精品一区二区美女视频免费看 | 99自拍视频在线观看| 精品国产乱码久久久久久1区2区| 综合激情网五月| 国产精品不卡在线| 黑森林av导航| 蜜臀99久久精品久久久久久软件| 久久久久久久久网| 亚洲va久久| 亚洲综合国产精品| 中文在线免费二区三区| 久久激情视频久久| 欧美国产专区| 91精品国产乱码久久久久久蜜臀| 日韩精品一二| 欧美精品乱码久久久久久按摩| 欧美精品久久久久性色| 97超碰欧美中文字幕| 中文字幕一区二区三区四区在线视频| 亚洲午夜精品一区二区国产| 精品视频高清无人区区二区三区| 999精品嫩草久久久久久99| 78色国产精品| 黄色av电影在线播放| 精品视频在线播放免| 国产叼嘿视频在线观看| 色噜噜夜夜夜综合网| 欧美人与禽zozzo禽性配| 国产日产欧美一区| 污污内射在线观看一区二区少妇| 精品在线观看免费| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 婷婷综合视频| 日韩欧美视频第二区| 哺乳挤奶一区二区三区免费看| 国产精品视频一区二区高潮| 成人观看网址| 久久99视频精品| 美女隐私在线观看| 国产一区二区三区日韩欧美| 手机av在线免费观看| 日韩久久免费av| 国产精品欧美综合亚洲| 欧美日韩一区二区三区免费看 | 二区在线视频| 精品中文视频在线| 污污视频在线免费看| 日韩精品一区二区三区三区免费| 亚洲天堂男人网| 欧美专区日韩专区| 夜夜爽妓女8888视频免费观看| 五月婷婷综合网| 国产亚洲成人av| 尤物视频一区二区| 亚洲一级生活片| 亚洲丝袜美腿综合| 免费精品在线视频| 中文字幕佐山爱一区二区免费| jizz18女人高潮| 中文成人av在线| 国产aaaaaaaaa| 国产精品你懂的在线| 亚洲精品国产精品国自| 日本一区二区三区四区 | 亚洲国产精品久久久久爰性色| 欧美丰满嫩嫩电影| 国产三级精品在线观看| 69av一区二区三区| 精品国产无码一区二区三区| 欧美一区二区精品| 亚洲奶汁xxxx哺乳期| 欧美精品一区二区蜜臀亚洲| 免费观看成年人视频| 亚洲福利精品在线| 日本免费不卡| 在线观看不卡av| 欧美激情黑人| 九九九久久国产免费| 波多野结衣精品| 91大神在线播放精品| 神马久久资源| 国产欧美日韩最新| 88久久精品| 欧美xxxx黑人又粗又长精品| 精品国产一区一区二区三亚瑟| 中文字幕日韩一区二区三区不卡| 五月精品视频| 国产精品专区在线| 日韩成人精品在线观看| 日本中文字幕观看| 成人在线综合网| 精品人妻互换一区二区三区| 国产精品视频观看| 毛片aaaaa| 欧美日韩视频在线| 中文字幕精品在线观看| 日韩一区二区三区免费观看| av女名字大全列表| 中文字幕日韩欧美在线| 女同视频在线观看| 国产91精品高潮白浆喷水| 成人精品高清在线视频| y111111国产精品久久婷婷| 久久av导航| 9191国产视频| 久久福利毛片| 久久久国产精品久久久| 久久精品一区蜜桃臀影院| 免费国产羞羞网站美图| 欧美午夜片在线免费观看| 97超视频在线观看| 国产视频久久久久久久| 国产成人无吗| 欧美一级片免费在线| 精品国产美女a久久9999| 国产精品免费看一区二区三区| 欧洲激情视频| 国产精品又粗又长| 激情丁香综合五月| www.自拍偷拍| 亚洲激情校园春色| 成人免费一级片| 亚洲成av人乱码色午夜| 日本激情视频在线观看| 欧洲亚洲妇女av| 亚洲欧洲国产精品一区| 亚洲欧美国产不卡| 蜜桃av一区| 国产白袜脚足j棉袜在线观看| 国产精品二区一区二区aⅴ污介绍| 久久狠狠高潮亚洲精品| 日韩欧美一区二区三区在线| 五月婷婷在线观看| 欧美在线性爱视频| 波多野结衣一区二区三区免费视频| 亚洲日本无吗高清不卡| 免费日韩av片| 中国一级特黄录像播放| 一区二区三区国产豹纹内裤在线| 中文字幕免费播放| 亚洲欧美中文字幕| av在线最新| 国产伦理久久久| 欧美一区久久| 亚欧美一区二区三区| 国产精品日韩精品欧美在线| 亚洲av无码精品一区二区| 日韩国产精品视频| 黄色激情在线播放| 国产高清精品一区二区| 欧美黄色大片网站| 日批视频在线看| 亚洲精品五月天| 国产女人18毛片18精品| 久久精品视频在线播放| 人人精品久久| 一区二区三区四区不卡| 国产精品久久久乱弄| 国产免费视频传媒| xnxx国产精品| 依依成人综合网| 精品无人国产偷自产在线| 国产网站在线| 国产久一道中文一区| 黑人一区二区| 亚洲一区二区三区黄色| 亚洲午夜久久久久久久久电影院 | 日本一区二区久久精品| 久久xxxx| 欧美自拍偷拍网| 欧美日韩第一区日日骚| 韩国中文字幕在线| 亚洲最大福利网站| 欧美日本亚洲韩国国产| 免费不卡的av| 欧美日韩在线免费| 国产中文在线视频| 国产精品中文字幕在线观看| 日韩电影在线视频| 先锋资源在线视频| 亚洲成年人影院| 日本在线一二三| 国产精品视频99| 羞羞答答成人影院www| 国产精品99久久久精品无码| 亚洲国产精品麻豆| 日本又骚又刺激的视频在线观看| 国产精品视频永久免费播放| 国产精品99一区二区三| 亚洲av熟女高潮一区二区| 色悠悠久久综合| 欧美a免费在线| 国产精品国产三级国产专区53 | 少妇搡bbbb搡bbb搡打电话| 欧美日韩另类字幕中文| av大片在线观看| 亚洲综合在线中文字幕| 亚洲免费一区二区| 五月天免费网站| 亚洲成人免费在线视频| 欧美日韩不卡| 无码人妻精品一区二区蜜桃网站| 91蜜桃视频在线| 国产又粗又猛又黄又爽| 国内精品一区二区三区| 日韩一级毛片| 朝桐光av一区二区三区| 欧美三区免费完整视频在线观看| 在线免费av导航| 欧洲久久久久久| 国产精品一区二区久久不卡| 无码人妻丰满熟妇精品区| 欧美成人免费一级人片100| 台湾色综合娱乐中文网| 涩涩网站在线看| 日本国产一区二区| 欧美1—12sexvideos| 在线免费观看成人| 97久久精品人人做人人爽50路| 97国产精品久久久| 国产成人黄色av| 国产在线欧美| 日韩在线一卡二卡|