Linux
pivot_root(2) 導致系統崩潰
我正在嘗試將我的程序的根更改為我安裝在 /tmp/mount_dir 的新文件系統,並且我在其中創建了另一個目錄 /tmp/mount_dir/inner_mount_dir,並且根據手冊頁 pivot_root(2) 沒有這個系統呼叫的 glibc 包裝器,所以我自己做了
int pivot_root(const char *new_root, const char *put_old){ return(syscall(SYS_pivot_root, new_root, put_old)); }
創建手冊頁指定的兩個嵌套目錄後,我在此程式碼中呼叫它
fprintf(stderr,"-->Changing the process's root..."); if(pivot_root(mount_dir, inner_mount_dir)){ fprintf(stderr,"Failed..%m\n"); return -1; }else{ fprintf(stderr,"Success\n"); }
系統呼叫返回成功,但問題是系統進入崩潰狀態,首先來自 gnome dash 的所有圖示都消失了,我根本無法與系統互動(系統凍結我只能首先更改視窗然後全部終止),螢幕變成一個空白的黑屏,左上角有一個“-”,好像系統正在關閉,但在該狀態下凍結,直到我強制關閉。
pivot_root() 作用於命名空間。
要僅影響您的程序(及其子程序),請首先輸入新的掛載命名空間。並且您需要確保 pivot_root 操作不會傳播回原始名稱空間,例如使用
mount --make-rslave /
.