pivot_root() - Unix、Linux 系統呼叫 - 技術教學
Tutorials Point


  Unix 初學者指南
  Unix Shell 程式設計
  高階 Unix
  Unix 有用參考
  Unix 有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考     討論論壇     關於TP  

pivot_root() - Unix、Linux 系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

pivot_root - 更改根檔案系統

語法

int pivot_root(const char *new_root, const char *put_old);

描述

pivot_root() 將當前程序的根檔案系統移動到目錄put_old,並將new_root設為當前程序的新根檔案系統。

pivot_root() 的典型用法是在系統啟動期間,系統掛載一個臨時根檔案系統(例如 initrd),然後掛載真正的根檔案系統,並最終將後者轉換為所有相關程序或執行緒的當前根。

pivot_root() 可能會或可能不會更改使用舊根目錄的任何程序或執行緒的當前根和當前工作目錄 (cwd)。pivot_root() 的呼叫者必須確保具有根或 cwd 在舊根上的程序在任何情況下都能正常執行。確保這一點的簡單方法是在呼叫 pivot_root() 之前將其根和 cwd 更改為new_root

上面一段話有意含糊不清,因為pivot_root() 的實現將來可能會發生變化。在撰寫本文時,如果程序或執行緒的根或 cwd 指向舊根目錄,則pivot_root() 會將它們的根和 cwd 更改為new_root。這是為了防止核心執行緒即使它們以任何方式從未訪問過檔案系統,也仍然使用其根和 cwd 使舊根目錄保持繁忙狀態。將來,可能存在一種機制,允許核心執行緒顯式放棄對檔案系統的任何訪問,這樣就可以從pivot_root() 中刪除這種相當侵入性的機制。

請注意,這也適用於當前程序:pivot_root() 可能會或可能不會影響其 cwd。因此,建議在pivot_root() 之後立即呼叫chdir("/")

以下限制適用於new_rootput_old

標籤描述
- 它們必須是目錄。
- new_rootput_old 不得與當前根位於同一檔案系統上。
- put_old 必須位於new_root 下方,即,向put_old 指向的字串新增非零數量的/.. 必須產生與new_root 相同的目錄。
- 不得在put_old 上掛載其他檔案系統。
另請參閱 pivot_root(8) 以獲取其他用法示例。

如果當前根不是掛載點(例如,在chroot(2) 或pivot_root() 之後,另請參見下文),則不是舊根目錄,而是該檔案系統的掛載點將掛載在put_old 上。

new_root 不必是掛載點。在這種情況下,/proc/mounts 將顯示包含new_root 的檔案系統的掛載點作為根 (/)。

返回值

成功時,返回零。出錯時,返回 -1,並適當地設定errno

錯誤

pivot_root() 可能會(在errno 中)返回stat(2) 返回的任何錯誤。此外,它可能會返回
標籤描述
EBUSY new_rootput_old 位於當前根檔案系統上,或者檔案系統已掛載在put_old 上。
EINVAL put_old 不在new_root 下方。
ENOTDIR
  new_rootput_old 不是目錄。
EPERM 當前程序沒有CAP_SYS_ADMIN 許可權。

版本

pivot_root() 引入於 Linux 2.3.41。

符合標準

pivot_root() 是 Linux 特定的,因此不可移植。

錯誤

pivot_root() 不應該需要更改系統中所有其他程序的根和 cwd。

pivot_root() 的一些更模糊的用法可能會很快導致瘋狂。

備註

Glibc 沒有為此係統呼叫提供包裝器;請使用syscall(2) 呼叫它。

另請參閱



previous next Printer Friendly

廣告


  

廣告



廣告