精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品96久久久久久又黄又硬 | av无码av天天av天天爽| 成年人视频免费在线播放| 91丨九色porny丨蝌蚪| 色偷偷亚洲男人天堂| 51自拍视频在线观看| 碰碰在线视频| 亚洲欧洲国产专区| 国产伦精品一区二区| 欧美精品入口蜜桃| 天堂精品久久久久| 色欧美乱欧美15图片| 影音先锋亚洲视频| 91久久精品无码一区二区| 欧美日韩国产在线一区| 精品久久99ma| 91极品尤物在线播放国产| 狂野欧美激情性xxxx欧美| 国产综合色视频| 5252色成人免费视频| 色欲人妻综合网| 欧美专区一区| 一级中文字幕一区二区| 国产91免费视频| 日本特黄一级片| xxxwww国产| 91禁在线观看| 久久国产精品99国产| 久久在线免费视频| 日韩一级视频在线观看| 美女100%一区| 亚洲图片欧美视频| 国内视频一区| 国产精品九九九九| 日韩二区三区在线观看| 91sa在线看| 国产奶水涨喷在线播放| 亚洲综合自拍| 亚洲第一天堂无码专区| 四虎成人在线播放| 欧美亚洲综合视频| 色香蕉成人二区免费| 国产精品久久久久9999爆乳| 三级无遮挡在线观看| 国产aⅴ综合色| 日韩av手机在线| 中文字幕在线字幕中文| 成人免费在线观看av| 日韩视频免费观看高清完整版 | 欧美一区二区三区免费在线看 | 国产亚洲依依| 日日夜夜免费精品视频| 精品国产一区二区在线| 色欲AV无码精品一区二区久久 | 久久99国产精品久久99果冻传媒| 国产成人涩涩涩视频在线观看| 日本久久高清视频| 日韩视频在线你懂得| 国风产精品一区二区| 欧美成人三区| 国产伦精品一区二区三区在线观看 | 午夜精品一区二区三区电影天堂| 成人短视频在线观看免费| 无码精品在线观看| 蜜桃视频一区二区| 国产精品网红直播| 91在线精品入口| 精一区二区三区| 欧美影院在线播放| 7799精品视频天天看| 国产精品一级| 欧美激情精品久久久久久大尺度| 久久久美女视频| 亚洲第一精品影视| 欧美一区二区三区四区在线| 亚洲高清毛片一区二区| 久久欧美肥婆一二区| 欧美大片欧美激情性色a∨久久| 国产精品久久久久久久av| 91久久偷偷做嫩草影院电| 欧美亚洲动漫精品| 国产97在线 | 亚洲| 国产免费不卡| 欧美日本在线观看| av在线天堂网| 免费欧美网站| 亚洲第一天堂av| 欧美 日韩 国产 成人 在线观看| 日本黄色精品| 色综合久久悠悠| 国产日产精品一区二区三区| 一区在线视频| 国产精品高潮呻吟久久av黑人| 中文字幕观看在线| 国产成人精品在线看| 精品国产免费一区二区三区| www.亚洲资源| 国产亚洲精品精华液| 亚洲欧美日韩另类精品一区二区三区 | 人狥杂交一区欧美二区| 欧美性猛交xxxx乱大交退制版 | 成av人片一区二区| 成人欧美视频在线| 青青免费在线视频| 91玉足脚交白嫩脚丫在线播放| 99久久综合狠狠综合久久止| 国产三级伦理片| 99国产精品一区| 久久精品日韩| 国内外激情在线| 亚洲人成影院在线观看| 免费高清在线观看免费| 国产精品18| 亚洲一区www| 久久草视频在线| 亚洲中字黄色| 成人国产一区二区| 五月婷婷在线观看| 色综合一个色综合| 五月天婷婷激情视频| 欧美日本三级| 亚洲精品国产精品乱码不99按摩| 殴美一级黄色片| 久久九九电影| 国产一区二区不卡视频| 巨骚激情综合| 亚洲va在线va天堂| 免费黄色特级片| 欧美91在线|欧美| 亚洲欧美日韩精品| 日韩av黄色片| 日本午夜一区二区| 久久大片网站| 好看的中文字幕在线播放| 91精品国产综合久久久蜜臀粉嫩 | 啪啪激情综合网| 九九热这里只有精品6| 国产精品黄色网| 免费观看30秒视频久久| 欧美精品欧美精品系列c| 黄色影院在线看| 色噜噜久久综合| 成年人在线观看av| 97精品97| 国产精品午夜视频| 国产高清一区在线观看| 色综合久久久久综合| 91aaa精品| 女仆av观看一区| 国内精品久久久久久中文字幕| 精品黑人一区二区三区在线观看 | 日韩精品伦理第一区| www.日韩| 日韩欧美色电影| 国产精品揄拍100视频| 国产欧美一级| 国产一区视频在线播放| 成年人在线视频| 欧美性大战xxxxx久久久| 欧美另类z0zx974| 日韩主播视频在线| 天堂一区二区三区| 天天综合在线观看| 不卡伊人av在线播放| 国偷自拍第113页| 不卡在线观看av| 一区二区三区在线视频看| 丰满的护士2在线观看高清| 欧美中文一区二区三区| 国产香蕉一区二区三区| 日韩精品一区二区三区| 国产一区二区三区精品久久久| 黄色一级视频免费看| 国产午夜精品一区二区三区视频| www.日本xxxx| 91精品国产视频| 成人高清在线观看| 欧美freesex黑人又粗又大| 欧美精品在线观看一区二区| 亚洲av片不卡无码久久| 蜜桃av一区| 亚洲精品成人a8198a| 国产精品一区免费在线| 久久久亚洲影院你懂的| 嫩草在线播放| 婷婷一区二区三区| 无码少妇一区二区| 久久久久久穴| 亚洲欧洲精品在线 | 日产精品久久久久久久性色| 欧美最猛性xxxxx直播| 久久高清内射无套| 精品在线观看视频| 日本福利视频一区| 精品国产一区一区二区三亚瑟| 88国产精品欧美一区二区三区| 黄色小视频在线免费观看| 欧美日韩激情一区| 亚洲色图日韩精品| 成人高清视频在线| 成品人视频ww入口| 日韩激情免费| 99在线影院| 欧美hdxxxx| 国产一区二区久久精品| 亚洲精品喷潮一区二区三区| 亚洲综合在线第一页| 欧美另类z0zx974| 麻豆精品视频在线观看视频| 欧美乱大交xxxxx潮喷l头像| 你懂得在线观看| 亚洲免费福利一区| 91久久精品国产| 1区2区3区在线观看| 精品嫩草影院久久| 国产又黄又粗又硬| 日韩欧美黄色动漫| 久久久99精品| 国产精品麻豆网站| 国产传媒第一页| 国产成人精品午夜视频免费| www成人免费| 欧美韩日高清| 欧美久久久久久一卡四| swag国产精品一区二区| 国产精品入口夜色视频大尺度| 9i精品一二三区| 91精品啪在线观看国产60岁| 欧美爱爱小视频| 国产精品久久久久aaaa樱花| 国产精品福利导航| 久久不射2019中文字幕| 日本一区免费在线观看| 免费精品一区| 亚洲www永久成人夜色| 国产成人福利夜色影视| 久久99久久99精品免观看粉嫩| 不卡在线视频| 亚洲午夜激情免费视频| 天天色天天操天天射| 欧美成人一区二区三区| 久久亚洲精品国产| 亚洲综合激情网| 久一区二区三区| 亚洲国产中文字幕在线视频综合| 亚洲一区二区三区综合| 日韩电影免费在线| 99精品一区二区三区的区别| 粉嫩一区二区三区四区公司1| 国产精品一区二区三区久久久| 欧美日韩视频网站| 九九九久久久久久| 高h视频在线观看| 精品国产一区二区三区av性色| 免费黄色网址在线| 亚洲va欧美va人人爽| 日本最新中文字幕| 国产91精品一区二区麻豆网站| 中文字幕第100页| 每日更新成人在线视频| 啊啊啊一区二区| 欧美一级专区| 99精品视频在线看| 日韩中文字幕亚洲一区二区va在线| 日本精品www| 日韩高清不卡一区| 日本中文字幕观看| 国产成人精品一区二区三区四区| 精品久久久久久无码人妻| a√资源在线| 欧美三级中文字幕| 国产精品伦一区二区三区| 日韩一级高清毛片| 欧美综合视频在线| 亚洲人成毛片在线播放| 1024视频在线| 久久久久久久爱| 欧美日韩123区| 国产在线视频91| 深夜激情久久| 欧美日韩精品久久久免费观看| 日韩电影免费网站| 黄色三级中文字幕| 久久亚洲不卡| 久久出品必属精品| www.66久久| 黄大色黄女片18免费| 一区二区三区资源| 国产成人无码av| 91精品国产色综合久久不卡蜜臀 | 色香欲www7777综合网| 国产日产欧美a一级在线| 高清日韩中文字幕| 亚洲国产欧美不卡在线观看| 欧美激情1区2区| 日韩中文字幕二区| 国产精品2024| 少妇av片在线观看| 亚洲一区二区三区四区五区中文 | 精一区二区三区| 成人免费无码大片a毛片| 国产精品萝li| 日韩精品无码一区二区| 欧美日韩精品免费观看视频| 熟妇人妻一区二区三区四区 | 日韩欧美第二区在线观看| 欧美日韩18| xxxx一级片| 91免费观看视频| 国产精品a久久久久久| www在线视频| 日韩av免费一区| 91综合精品国产丝袜长腿久久| 日韩和欧美的一区二区| 亚洲一级影院| 国产又黄又猛的视频| 91碰在线视频| 久久久久香蕉视频| 欧美一区二区三区日韩视频| 免费在线观看污视频| 久久久久国产精品www| 亚洲热av色在线播放| 日韩国产精品一区二区| 99精品视频网| 久久精品aⅴ无码中文字字幕重口| 国产精品国产自产拍高清av| 天堂а√在线中文在线新版| 日韩精品一区二区三区四区视频| 欧美极品视频| 国产精品专区一| 国产精品一在线观看| 亚洲中文字幕无码专区| 国产成人精品网址| 久久久久97国产| 欧美一区二区三区影视| 老司机免费在线视频| 国产一区红桃视频| 日韩在线观看| 日韩精品视频一二三| 久久精品免视看| 精品成人无码久久久久久| 精品视频在线播放免| av成人 com a| 国产有色视频色综合| 亚洲区一区二| 国产日韩视频一区| 午夜精品视频在线观看| 日本xxxxwww| 午夜精品在线视频| 另类尿喷潮videofree| 日韩欧美视频网站| 99re热这里只有精品视频| 日本网站免费观看| 亚洲二区在线播放视频| av中文资源在线资源免费观看| 国产日韩亚洲精品| 在线亚洲欧美| 丰满少妇一区二区| 91国偷自产一区二区使用方法| 男男激情在线| 国产精品视频成人| 亚洲精品电影| 亚洲一二三四五| 欧美香蕉大胸在线视频观看| 日本福利午夜视频在线| 国产成人短视频| 91欧美大片| 国产成人精品一区二区三区在线观看| 亚洲国产你懂的| 欧美日韩视频精品二区| 国产精品久久久久久久久久99| 日韩在线观看| 97精品人人妻人人| 中文字幕免费精品| 韩国精品一区二区三区六区色诱| 一区免费视频| 免费观看av网站| 精品视频资源站| 欧美家庭影院| 欧美日韩国产综合视频在线| 极品尤物av久久免费看| 青娱乐在线视频免费观看| 日韩成人在线网站| 嫩草伊人久久精品少妇av杨幂| 熟女熟妇伦久久影院毛片一区二区| 国产不卡视频在线观看| 日韩电影在线观看一区二区| 日韩亚洲国产中文字幕| 国产伦理久久久久久妇女| 六月激情综合网| 综合亚洲深深色噜噜狠狠网站| 成人久久精品人妻一区二区三区| 国产97在线视频| 久久综合成人| 欧美xxxxx精品| 欧美日韩一级大片网址| av资源在线看片| 一区二区三区四区视频在线| 成人精品免费看| 一区二区视频网|