欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網運營的一線實戰(zhàn)洞察。

Linux PID 0/1/2 深度解析:內核啟動與容器 PID 1

Linux PID 0/1/2 深度解析:內核啟動與容器 PID 1 Linux 上敲一條ps -ef第一列數(shù)字從 1 開始排2 是kthreadd緊接著ksoftirqd、kworker、migration一串帶方括號的內核線程再往后才是systemd、sshd、nginx這些熟面孔。不少人第一次認真盯著這份列表看心里都會冒出同一個疑問0 號進程跑哪兒去了內核源碼里明明有創(chuàng)建它的代碼為什么在進程列表里翻不到這個問題的答案其實就是整條 Linux 啟動過程最核心的一段鏈路。Linux 系統(tǒng)里進程與 PID 的對應關系是每個從業(yè)者的基本功而 PID 0、PID 1、PID 2 這三個特殊號段剛好把從內核第一條 C 指令到第一個用戶態(tài)程序的完整路徑串了起來。搞清楚它們的關系你就能回答一連串平時很容易被含糊帶過的問題為什么/proc/0不存在、為什么systemd一定是 1 號、為什么內核線程的父進程都是 2、容器里的 PID 1 又為什么跟宿主機的不一樣。這篇文章面向三類人剛接手 Linux 服務器、想補上底層認知的運維同學準備面試、被問過init 是怎么起來的的后端開發(fā)以及需要定制啟動流程、精簡系統(tǒng)鏡像的嵌入式工程師。下面按身份識別 → 源碼鏈路 → 動手驗證 → 故障排查 → 落地場景的順序展開每個環(huán)節(jié)我都會給出可以直接復制執(zhí)行的命令和關鍵源碼位置。1. 三個特殊 PID 的身份卡與職責邊界1.1 為什么 /proc 目錄里死活找不到 PID 0先說結論PID 0 不是一個可以被調度、被殺死、被觀察的常規(guī)進程它是內核為兩個用途預留的特殊編號。第一個用途是承載那份靜態(tài)定義的init_task結構體它位于內核源碼init/init_task.c長這樣struct task_struct init_task INIT_TASK(init_task); EXPORT_SYMBOL(init_task);這份結構體在編譯期就被塞進內核數(shù)據(jù)段沒有經過動態(tài)內存分配也沒有走正規(guī)的 PID 分配流程。正規(guī)的 PID 分配是alloc_pid()把新進程掛進init_pid_ns的 IDR 索引結構而init_task的 pid 字段直接被初始化為 0壓根沒進哈希表。/proc的目錄項是按 PID 命名空間里的哈希表生成的表里沒有它自然也就沒有/proc/0。同理find_task_by_vpid(0)返回空kill 0發(fā)的其實是給當前進程組而不是 0 號進程。第二個用途是每個 CPU 上的idle 線程。多核機器上每個邏輯核都得有一個沒事干時待著的執(zhí)行流用來在 CPU 空閑時執(zhí)行指令讓它進入低功耗狀態(tài)或者直接把核讓出去。這些 idle 線程在fork_idle()里創(chuàng)建pid 同樣被寫成 0命令名格式是swapper/NN 是 CPU 編號。提示top里那個id百分比列展示的就是 idle 線程在跑的時長占比但 idle 線程本身不會作為一個進程出現(xiàn)在top的進程列表里因為它沒有/proc目錄項采不到它的統(tǒng)計。這就解釋了一個常見的困惑有人用cat /proc/0/status報No such file or directory用ls /proc | sort -n | head發(fā)現(xiàn)最小的數(shù)字是 1然后就懷疑是不是自己環(huán)境被裁剪過。沒有任何正常的 Linux 都是這樣。想看 idle 線程的蹤跡去/proc/sched_debug或者top按1展開每核視圖能看到swapper名字掛在各個核下面。還有個小細節(jié)值得記住init_task同時也是內核進程鏈表的鏈表頭。內核里遍歷所有進程用的for_each_process()起點就是init_task因為那份結構體的tasks字段在鏈接時被初始化成一個自環(huán)。所以內核代碼里必須有一個 PID 0 存在哪怕它在用戶空間完全不可見——它是整個進程數(shù)據(jù)結構世界的地基。1.2 PID 1 與 PID 2 同源分流一次內核線程創(chuàng)建兩種人生rest_init()里有兩次關鍵的kernel_thread()調用前后腳創(chuàng)建了兩個進程它們分別拿到 PID 1 和 PID 2然后在極短的時間內走上完全不同的道路。拿到PID 1的那個進程函數(shù)入口是kernel_init。它最初也是一個徹頭徹尾的內核線程——沒有用戶態(tài)地址空間跑在內核棧上。但它接下來會做一件事通過run_init_process()去execve一個用戶空間的程序把整個進程的地址空間替換掉。execve不改變 PID于是 PID 1 從內核線程平滑過繼成了用戶態(tài)第一個進程。執(zhí)行完這步之后它就是你我熟悉的systemd或者sysvinit、OpenRC、s6視發(fā)行版而定。拿到PID 2的那個進程函數(shù)入口是kthreadd。它這輩子都不會執(zhí)行execve永遠留在內核態(tài)任務只有一個充當所有內核線程的生產車間。內核模塊、驅動、子系統(tǒng)需要后臺線程時不直接調用底層創(chuàng)建接口而是把請求塞進kthread_create_list鏈表喚醒kthreadd由它統(tǒng)一在create_kthread()里 fork 出新的內核線程。所以你會看到ksoftirqd/0、kworker/0:0、kswapd0、kblockd這些家伙的父進程全是 2。對比項PID 0PID 1PID 2內核符號init_task/fork_idlekernel_initkthreadd創(chuàng)建方式編譯期靜態(tài)定義 每核fork_idlekernel_thread/user_mode_threadkernel_thread父進程無PID 0PID 0是否進入用戶態(tài)否是通過execve否終身內核態(tài)/proc是否可見不可見可見可見調度優(yōu)先級最低純 idle普通普通典型命令名swapper/Nsystemd/initkthreadd這張表建議直接記住面試被問到PID 0 是什么的時候能一口氣把靜態(tài)定義和 idle 兩個身份都說出來基本就穩(wěn)了。很多人只知道第一個身份答完就卡住了。1.3 三者之間的父子與繼承關系到底怎么算從血緣上看PID 1 和 PID 2 的父進程都是 0。這不是嘴上說說內核里寫得明明白白——rest_init()里那段代碼是在start_kernel()的調用上下文里跑的而start_kernel()的執(zhí)行流最終會變成 idle 線程也就是 PID 0。換句話說先有 00 生了 1 和 2然后 0 退居幕后去當 idle。這個順序有個硬性要求必須先創(chuàng)建 PID 1再創(chuàng)建 PID 2。原因寫在內核注釋里——init 進程本身后續(xù)會需要創(chuàng)建內核線程如果先把它調度起來而kthreadd還沒就緒kthread_create()就會卡死。所以rest_init()里的寫法是創(chuàng)建kernel_init后立刻給它打上PF_NO_SETAFFINITY標志并綁到啟動核上創(chuàng)建kthreadd并記錄kthreadd_task指針最后用complete(kthreadd_done)通知kernel_init兄弟就位了你可以繼續(xù)了。你可以在自己的機器上直接驗證這層關系grep -E ^(Name|Pid|PPid) /proc/1/status grep -E ^(Name|Pid|PPid) /proc/2/status兩臺正常的機器上這兩條命令的PPid都會輸出 0。這是最直接的證據(jù)——用戶空間里唯一允許父進程是 0的進程就是這兩個。從繼承關系上看兩者分叉之后又各自開枝散葉。PID 1 是所有用戶態(tài)進程的祖先容器里的除外后面會講PID 2 是所有內核線程的祖先。你隨便挑一個內核線程看它的PPid基本都是 2除非它被顯式改過父進程。反過來除了 PID 1 和 PID 2任何進程的PPid都不可能是 0一旦你發(fā)現(xiàn)有第三個進程的父進程是 0那這臺機器就值得好好查一查了。2. 從內核第一條指令到第一個用戶進程的完整鏈路2.1 上電到 start_kernel 之間機器都干了些什么要理解 0/1/2 的誕生得先把鏡頭往前拉一點。按下電源之后CPU 從一個固定的物理地址開始取指跑的是主板固件傳統(tǒng) BIOS 或現(xiàn)在的 UEFI。固件做完自檢、枚舉設備、初始化內存控制器然后按啟動順序找到可引導設備把上面的引導加載程序絕大多數(shù)發(fā)行版用 GRUB2讀到內存里執(zhí)行。GRUB2 的工作分兩段。第一段很小塞在磁盤頭部作用是把自己更大的第二段加載進來。第二段讀配置文件把用戶選中的內核鏡像和配套的initramfs或initrd一起載入內存然后跳進內核入口。這一階段常被忽略的一件事是內核鏡像并不是裸的 ELF 可執(zhí)行文件它前面套了一層自解壓頭啟動時會先在臨時緩沖區(qū)里把壓縮過的內核decompress_kernel()展開屏幕上那行Decompressing Linux... Parsing ELF... done.就是它干的活。解壓完成后才跳到真正的start_kernel()。這個函數(shù)在init/main.c里是整個內核在架構無關層面上的總裝配線做的事包括設置啟動 CPU 狀態(tài)、解析架構相關的硬件信息、初始化內存管理、初始化中斷和時鐘、打開控制臺從這里開始printk才有輸出、初始化虛擬文件系統(tǒng)緩存、掛載最初的proc和sysfs骨架。所有這些跑完之后它做的最后一件事是調用rest_init()。這一刻進程號段 0、1、2 的分配正式拉開序幕。順帶提一句內核啟動參數(shù)的傳遞路徑GRUB 里linux那行后面跟的參數(shù)會被內核的unknown_bootoption()收集起來其中init、rdinit、initcall_debug、panic這些會被單獨識別并落到對應變量里。這就給后面定制啟動流程留了口子。2.2 rest_init 里的三段關鍵代碼決定了 0/1/2 的誕生順序rest_init()加注釋也就二三十行但每一段都值得逐句看。按現(xiàn)代 6.x 內核的寫法主干大致是這樣noinline void __ref __noreturn rest_init(void) { struct task_struct *tsk; int pid; rcu_scheduler_starting(); pid user_mode_thread(kernel_init, NULL, CLONE_FS); rcu_read_lock(); tsk find_task_by_pid_ns(pid, init_pid_ns); tsk-flags | PF_NO_SETAFFINITY; set_cpus_allowed_ptr(tsk, cpumask_of(smp_processor_id())); rcu_read_unlock(); numa_default_policy(); pid kernel_thread(kthreadd, NULL, NULL, CLONE_FS | CLONE_FILES); rcu_read_lock(); kthreadd_task find_task_by_pid_ns(pid, init_pid_ns); rcu_read_unlock(); system_state SYSTEM_SCHEDULING; complete(kthreadd_done); schedule_preempt_disabled(); cpu_startup_entry(CPUHP_ONLINE); }第一段創(chuàng)建kernel_init它拿到PID 1。注意這里用的是user_mode_thread較新內核引入早期版本就是kernel_thread差別在于前者會為新線程準備好一套能順利切到用戶態(tài)的上下文比如合適的信號處理和 TLS 狀態(tài)。緊接著的PF_NO_SETAFFINITY加set_cpus_allowed_ptr組合是把 init 死死釘在啟動 CPU 上——因為此時sched_init_smp()還沒跑跨核遷移的邏輯不可靠讓 init 亂跑會出問題。這是一個典型的啟動早期只能串行、不能并行的約束。第二段創(chuàng)建kthreadd它拿到PID 2。PID 號的分配是單調遞增的中間沒有任何其他alloc_pid()調用插隊所以 2 號這個位置非常穩(wěn)定。創(chuàng)建完立刻把返回的任務結構指針存到全局變量kthreadd_task里后面所有kthread_create()都是靠這個指針對著它發(fā)喚醒。第三段是收尾。system_state SYSTEM_SCHEDULING標記調度器可用complete(kthreadd_done)解開 PID 1 那邊的等待然后調用schedule_preempt_disabled()主動讓出一次 CPU。這次讓出的結果很關鍵當前執(zhí)行流從正在跑 start_kernel 的上下文正式降格為 idle 線程也就是 PID 0之后它進入cpu_startup_entry(CPUHP_ONLINE)在do_idle()里循環(huán)等待。所以整個過程用一句話概括start_kernel()親手創(chuàng)建了 1 號和 2 號然后自己變成了 0 號。0 號是父但它是最后一個確定身份的這個時間上的微妙之處是很多人理解錯的地方——他們會以為內核先有 0 再有 1實際上代碼順序是先 fork 出 1 和 2最后才落地成 0。注意fork_idle()給其他 CPU 創(chuàng)建 idle 線程是在kernel_init里通過smp_init()觸發(fā)的那已經是 1 號進程的工作了。也就是說0 號進程創(chuàng)建了 1 號1 號又為自己造了一堆兄弟 0 號這個循環(huán)關系挺有意思畫進程樹的時候會看到多個swapper/N。2.3 kernel_init 的長跑從內核線程到 execve 用戶程序PID 1 拿到號碼之后并不輕松它要干完一大堆初始化才能去執(zhí)行用戶程序。它在kernel_init()里做的第一件事是等wait_for_completion(kthreadd_done)確認 2 號就位。然后進入kernel_init_freeable()這是初始化工作的主戰(zhàn)場。這一大段里有幾個關鍵動作值得單拎出來smp_prepare_cpus()和smp_init()把其他 CPU 拉起來。每個核起來的過程中都會調fork_idle()造一個 idle 線程這就是swapper/1、swapper/2的來源。workqueue_init()初始化工作隊列。內核里大量異步任務靠工作隊列干活而工作隊列自己也是靠內核線程驅動的所以它得等kthreadd就緒才能跑。do_basic_setup()這里面會依次跑完各級initcall也就是驅動和子系統(tǒng)的初始化函數(shù)。你在dmesg里看到的網卡探測到磁盤識別到基本都是這一階段打出來的。打開/dev/console內核通過ksys_open(/dev/console, O_RDWR, 0)把標準輸入輸出接到控制臺然后用兩次ksys_dup(0)把 fd 1 和 fd 2 也指向它。這一步失敗會打一行Warning: unable to open an initial console.是個值得留意的排障線索。光有日志還不夠直接看代碼順序更直觀。下面是這個環(huán)節(jié)的骨架static noinline void __init kernel_init_freeable(void) { gfp_allowed_mask __GFP_BITS_MASK; set_mems_allowed(node_states[N_MEMORY]); smp_prepare_cpus(setup_max_cpus); workqueue_init(); do_pre_smp_initcalls(); smp_init(); sched_init_smp(); do_basic_setup(); if (ksys_open((const char __user *) /dev/console, O_RDWR, 0) 0) pr_err(Warning: unable to open an initial console.\n); (void) ksys_dup(0); (void) ksys_dup(0); if (!ramdisk_execute_command) ramdisk_execute_command /init; /* ... */ }初始化做完了kernel_init()就要去執(zhí)行用戶態(tài)程序了。它會按一個明確的優(yōu)先級順序嘗試一串路徑rdinit指定的程序默認是/initinit內核參數(shù)指定的程序/sbin/init/etc/init/bin/init/bin/sh只要其中一個能成功execvePID 1 就切換成了用戶態(tài)程序后面的全部跳過。如果全試一遍都失敗內核會打出一行非常經典的報錯然后 panicKernel panic - not syncing: No working init found. Try passing init option to kernel.這句幾乎每個做過嵌入式或者救援修復的人都見過。遇到它基本可以斷定根文件系統(tǒng)掛錯了、init 二進制被刪了、或者動態(tài)鏈接庫缺失導致execve返回ENOENT。一個小技巧是先用init/bin/sh啟動進去之后手工排查比對著黑屏猜要高效得多。這里有個細節(jié)容易被忽略run_init_process()內部調的是kernel_execve()是 exec 不是 fork。所以 PID 1 從內核線程變成用戶態(tài)進程的過程中號碼一直沒變。如果當初寫的是 fork 加 exec那用戶態(tài)的 init 就會是 3 號或者更大整個系統(tǒng)的進程號約定就亂了。2.4 initramfs 與 switch_rootPID 1 號碼為什么始終不變現(xiàn)在幾乎沒有發(fā)行版會直接從物理根文件系統(tǒng)啟動中間都夾了一層initramfs。原因是內核要知道怎么訪問真正的根設備得先有對應的驅動——比如 LVM、軟 RAID、磁盤加密、NVMe 控制器——而這些驅動往往以模塊形式存在模塊又躺在根文件系統(tǒng)上雞生蛋的問題就來了。initramfs就是用來打破這個死循環(huán)的它是一個由cpio打包、被內核解壓到rootfs一個tmpfs里的小型根文件系統(tǒng)包含必要的驅動模塊和一套腳本。所以真實流程是兩段第一段內核把initramfs解開掛到臨時的rootfs上PID 1 執(zhí)行里面的/init由dracut或initramfs-tools生成。這個/init是個 shell 腳本負責加載模塊、掃描磁盤、激活 LVM 和加密卷、找到真正的根設備并掛載到/sysroot之類的臨時掛載點最后執(zhí)行switch_root。第二段switch_root做的事情是把當前根目錄切換成新掛載的那個真實根文件系統(tǒng)刪掉舊的tmpfs內容騰出內存然后exec真實根上的 init 程序。同樣地這里也是 exec 而不是 fork所以 PID 1 從頭到尾沒有換過號碼。一個直接的驗證方式是看/proc/1/status里的Pid從 initramfs 階段到系統(tǒng)完全啟動這個數(shù)字一直是 1變的只是comm字段先是init后來變成systemd。如果你想看看實際的 initramfs 里都有什么可以這樣操作lsinitrd /boot/initramfs-$(uname -r).img | head -40 # RHEL/CentOS/Fedora lsinitramfs /boot/initrd.img-$(uname -r) | head -40 # Debian/Ubuntu手工解開一份出來讀/init腳本是理解啟動流程最快的路徑之一。我第一次這么干的時候才發(fā)現(xiàn)里面處理加密卷、處理多路徑設備的邏輯比想象中復雜得多也理解了不少啟動卡住的現(xiàn)場到底卡在哪個環(huán)節(jié)。3. 上手驗證把 PID 0/1/2 的痕跡一條條挖出來3.1 用 /proc 里的 PPid 字段反推父子關系理論講完接下來動手。/proc/pid/status里的PPid字段是驗證父子關系最直接的入口因為它是內核從任務結構里直接讀出來的沒法被用戶態(tài)偽造除非進程主動通過prctl之類的接口改但 PID 1 和 2 不會。grep -E ^(Name|Pid|PPid|Uid) /proc/1/status /proc/2/status正常輸出大致是/proc/1/status:Name: systemd /proc/1/status:Pid: 1 /proc/1/status:PPid: 0 /proc/2/status:Name: kthreadd /proc/2/status:Pid: 2 /proc/2/status:PPid: 0看到PPid: 0就對了。接著可以順手確認一下所有內核線程的父進程都是 2ps -eo pid,ppid,comm | awk $2 2 | head -20ps的comm列對內核線程會顯示成[kthreadd]、[ksoftirqd/0]、[kworker/0:0]這種帶方括號的形式方括號是ps用來標記這個進程沒有用戶空間命令行的約定。想驗證這一點直接讀它的cmdlinecat /proc/2/cmdline | wc -c # 輸出 0 readlink /proc/2/exe # 報錯No such file or directory兩個命令的結果都印證了同一個事實內核線程沒有用戶態(tài)可執(zhí)行文件自然也就沒有可執(zhí)行的命令行。反過來看 PID 1cat /proc/1/cmdline | tr \0 ; echo readlink -f /proc/1/exe第一個命令一般會輸出/sbin/init或者/usr/lib/systemd/systemd第二個會給出實際二進制路徑。如果這里讀出來的是別的東西那這臺機器就值得查了。3.2 pstree 與 ps 配合看清 kthreadd 的整個家族看單點不如看全貌。pstree是展示進程父子關系最順手的工具加-p參數(shù)把 PID 帶上pstree -p 1 | head -30 pstree -p 2 | head -40第一條命令看的是用戶態(tài)那棵樹systemd下面掛著systemd-journald、systemd-udevd、dbus-daemon、sshd等等這些是典型的用戶態(tài)服務。第二條命令看的是內核線程那棵樹kthreadd下面掛著一大堆方括號名字每個都是內核某個子系統(tǒng)的后臺工作者。對內核線程做分類整理挺有用我平時習慣用這條ps -eo pid,ppid,comm | awk $2 2 {print $3} | sort | uniq -c | sort -rn | head -20輸出會告訴你哪些內核線程被創(chuàng)建得最多。一般kworker數(shù)量最多因為工作隊列按 CPU、按類型普通、高優(yōu)先級、內存回收等各開一條線程核數(shù)一多線程數(shù)就上去了。這個數(shù)字本身還是個體檢指標如果kworker數(shù)量異常多可能存在阻塞型驅動或者頻繁觸發(fā)的定時任務。再補一條看線程和進程區(qū)別的命令。ps -eLf會把線程也展開同一個進程的多個線程 PID 相同但 LWP 不同ps -eLf | head -20內核線程其實是只有一個線程的進程的特例它們共享內核頁表沒有獨立用戶地址空間。3.3 觀測啟動耗時定位 init 階段的慢點知道 PID 1 是誰之后自然會想知道它啟動花了多久、慢在哪里。systemd-analyze家族是最方便的入口systemd-analyze systemd-analyze blame | head -20 systemd-analyze critical-chain第一條給出內核階段和用戶空間階段各自的耗時第二條按耗時從長到短列出各個 unit第三條畫出關鍵依賴鏈。三者配合能從不同角度定位啟動慢的原因。不過systemd-analyze的前提是系統(tǒng)用systemd當 PID 1。如果是嵌入式環(huán)境或者容器鏡像里用的是busybox init就得換個思路——加內核參數(shù)initcall_debuglinux /vmlinuz root/dev/sda2 initcall_debug ignore_loglevel重啟后dmesg里會為每個initcall輸出一行帶耗時的記錄類似calling ahci_pci_driver_init0x0/0x1b 1 initcall ahci_pci_driver_init0x0/0x1b returned 0 after 12736 usecs把所有行抓出來按耗時排序就能看出哪個驅動拖了后腿dmesg | grep initcall.*returned | sed s/.*returned // | sort -rn | head -20這套方法在排查嵌入式設備開機十幾秒的問題上非常好使。常見的結果是某個存儲控制器驅動在做復位等待或者某個網絡驅動在等 PHY 鏈路單點就可能占掉幾秒。3.4 容器環(huán)境下的 PID namespace那個假 PID 1容器里ps看到 1 號進程是應用自身的進程很多人在這個場景下會產生困惑——難道容器把宿主機的 init 換了沒有這是PID 命名空間的效果。PID 命名空間讓一組進程看到一套獨立的 PID 編號。容器啟動時runc之類的運行時把應用進程放進新的命名空間這個進程在容器內部看來是 1 號但在宿主機上分配的還是一個普通的、可能幾千號的大數(shù)字。你可以這樣驗證# 在容器外 docker inspect --format {{.State.Pid}} 容器名 # 在容器內 cat /proc/1/status | grep -E Pid|NSpid容器內的NSpid字段會同時列出兩套編號比如NSpid: 1234 1前面那個是宿主機視角的 PID后面那個是容器內視角的 PID。這個字段在排查容器進程和宿主機監(jiān)控對應關系的時候特別有用——宿主機上top看到的某個高 CPU 進程通過NSpid就能對應回具體是哪個容器里的哪個服務。還有個必須注意的坑容器里的 1 號進程只是命名空間內的 init不具備全局 init 的特殊保護。全局 init 有SIGNAL_UNKILLABLE標志內核會攔掉大部分發(fā)給它的信號容器 init 沒有這個待遇除非用--init配了 tini 或者顯式注冊了信號處理。這直接導致了下一章要講的那些容器一啟動就退出的經典問題。4. 圍繞這三個 PID 的高頻故障與排查套路4.1 PID 1 退出意味著什么以及如何避免全局 PID 1 一旦退出內核會立刻 panic報錯信息是Kernel panic - not syncing: Attempted to kill init! exitcode0x00000000這不是嚇唬人的措辭而是內核在do_exit()里對全局 init做的硬性判定。邏輯上也說得通init 是所有用戶態(tài)進程的祖先它沒了剩下的進程全成了孤兒系統(tǒng)的運行語義就崩了與其處于不確定狀態(tài)不如直接停住。但要注意內核攔的是全局 init。在 PID 命名空間內的 init 退出不會觸發(fā) panic只會讓這個命名空間里的進程收到SIGKILL然后一起死掉——容器退出的機制就是這個。所以排障時要先分清是哪種場景init 退出后的表現(xiàn)排查方向宿主機 / 物理機內核 panic屏幕卡死檢查/sbin/init是否損壞、根文件系統(tǒng)是否只讀、關鍵庫是否缺失容器pid namespace容器退出退出碼通常為 137 或 init 進程的退出碼檢查容器主進程是否正常 daemon 化、信號是否正確轉發(fā)initramfs 階段打印No working init found后 panic檢查rdinit/init參數(shù)、initramfs 是否完整容器場景下最常見的兩個坑第一把服務做成啟動后自己 fork 到后臺然后父進程退出父進程一退PID 1 沒了容器直接結束第二只寫了CMD /app/start.sh腳本里沒做exec導致 PID 1 是 shell 而不是應用腳本收到SIGTERM后不會轉發(fā)給子進程docker stop要等超時才被殺。正確做法是在腳本最后一行用exec /app/server讓應用直接接管 PID 1。4.2 僵尸、孤兒與信號回收的坑父子關系帶來的另一個麻煩是進程回收。子進程退出后內核不會馬上把它的任務結構釋放掉得等父進程調用wait()或waitpid()來讀取退出狀態(tài)否則它就變成僵尸Z狀態(tài)占著 PID 號和一小塊內核內存不放。那如果父進程先死了呢剩下的子進程就成了孤兒內核會通過find_new_reaper()給它們找一個新爸爸。默認規(guī)則是往上找最終落到全局 initPID 1頭上。所以你在服務器上看到一堆PPid是 1 的進程很多時候它們原本是有爹的爹死了才被 init 收養(yǎng)。這條規(guī)則現(xiàn)在有了例外。Linux 支持PR_SET_CHILD_SUBREAPER這個 prctl 標志某個進程可以聲明自己愿意當中間層收養(yǎng)者。systemd就是這么干的——它給每個用戶會話設了 subreaper這樣會話里的孤兒進程會被會話級的管理進程收走而不是全部涌向 PID 1。這個設計的實際意義在于面向用戶的進程可以拿到更準確的退出通知也避免 PID 1 被大量收養(yǎng)和回收請求淹沒。排查孤兒和僵尸的常用組合ps -eo pid,ppid,stat,comm | awk $3 ~ /^Z/ ps -eo pid,ppid,stat,comm | awk $2 1 $3 !~ /^Z/ | head -20第一條找僵尸第二條找被 init 收養(yǎng)的孤兒。如果僵尸數(shù)量持續(xù)增長說明有父進程從來不回收子進程這時候要么修代碼要么給它設個 subreaper 兜住如果孤兒數(shù)量異常多往往意味著有服務在反復 fork 并崩潰。提示寫自動化腳本的時候subprocess.Popen之后一定要配對wait()或communicate()否則在長時間運行的服務里僵尸會一點點累積最后把進程表塞滿。4.3 PID 耗盡與 pid_max 的調整邊界PID 是有限的。上限由/proc/sys/kernel/pid_max決定32 位系統(tǒng)上默認 3276864 位系統(tǒng)上默認也是 32768但可以調到 4194304。查看和調整cat /proc/sys/kernel/pid_max sysctl -w kernel.pid_max4194304調大之后有個副作用如果同時開著kernel.pid_max和kernel.threads-max的監(jiān)控會發(fā)現(xiàn)內核用于索引 PID 的 IDR 結構變大占用的內存會略有增加但通常可以忽略。更需要注意的是不要在有大量短生命周期任務、又用了 IPsec 或者某些依賴高位 PID 的老代碼的系統(tǒng)上亂調歷史上有過因為 PID 超過某個閾值導致兼容性問題的案例。PID 耗盡的典型報錯是-bash: fork: retry: Resource temporarily unavailable看到它先別急著調pid_max。真正的根因可能是這幾種某進程在瘋狂 fork比如 shell 循環(huán)出 bug、爬蟲并發(fā)失控、cron 里的腳本沒有互斥、僵尸進程堆積占號、ulimit -u設得太低限制了單用戶進程數(shù)。按這個順序排查ps -eo pid,user,comm | awk {print $2} | sort | uniq -c | sort -rn | head ps -eo stat | grep -c ^Z ulimit -u第一條看哪個用戶在占號第二條數(shù)僵尸第三條看用戶級限制。定位到源頭再去改參數(shù)比盲目調大上限靠譜得多。4.4 常見疑問速查表含 PID 名稱歧義說明圍繞這三個編號我被問過的問題重復率很高干脆整理成表疑問結論驗證方式/proc/0為什么不存在PID 0 未經過alloc_pid()不在命名空間哈希表里ls /proc | sort -n | headps為什么看不到 0 號沒有/proc目錄項ps數(shù)據(jù)源就是/procps -eo pid | sort -n | head每個 CPU 的 idle 線程 PID 是幾都是 0命令名swapper/Ncat /proc/sched_debug | grep -i swapperkthreadd一定是 2 號嗎現(xiàn)代內核中穩(wěn)定是 2因為 PID 分配單調遞增且中間無插入grep PPid /proc/2/status為什么內核線程父進程是 2所有kthread_create()請求都由kthreadd落地ps -eo pid,ppid,comm | awk $22收到kill -9 1會怎樣全局 init 有SIGNAL_UNKILLABLE保護信號被忽略在測試機上用非 root 試觀察返回容器里的 PID 1 是宿主機的嗎不是是 PID 命名空間內的獨立編號grep NSpid /proc/1/status怎么確認當前 init 是哪個程序讀/proc/1/exe和/proc/1/commreadlink -f /proc/1/exe最后補一個容易造成搜索混淆的點操作系統(tǒng)里的 PID 是 Process ID自動化控制里的 PID 是 Proportional-Integral-Derivative。這兩者除了縮寫一樣毫無關系。你在搜索引擎里搜pid 算法、位置式 pid、增量式 pid、pid 控制器出來的全是控制理論內容講的是用比例、積分、微分三項去擬合誤差曲線用在電機調速、溫度控制、無人機姿態(tài)穩(wěn)定上。而搜linux pid、進程 pid、ppid才是操作系統(tǒng)這一側。寫技術文檔的時候最好把全稱寫清楚不然讀者很容易被帶偏我自己就曾經在一個內部 wiki 里把兩邊的鏈接混著貼過后來被同事吐槽了很久。5. 把這些知識落到實際工作里5.1 定制最小 init 與內核啟動參數(shù)理解了 PID 1 的選取順序就能反過來控制啟動行為。最常用的兩個參數(shù)是init和rdinit它們的優(yōu)先級不一樣rdinit只對 initramfs 里的/init生效如果設了它內核會優(yōu)先嘗試這個路徑init會在 initramfs 交接完之后在真實根文件系統(tǒng)上執(zhí)行兩者都不給的時候內核按/sbin/init、/etc/init、/bin/init、/bin/sh的順序試。在 GRUB 里臨時加參數(shù)很簡單選中啟動項按e找到linux那行末尾追加CtrlX啟動。做救援的時候我最常用的組合是init/bin/bash rw它能讓你在幾乎沒有任何服務啟動的情況下拿到一個 root shell用來改密碼、修配置文件、檢查磁盤。需要注意的是這種方式進來之后沒有systemd幫忙掛載文件系統(tǒng)/proc、/sys可能是空的得手工掛mount -t proc proc /proc mount -t sysfs sysfs /sys如果是做嵌入式產品把 PID 1 換成一個自己寫的極簡程序也很常見。核心要求只有幾條永遠不要退出、正確回收孤兒進程循環(huán)waitpid(-1, ...)、把收到的信號轉發(fā)給子進程、在收到SIGTERM時有序關停。這幾十行代碼寫好了整個系統(tǒng)的最小化就能再往前推一步。5.2 用 PID 樹排查資源異常與可疑進程線上出問題的時候進程樹往往是第一手線索。CPU 或者內存突然飆高先做這三步top -o %CPU -b -n 1 | head -20 ps -eo pid,ppid,%cpu,%mem,comm --sort-%cpu | head -20 pstree -p 可疑PID前兩條定位到具體進程第三條把它放回進程樹里看。很多時候單個進程看起來人畜無害但往上追兩層會發(fā)現(xiàn)它是一個失控腳本的孫子進程或者是某個已經崩潰但沒退出的服務殘留。這種順藤摸瓜的排查方式比盯著單個進程看有效得多。還有一類場景是排查可疑進程。判斷依據(jù)可以是進程的可執(zhí)行文件路徑指向/tmp或者/dev/shm正常服務不會放這兒、PPid是 1 但找不到對應的 systemd unit、進程名的拼寫和正常系統(tǒng)進程只差一兩個字符、/proc/pid/exe指向的文件已被刪除readlink會帶(deleted)后綴。這幾條組合起來看基本能篩出絕大多數(shù)異常。ls -l /proc/*/exe 2/dev/null | grep deleted systemctl status $(cat /proc/pid/comm)5.3 容器 init 與 subreaper 的取舍建議容器場景下要不要加一個 init 進程一直有爭議。我的建議是按應用類型分如果容器里跑的是單一前臺進程并且它自己正確處理了SIGTERM、自己wait了子進程那就沒必要加。多一層反而增加信號轉發(fā)的復雜度和調試成本。前提是CMD用的是 exec 形式不要讓 shell 擋在前面。如果應用會產生后臺子進程、或者會在運行中 fork 出短命進程比如調用外部命令做一次任務強烈建議加。用docker run --init或者 compose 里寫init: trueDocker 會注入一個極小的 init。它干的事就是回收僵尸、轉發(fā)信號正好補上應用自己懶得做的那部分。如果容器是給開發(fā)人員用的交互環(huán)境比如一個基礎的開發(fā)鏡像那就更應該加否則 shell 里隨手起的后臺進程會一直堆著。這里有個容易踩的細節(jié)加了--init之后容器內的 PID 1 就不再是應用本身而是那個小 init應用的 PID 變成 2。這時候如果應用邏輯里有硬編碼我是 1 號的判斷例如判斷收到某個信號時該怎么處理行為會變。線上切之前最好先在測試環(huán)境驗證一遍信號路徑?;仡^看這一整條鏈路從rest_init()里的兩次kernel_thread()到kernel_init一路做完initcall再execve成systemd再到kthreadd默默孵化出幾百個內核線程這三個編號其實各管一攤0 號是數(shù)據(jù)和調度的地基1 號是用戶世界的入口2 號是內核后臺的車間。我在實際調試中養(yǎng)成了一個習慣拿到一臺不熟悉的機器先敲三條命令——grep PPid /proc/1/status、ps -eo pid,ppid,comm | awk $22 | wc -l、readlink -f /proc/1/exe。第一條確認父子關系沒被改過第二條大致知道內核線程規(guī)模第三條確認 init 是什么。三秒鐘就能對這臺機器的啟動形態(tài)有個基本判斷比翻配置文件快得多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲第一成人无码A片| 亚洲第一综合| 极品人妻VIDEOSSS人妻| jizzdr| 六月婷婷香蕉| 久久久精品免费啪啪国| 婷婷俺去也| 婷婷激情丁五月| 九伊人网| 99热人人操人人操| 国产真实乱对白精彩| 激情无码网| 第四色婷婷五月| 欧美日韩123| 丁香婷婷五月香蕉91| 女人被男人吃奶到高潮| 五月天 另类图片| 97干在线免费| 亚洲 六月 综合| 婷婷五月天堂| 一级韩国产精品毛| 五月天久久久| 日日狠狠久久偷偷四色综合免费| 日本婷婷综合精品| 欧美五月丁香啪啪响视频| 欧美在线视频9| 欧美日本韩国亚洲| 农村熟妇高潮精品A片| 噜噜在线| 免费亚洲婷婷| 婷婷五月天视频亚洲| 婷婷五月天xxx| 人妻精品在线| 五月丁香六月婷婷久久肏| 超碰在线日夜| 狠狠爱深色婷婷综合| 欧美va视频| 九九这里都是精品| 色五月婷婷视频| 97香蕉碰碰人妻国产欧美| 婷婷五月成人社区| 黄色AAAA韩国guochansanji| 97操碰98| 乱精品一区字幕二区| 天天插天天干| 99精品一二三四视频| 啪到高潮激情丁香五月| 亚洲热久久| 五月丁香欧美| 六月婷婷久久| 五月天淫乱视频| 极品人妻VideOssS人妻| 六月丁香啪啪啪| 亚洲第一av| 五月天天丁香婷婷| 色青青电影色五月| 北条麻妃伊人 | 亚洲精品乱码久久久久99| 亚洲一级色电影| 日本色色网站| 婷婷五月天Av| 丁香五月亚洲激情婷婷射| 99九九视频精彩在线| 九九视频在线观看视频在线播放69| 色欲一区二区三区精品A片| 久草五月天| 婷婷色情网| WWW免费视频碰碰碰碰| 天天舔天天爽| 9l视频自拍九色9l视频自拍九色9l社区 | 99综合一区| 丁香六月五月天| 五月丁香六月激情欧美综合| 狼友超碰| 婷色五月天| 六月婷婷激情| 色爆五月| 五月婷婷激情久久| 色婷婷丁香五月高清在线| 婷五月天在线草| va婷婷在线免费观看| 很很干五月天| www91精品| 丁香五月天社区婷婷| 丁香伊人五月色婷婷五十路| 色婷婷综合久久久久| 激情综合五| ww亚洲ww在线观看| 操熟女成人网| 色综合色五月| 日韩AV中文在线观看| 丁香婷婷AV| 久久久久久久,99精品视频| 丁香婷婷综合喷| 中文字幕成| 亚洲成人综合在线| 色婷婷色婷婷五月| 色偷偷五月天| 99精品无码| 色色婷婷综合| 六月色色| 六月丁香社区| 开心五月深爱五月| 色五月婷婷伊人| 人人爱操| 精品无吗va视频免费观看| 五月天激情四射网站| 色五月婷婷老师| 色99色| 中文字幕婷婷9月天| 欧美成综合在线观看| 91激情五月开心| 大香蕉久久久久| 狠狠色激情在线| 亚洲综合成人网站| 青青五月天婷婷| 狠狠色综合久久| 日韩操人| 久久婷婷激情久久| 激情网婷婷婷| 国产婷婷色综合AV蜜臀AV| 久99久视频精品| 色七七九九| 高清激情av在线观看| 色婷婷狠狠色| 日本欧美成人片AAAA| A1片久久| 五月情色天| 91九色在线| 三级av在线| xx久久| 6080av| 五月婷啪啪| 丁香婷婷影院| www.色婷婷。com| 日本婷婷| 五他月天啪啪啪| 婷婷狠狠操| 久久99久久99精品免观看软件| 99热主页日本| 色五月婷婷激情基地| 婷婷色五月久久| 亚洲成人AV在线播放| 欧美 日韩 人妻 高清 中文| 丁香综合婷婷开心激情网| 婷婷午夜天| www.sezonghe| 久久伊人五月天| 色激情五月| 精品九九视频| 老师的粉嫩小又紧水又多A片视频| 色呦呦美女| 天堂草在线看www| 噼里啪啦完整版中文在线观看| 26uuu丁香婷婷五月| 中文无码精品一区二区三区| 日本片日本片祼观看网站在线看中文版网页在线看| 久久色区| 综合久久婷婷| 狠狠干五月天婷婷网| 国产成人亚洲综合A∨婷婷| 人妻丰满精品一区二区A片| 99碰超| 免费观看大片视频 丁香婷婷 六月欧美| 四川BBB搡BBB爽爽视频| 亚洲狠狠狠色婷婷综合激情久久久| 九月婷婷久久| 91狠狠色丁香婷婷综合久久精品| 大香蕉婷婷| 激情综合色图| 九九色逼| 玖玖伦理电影| 精品欧美一区二区三区久久久 | 99热精品在线| 2025最新亚洲激情在线| 欧洲电影在线观看免费版英语版 | 99热新网址| 日韩五月丁香| 丁香六月久久| 成人视频一区| 国产精品色| 五月丁香激情综合网| 国产亚洲精品久久一区二区三区| 天堂久久性| 色 色 色综合com| 五月婷婷丁香综合,亚洲天堂| 五月天激情无码高清| 亚洲愉拍99热成人精品| 天天做天天爱综合| 九九99热| 激情开心五月天| 99re6热在线精品视频播放速度 | 伊人丁香六月婷婷| 性生生活大片又黄又| 天天爽天天日人人爱| 狠狠操狠狠爱| 五月天激情社区| 97色五月丁香婷婷| 五月天激情四射网站| 996精品热视频| 久久婷婷啪啪视频| 五月色情婷婷开心五月色情| 亚洲av电影网站| 日韩五月丁香| 在线播放成人网站| 亚洲V国产V欧美V久久久久久| 韩国婷婷丁香五月| 久久久久98| 97久久人人操| 少妇人妻凹凸视频| 大香蕉五月天婷婷丁香91| 中文字幕成人| 婷婷激情五月综合丁香社| 免費亭亭成人| 婷五月天| 激情丁香婷婷| 久久99热这里只有精品| 好好干Av| 激情婷婷网| 夜夜干夜夜操| 五月婷婷丁香狠狠撸久久| 久久在线大香蕉| 中文AV网站| 五月丁综合在线观看| 亚洲综合欧美色丁香婷婷888月图片| 激情五月天网站| 99精品视频免费在线播放| 99久久网站| 丁香五月图片| 亚洲黄3级片网站欧美| 99热网站| 综合图片色色| 色亚洲婷婷| 99玖玖人人| 婷婷五月色天| 激情五月综合| 婷婷五月中文字幕国产| 五月婷婷久久综合| 丁香五月婷婷婷桃花影院| 色五月天综合网| 欧美性爱5月天天天看| 香蕉网久久| 久久99热这里只频精品6学生| 九九热免费| 丁香婷婷啪啪| 五月天综合色| 亚洲亚洲人成综合网络| 中文字幕在线免费观看视频| 操b视频在线观看一区二区| 九九五月天| 天天日天天狠狠操| 99久久视频| 亚洲精品久久久无码| 激情综合五月| 亚洲亚洲永久无码777777| 综合网色| 国产色香蕉精品五夜婷| AⅤ网站在线看| 狠狠爱婷婷爱| 婷婷亚洲五月| 人人草人人爱手机视频看看| www.狠狠操.con| 国产免费一区二区三州老师F1F1| 色综合色综合色综合| www.超碰在线| 五月婷婷无码| 婷婷性爱影院| 久久婷.com| 天天综合网亚洲网站| 九九免费视频在线| 日本a片网址| 97色女人在线| 久久最新色| 色婷丁香91| 亚洲色综合| 久久婷婷91| www.夜夜操.com| 婷婷色播综合五月| 亚洲婷婷开心五月| 激情网 五月天| 婷婷 久综合| 久久婷婷色色| 日韩欧美颜射| 大香蕉av在线| 婷婷午夜| 热99在线| 99色在线| 国产激情视频在线观看| 五月丁香啪啪网| 色婷婷狠狠爱| 久久免片| 99性爱| 五月丁香偷拍| 狠狠五月天| 狠狠综合网| 久久伊人五月天| 九九机热| 五月婷婷综合久久| 丁香婷婷色| 婷婷丁香五月欧美人| 色综合xx| AV天堂婷婷五月天| 五月丁香婷婷激情视频| 天天插综合| 99色6爱9热| 色九区| 99re免费精品视频| 久er免费视频| 激情丁香淫荡婷婷| www夜夜操wwwcon| 色青青视频| 97色伦另类图片小说视频| 都市激情五月婷婷综合| 色婷五月| 九九热精品| 色激情五月| 色婷婷AV久久久久久久| 99精品在线观看视频| 六月婷婷五月天| 26UUU精品一区二区| 这里只有精品视频在线| 天天天天干| 婷婷色啪| 最新日本A片| 综合五月天亚洲婷婷| 天天日狠狠| 亚洲十月婷婷综合| 性色天| 五月天激情久久| 亚洲成人免费在线| 亚洲av电影在线| 91在线操| 亚洲精品五十一区| 99视频在线精品免费观看2| 精品无吗va视频免费观看| 超碰a女人的天堂| 九九色逼| 亚洲天堂制| 五月丁香色婷婷久久| 丁香5月激情网| 婷婷五月天影视| 成人五月天视频播放| 另类激情中文| 中文字幕无码人妻少妇免费视频| 日韩无码亚欧无码| 色狠狠狠干| 国产探花AV在线| 思思热精品在线视频| 久操大香蕉| 久久五月天影院| 综合伊人久久| 5月婷婷性视频| 色五月婷婷小说亚洲中文字幕组| 天天色粽合合合合合合合| 亚洲日韩成人三级av| 丁香花五月天社区| 婷婷五月成人有| 精品,99| 五月丁香琪琪| 不卡成人免费| 免费的日逼视频| 综合 蜜月 婷婷| 五月丁香琪琪| www.成人婷婷综合| 天天干天天干天天| 日本不卡中文字幕| 9999热精品在线免费播放| 十月丁香九月婷婷综合| 婷婷成人五月天成人文学| 五月婷婷碰碰| 婷婷五月天成人在线视频| 性色99| 女同激情久久av久久| 青青草国产亚洲精品久久| 婷婷影院欧美| 狠狠五月天激情| 久久ab| 青青色com久久| 色婷婷狠狠干| 9色在线视频| www.91AV.com| 五月婷婷之激情五月| 激情五月天色色网| 婷婷久久免费| 婷婷五月综合体验看| 欧美性猛交99久久久久99按摩| 五月婷婷中文字幕| 青青草五月天| 久久久久久18| 五月天天天色| 大香蕉太香蕉视频97| 热久久成人| 九月婷婷久久久| 丁香五月综合首页| 五月六月婷| 四川女人毛多水多A片| av在线播放网址| www、色色色| 精品成人在线| 热久久66| 九月激情婷婷丁香| AV在线不卡播放| 九九热99re8热免费观看| 99热久草| 99热亚洲| 久99热| 99热99精品在线观看| 久久婷婷五月综合激情国产| 亚洲激情综合| 亚洲五月六丁香激情| 欧美色五月| 婷婷五月综合网| 色婷婷亚洲精品天天综| 97成人视频| 天天干天天干天天干天天干天天干天天干天天| 无码少妇高潮喷水A片免费| 99热人人| 色播五月| 嫩草综合网| 日韩人妻在线观看| 激情文学 综合 色| 国产日韩欧美| 五月激情基地| 在线观看欧美3区| 丁香婷婷噜噜| 久久 婷婷 五月天| 99re这里| 这里只有精品视频国产| 丁香六月天婷婷色| 久久婷婷五月免费视频| 99热综合在线| 婷婷五月在线观看| 米奇影视资源777狠狠色婷婷五月天激情网 | 只有精品视频在线观看| 五月丁香黄色视频| 久久综合丁香激情五月| 婷婷五月天美女| 狼人久草| 色综色五月天婷婷| 第四色五月婷婷| 狠狠色噜噜狠狠狠狠综合| www.婷婷五月天| 色5月婷婷| 超碰碰碰碰| 狠狠艹狠狠艹| 中文字幕操比影片| 色播五月综合网| 色五月偷偷| 1024人妻| 色色免费网战视频| 亚洲性爱电影| 日本99视频| 五月丁香天天| 亚洲婷婷丁香五月| 五月亭亭直播| 婷婷五月天色综合翘| 日本WwW色偷偷丁香花久久久京东热| 五月中旬婷婷丁香六| 91综合色噜噜| 亚洲婷婷91丁香| 综合逼五月激情婷婷| WwW色婷婷| 日本五月天婷婷丁香| 99riAv1国产在线观看| 婷婷丁香五月综合| 五月丁香六月情| 五月婷婷激情| 婷婷丁香18| 97视频91| 欧美丁香五月天| 涩五月丝袜婷婷| 另类视频综合| 五月丁香六月婷婷开心网| 99毛片| 色99视频| 日本色五月| 激情无码五月天| 日本三级第一页| 操操自拍| 开心五月婷婷在线| 国产噜一噜天天噜| 国产精品成人网站| 国产精品色色| 亚洲免费99| 99aese| 激情五月天的婷婷| 久热精彩视频98| 天天色综网| av中文网站| 九九热这里只有精品7| 97人人操com| 久热9| 99精品视频在线观看| 99热只有| 超碰人妻在线| 99热这里只有精| 五月丁香婷婷久久| 婷婷成人网五月天| www.henhenl| 1024国产在线| 成人av免费观看| 国产毛片精品一区二区色欲黄A片| 青青操avbb| 色五月大| 五月婷丁香久久综合| www.9操| 99热免费精品| 91肏| 五月婷婷视频在线观看| 久久 视频这里只有精总| 9.1综合网| 9热在线观看| 中文字幕av网站| 日韩成人无码| 久热99| 久草大| 久久久久人妻| 99A片| 五月婷六月丁香| 久久这里只有精品07| 色欲久久综合| 99热免费精品| 色九亚洲| 色色色色色五月丁香| 狠狠爱丁香婷| 色色色色色色色五月| 天天插天天插| 99婷婷| 99在线免费观看| 婷婷五月天伊人网| 99热这里只有精品55| 91一起操| www.超碰| 激情开心五月天| 99热9| 五月天婷婷综合网| 亚洲操操| 狠狠精品干练久久久无码中文字幕| 色999;丁香五月| 色八月婷婷| 亚洲AV网址| 婷婷九月狠狠色| 色五月色图| 日韩av在线免费观看| 亚洲有码在线视频| 91丁香五月| 人人摸人人操人人爽| 内射综合网| 人人操日| 丁香五月综合图片在线观看| 久香草视频在线观看| 日本成人噜噜噜噜噜| 思99热精品久久只有精品| 日日夜夜爽爽| 久久色情综合免费网站| 青青草轻轻操| 亚洲丁香花色| 亚洲激情四谢| 日韩精品99久久| 综合色网站| 久热久色| 五月综合激情视频| 日韩aaaaa| 91一起艹| 天天色情站| 99ri网站在线观看| 色五月激情综合| 五月天激情综合网俺也去| 很很操96| 5月婷婷激情网| 久久五月激情综合| 色99色| www.久99| 色99免费视频中文| 无码四色色色| 天天摸人人摸| 五月婷婷色色色| 777精品久无码人妻蜜桃| 97操资源婷婷| 免费婷婷| 99热在线99| 亚洲激情精品| 色色操| 亚洲12p| 97碰人人操| 538任你爽| 婷婷开心青青草| 亚洲国产网站| 五月婷婷激情综合在线| 色婷婷丁香五月在线观看| 久99视频在线观看| 国产性爱在线| 开心五月六月婷婷| www.深爱激情| 五月天综合在线| www99xxxx五月丁| 狠狠做五月| 丁香五月在线观看完整版| www.99日本| 欧美成人一区二区三区在线视频 | 热久久91| 国产jd1024基地手机看国产| 婷色五月天| 欧美五月丁香在线| 99re在线视频| 久热精品免费视频4| 五月天天堂久久| 五月精品免费XXX| 啊v视频在线观看| 9色婷婷| 99re熱| 99热在线观看免费精品| 久久在线视频免费观看| 秋霞AV美国| 天天爽天天透天天爱| 91操片| 久热A片| 天天AV导航网| 亚洲欧美成人在线| 青青日韩| 噜噜色噜噜网| 欧美槡BBBB槡BBB少妇| 色五月婷婷综合在线| 五月天综合影院| 少妇性按摩无码中文A片| 中文字幕激情综合| 五月婷六月婷婷| 乱精品一区字幕二区| 亚洲黄色影视| www.91婷婷| 婷婷丁香先锋资源网站| 色五月婷婷婷婷| 婷婷中文字幕| 天天日日夜夜爽| 天堂综合久久| 视频在线免费观看欧洲乱码| 丁香五月天天高清在线| 98国产精品综合一区二区三区| 538在线精品| 91综合在线观看首页| 成人网丁香五月| 婷婷成人视频| www.av视频xx999.com| 任你日视频| 天天干,天天操,天天射| 99热这里只有国产精品| 四川女人毛多水多A片| a色色色色色| 翔田千里 50岁 无码| 丁香五月网| 婷婷狠狠操| 色色色1网址| 五月婷婷在线综合| 久久99网| 亚洲第一第二网站| 狠狠色狠狠爱| 日日夜夜干| 免费人人操| 综合99久久天天综合| 蜜臀99久久精品久久久久| www天天爽| 91 久热| 色在线视频网2025| 色婷婷在线影院| 婷婷五月丁香五月综合网| 成人在线视频一区| 成人综合视频在线| 超碰人人艹| 思思热在线观看| tingtingjiqingwuyue| 99re在线观看| 激情综合色婷婷啪啪六月天| 亚洲成人av在线观看 | 九九热在线视频观看| 色婷婷情片| 99.N在线视频| 无码人妻电影| 精品国产AV色一区二区深夜久久| 精品无码色欲AV| 欧美丰满熟妇BBB久久久| 99久久99热这里只有精品| 婷婷婷狠狠| 午夜做爱影院| 黄网网站在线播放| 欧美日韩99| 五月丁香六月婷婷不卡免费无码 | 日韩无码系列| 伊人激情| 嫩草AV久久伊人妇女超级A| 色丁香久综合在线久综合在线观看| 久久受www免费人成| 色婷婷视频在线| 婷婷久久性爱| 国产人妻人伦精品一区二区| 色色网站免费观看| 婷婷爱五月| 婷婷午夜天| 婷婷六月激情啪啪| 丁香五月天社区婷婷| 一起草Av| 啄木鸟黑丝一区二区| Av中文在线| 五月婷精品| 丁香婷婷人妻综合网| 五六月婷婷久久| www.五月婷婷久久.com| 激情网站综合五月天| 99精品网| 久久9热| 五月色婷婷在线观看| 婷婷九月| 五月天婷婷丁香蜜桃91| 五月丁香中文婷婷中文| 九九Av| 五月丁香在线综合| 97色婷婷| 99婷婷五月天激情| 99视频自拍| 99er精品视频| 99er免费在线观看| 国产在线视频1234| 久热免费视频| 九九re精品视频在线观看| 婷婷区日本| 五月天婷婷社区久久综合| 无码激情AAAAA片-区区| 狠狠色97| 五月天激情婷婷五月天久久| 全高清无码视頻| 黄色片久久| www超碰| 欧美激情综合色综合| 五月天综合在线| OUMEIRIHANCHENGREN| 狠狠色综合网| 91干在线| 婷婷久久草| 爱之国产色情综合| 日本三久久| 91碰操| 欧美激情性做爰免费视频| 欧美五月婷婷| 九九视频这里只有精品| 丁香八月综合激情| 五月网激情| 狠狠第四色| 99福利视频导航| 亚洲视频一区| 色五月天婷婷| 曰曰久久| 色色五月婷婷久久| 色五月综合激情| 丁香五月天欧美| 亚州精品色情无码A片| 色五月中文字幕| 久久久潮喷-久久久九九-成人AV| 四LLL少妇BBBB槡BBBB| 第四色激情网| 色婷操逼| 天天舔天天爽| 色五月婷婷视频| 久久99热这里| 色玖玖| 婷婷的久久网站| 99人人操| 伊人三级激情| 激情五月婷婷视频一区二区三区| 伊人婷婷99热精品| 欧美成人一区二区三区在线视频| 大香网伊人久久综合| 91超级碰碰碰| 丁香婷婷影院| 色色色图| 久久三级视频| 99热地址| 99色网站| www.色五月| 色综合色综合网| 五月婷婷在线视频| 婷婷五月天色色| www.操.com| 强伦轩人妻一区二区电影| 五月婷婷中文字幕| 久久婷婷五月综合| www色色com| 9色在线| 99热综合| 激情婷婷狠狠干综合| 一级片操逼视频| 五月天婷婷基地| 欧美婷婷| 狠狠CAO日日穞夜夜穞AV| 色色三级视频| 日本三级第一页| 亚洲乱码日产精品BD| 国外亚洲成AV人片在线观看| 1024亚洲无码| 91大神在线免费看视频全集男男一起操| 超碰人人插| 色激情网| 五月丁香六月激情综合| 亚洲成人在线免费| 蜘蛛女免费观看完整版高清电影| 思思99精品视频| www·五月天| 婷婷亚洲欧美丁香五月| 婷婷五月天天爽| 亚州操人在线视频| 能看的AV| 91丨九色丨国产| 超碰人人99| 色停停香蕉视频| 亚洲综合色婷婷| 天天摸天天舔在线视频| 丁香五月天殴美激情| 婷婷五月天激情基地| 99热这里| 99热这里只有精品在线观看| 欧美性色A片免费免费观看的| 婷婷五月天 丁香五月天 裸体| CAOBIBI| 久久多色| 97激情五月天| 丁五月激情视频免费| 丁香五月性| 亚洲欧洲另类图片| 97色图片中文字幕视频在线观看| 99热资源在线| 99高级会所久久| 色色色国产| 精品激情| 色视频色综合91| 综合99在线| 亚洲成人在线免费| 26UUU亚洲欧美| 日本九九网| 激情综合色| 亚洲免费av观看| 色婷婷丁香网| 成年人看Va免费视频| 久久婷婷六月综合综合色| 色婷婷婷婷成人网| 九玖视频这里只有精品| 婷婷五六月丁香| 色爱99| 六月婷婷之青青草| 久久A热| 天天成人丁香美女AV| 久久五月天黄色五月天色网址| 色综合性视频| 欧美激情综合色综合色| 综合在线丁香五月| 99热在线观看精品| 九九成人| 久热这里| 免费看欧美成人A片无码| 日本操B视频在线观看| 色婷大香蕉| 亚洲AV免费国产电影| 激情丁香五月天图片| 91成人电影| 99热自拍| 色999;丁香五月| 色色性爱视频| 六月激情婷婷| 亚洲妇女熟BBW| 四川操逼站| 99色综合网| 九九免费在线视频| 成人精品亚洲性爱| 97久久超碰| 草草女人亚洲| 99日在线观看视频| 人妻久久久久久久久妻久久久久久久久 | 亚洲AV激情五月综合网| 国产日日夜夜操| 五月天激情网图片| 久热这里只有精品6| 欧美成人AAA片一区国产精品| 亚洲人成网站999综合| 午夜爱爱网站| 婷婷激情五月综合基地| 狠狠干夜夜干| www.婷婷五月天.com| 91精选国| 99在线热| 色综合xx| 色婷婷六月| 99九九久久| 99碰碰中文| 五月婷六月综合在线观看| 色婷婷丁香五月色综合网| 欧美啪啪9| 成人免费120分钟啪啪| 五月激情射| 久久视频婷婷视频| 五月婷婷色| 黄桃AV无码免费一区二区三区| 岛国操B不卡在线| 婷婷久久五月天亚洲欧美国产日韩在线观看 | 激情网狠狠干| 饮料下药迷倒漂亮女同事强干| 丁香六月婷婷| 久久久五月天网站| 天天综合亚洲综合| 色一情一乱一乱一区91Av| 色色9 9| 婷婷激情五月天网站| 人妻内射视频| 色婷青青| 婷婷激情肏屄网| 色狠狠色噜噜噜a天堂一区| 色婷婷小说| 冬月かえでAV无码播放| 狠狠色无码| 大香蕉手机视频| 天天干在线播放| 97色色色色| 五月丁香婷婷爱| 久久五月丁香综合| 丁香香五月激情免费视频| 五月婷婷丁香狠狠撸久久| 五月香婷婷| 天堂中文国产| 五月婷婷激情五月| av在线播放网站| 青青操绿aaa一区日v| 91九色视频在线观看| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 亚洲人成色A777777在线观看| 中文字幕视频色婷婷| 91久久久久久久| 婷婷激情视频欧美视频自拍视频欧美剧 | 天天操人人干| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 欧美日韩123| 性生活久久朋友人妻| 国产精品18久久久| 深爱丁香网| 特黄三级片| 久久婷婷婷| 亚洲男女激情| 婷婷综合九月| 亚洲色激情| 精品成人在线| 五月丁香 啪啪啪| 亚洲黄色影视| 丁香五月婷婷婷婷欧美综合| 亚洲中文字幕AV| 99久久99久久| 五月丁香五月婷婷| 九九热在线99| 亚洲国产99| 五月天伊人久久久久| 俺也去在线视频| 久久久久久久久久久-久五月天婷婷| 久久人妻久久久久| 欧美日韩成人| 欧美A级网站| 97在线碰| 六月丁香深深爱综合网| 狠狠色丁香| 婷婷99狠狠| 婷婷综合网站| 婷婷九月丁香| 五月天伊人| 综合天天综合| 日本猛少妇色XXXXX猛叫| 五月天合网| 久激情网| 色色精品色| 97干在线| 色五月婷婷激情五月| www。久久久久一b。Cc| 嫩草AV久久伊人妇女超级a| 伊人热在线大香蕉| 天天婷婷色六月| 午夜福利成人AV91| 色播五月婷婷| 国产av基地| 婷婷五月天丁香| 天天日人人| AAA级久久久精品| 色婷婷五月天不卡| www,久久久人人| 99精品综合| 99爱爱| 丁香五月色| 婷婷五月天首页| 91主播在线| 亚洲在线操| 天搞天天天天天| 狠狠色综合网站久久久久| 狠色狠色狠狠色综合网| 少妇高潮呻吟A片免费看软件| 五月天俺去也| 7777精品伊人久久久大香线蕉最新版| 激情婷婷色色| 婷婷爱综合| 4399精品一区二区| 日本在线视频播放91| 九艹在线| 五月丁香综合网| 在线观看玖玖资源免费观看| 婷婷丁香91| 第四色激情网| 天天舔天天| 久久久香港| 开心激情网五月天| 婷婷五月综合在线视频| 99久久婷婷精品视频| 激情图片婷婷丁香五月| 久热超碰| 婷婷色色色| 91在线日| 狠狠色丁香久久婷婷综合五月| 婷婷丁香色性爱| 热九九精品| 人人爽亚洲| 婷婷丁香色五月亚洲| 伊人久久丁香狠狠婷婷综合香蕉 | 五月婷婷精品视频| 91视频精品99| 人妻videos人妻高清| 91色欲综合| 婷婷在线精品| 噜噜精品| 国产五月丁香在线| 性爱五月婷| 天天爽天天爽| 国产视频婷婷| 五月天久久婷婷婷| 色五月婷婷五月天激情综合| 97福利视频| 99热日| 五月的婷婷六月丁香| 一级精品999WWW| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 涩涩涩.com| 五月天婷婷激情网| 大香蕉视频婷| 五月天综合| 激情五月综合婷婷| 另类专区在线| 97AV人人插人人操| 婷婷亚洲色| 九九热re99re6在线精品| 天天天天天操| 色色丁香| 七月激情六月婷婷综合在线播放| 黑人巨粗进入警花疼哭A片| 色爽九九| 天天久| 色婷婷色五月丁香| 天天日日夜夜爽| 丁香五月天天| 成人免费超碰| 狠狠干狠狠色| 日本五月天婷婷丁香| 99视频精品8 | 女人天堂av| AA久久| 99日视频在线| 七月婷婷色香综合网| 五月天婷婷丁香| 五月天成人在线播放| 五月天综合图片| 五月婷成人网| 综合激情肏逼网| 色色草97| 国自产拍偷拍精品啪啪一区二区| 97天堂| 99热丁香| 婷婷成人五月天成人文学| 激情黄色小说五月天| 5月丁香婷婷| 综合玖玖性爱免费视频| 中文字幕av久久爽一区| www.99免费视频| 伊人大香久久| 五月丁香色欲| 大香蕉AV电影在线| 精品夜夜澡人妻无码AV| 91色婷婷综合久久中文字幕二区| 欧美精品啪啪| 天堂在线9| 亚洲视频色婷婷| 欧洲亚洲精品| 狠狠操婷婷| 天堂草在线观看| 26uuu亚洲欧美| 亚洲va欧美va国产综合久久久| 婷五月天在线草| 99 色色吧| 台湾综合丁香五月蜜桃| 天天插综合在线| 亚洲激情综合色站| 国内婷婷丁香社区在线播放| 99精品热视频只有精品10| 色色综合色视频| 五月丁香啪| 激情com| 久热这里这里有精品| 婷婷五月激情基地| 色色综合日韩| 五月综合777| 色婷婷中文字母五月丁香| 热的五码久久精品| 亚洲99激情| 另类图片五月天婷婷| 逼逼AV| 新激情五月开心五月婷婷五月丁香五月| 五月丁香综合啪啪対白| 激情5月婷婷狠狠干| 五月婷婷之激情五月| 久久一二三视频| 深夜激情网| 深爱激情五月网| 久久97| 婷婷五月综合视频| 91国产精品视频播放| 丁香五月ⅤA久久久| 久热一区| ww超碰在线| 婷婷伊人綜合| 久久久久激情| 91碰在线| 开心五月婷婷激情| 99热99这里有免费的精品| 九九这里有精品| 亚洲色综合色网| 色五月六月婷婷| 五月丁香婷婷成人网| 久久婷婷五月天激情| xfplayav在线| 激情五月天婷婷| yazhochengrenavwang| 九九热短视频在线观看 | 丁香婷婷激情| 久久综合婷婷激情| 色五月xxx| 五月天婷婷小说| 国产99久9在线+|+传媒| 人人干天天舔| 九九99九九99九九99视频网| 成人人操| 激情婷婷六月| 丁香五月花| 丁香婷婷精品视频| AV九九| 久久视频婷婷| 99热亚洲精品| 四川女人毛多水多A片| 亚洲俩性性爱图片久久第六页| 婷婷丁香激情综合色情| 五月叮香啪| 99综合一区| 欧美十二区| 色。 日日日| 综合婷婷| 色婷婷综合网站| 97热精品| 4399在线观看免费毛片| 99无吗| 日韩AV成人电影| 天天爽夜夜爽| 婷五月天影院| 狠狠狠狠狠狠狠狠草| 少妇性按摩无码中文A片| 狠狠舔| 婷婷丁香十月| 99re久热| 亚洲精品又粗又大又爽A片| 在线国产精品色| 97久久人人| 激情久久久久久| 六月丁香色色| 99热新网址| 丁香六月婷婷| 欧美、日韩、中文、制服、人妻| 婷婷婷婷婷婷婷五月丁香| 99福利视频导航| 欧美爆乳一区二区三区| 久综合4| 色色色国产| 真实的国产乱XXXX在线91| VA婷婷亚洲| 大香蕉福利导航| 丁香激情五月少妇| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 成年人最刺激的综合网| www.爱婷婷.com| 婷婷五月丁香伊人| 性爱激情小说AV五月丁香花| 甈吧vv| av操B网站| 丁香色五月天| 伊人九九热| 琪琪色五月天| 91色五月| 天天干一干| 丁香香五月激情免费视频| 亚洲精品白浆高清久久久久久| 五月在线婷色| 亚洲色无码A片一区二区麻豆| 激情综合亚洲色婷婷五月| 操逼亚洲天堂| 亚洲色另类| 99婷婷国产最新视频| 亚洲综合色色色| 日日日,com| 五月Huangsewang| 五月丁香六月婷婷手机无线| 婷婷情色五月| 99爱视频| 99视频在线| 国产日产亚洲系列最新| 激情五月婷婷色播网| 91精品啪| 激情五月天婷婷| 色色精品色| 最新无毒无码AV| 久久99热久久99精品| 久久与婷婷| 婷婷六月久久综合导航| 26UUU亚洲欧美| 9 1 A v久久久| 生活片五区| 亚洲性图一区二区三区| 久久99最新地址| 96丁香六月婷婷蜜桃综合久久| 五月天天堂久久| 99色色| 夜夜骑天天玩天天日| 99手机在线精品视频| 国产免费一区二区在线A片视频| 狠狠搞综合色| 婷婷丁香综合| 婷婷色片| 99这里只有精品8| 月丁香久久久| 五夜婷婷| 99热这里只有精品69| 欧美啪啪网| 99性视频| 99热国产这里只有精品| 色伊人婷婷| 天天日天天肏天天奸| 综合图片色色| 一区二区中文字幕| 久久艹网| 99精品免费视频| 99精品免费欧美小视频| 九九色色网| 五月伊人91| 97碰在线视频| 丁香激激情网| 乱码操操| www五月婷婷88导航| 九九九热精品| 99小视频网站| 97人人操人人爽| a毛片二逼wwwwwwwwww| 色婷婷偷拍| 日韩精品色| 丁香综合婷婷开心激情网|