1. 程式人生 > >Unix/Linux 系統中的 Operation Not Permitted 問題

Unix/Linux 系統中的 Operation Not Permitted 問題

1. 前言

多次在 Mac 使用過程中遇到 Operation Not Permitted 問題,之前都是略過,今天好好摸索了一把,搞明白了道理,記錄下來。

好幾次整理行動硬碟資料的時候,都遇到了 Operation Not Permitted 問題,檔案移動不了,也刪除不掉,第一次遇到沒理會,第二次是開啟虛擬機器,在 Windows 中操作這些問題檔案,今天又遇到了,決定消滅它。

2. OS X EI Capitan 的 SIP

Apple 在 OS X 10.11 以後的版本中預設啟動了一項系統保護程式,叫做 System Integrity Protection,也被喚作 rootless(寓意讓 root 弱一點),該程式意在保護電腦不被惡意程式攻擊,但是對於我們這群程式設計師,很多保護是多餘的,甚至給我們帶來了很多麻煩。

SIP 會鎖定幾個系統檔案目錄:

/System
/sbin
/usr (/usr/local 除外)

在 SIP 的保護下,部分軟體、功能、指令碼都會失效,我們可以通過如下步驟關閉 SIP:

  • 重啟電腦,按下 Command + R 直到聽到開機聲音,此時電腦會進入恢復模式(Recovery Mode)
  • 當 OSX 工具出現在螢幕中時,下拉工具(Utilities)選單,選擇終端(Terminal)
  • 鍵入 csrutil disable,回車
  • 電腦重啟後,SIP 就關閉了

恢復 SIP 的方式同上,只不過終端中鍵入 csrutil enable。通過 csrutil status 可以檢測系統當前 SIP 的啟動狀態:

$ csrutil status
System Integrity Protection status: enabled.

3. Linux 下的 file flags

可能你也遇到過在 Linux 下刪除檔案報錯:

[email protected]:/home/barret/work# rm -f 1.md 
rm: cannot remove ‘1.md’: Operation not permitted

這個時候可以通過 lsattr 命令看看該檔案是否被打了 flags:

[email protected]:/home/barret/work# lsattr 1.md
----i--------e-- ./1.md

如果檔案上存在 i 標記,那肯定是刪不掉的,同樣這個檔案也不能被編輯。可以進入 root 模式,去除這個標記:

[email protected]:/home/barret/work# chattr -i 1.md

給保護檔案新增標記的方式:

[email protected]:/home/barret/work# chattr +i 1.md

也比較簡單。

後記

我是在安裝英偉達顯示卡驅動和編譯opencv使用apt-get安裝cmake的時候遇到了這個問題,大致報錯資訊是:

mv: can not move /etc/X11/xorg.conf to /etc/X11/xorg.conf_1108203232:Operation Not Permitted

使用lsattr發現這個檔案確實xorg.conf被打了標記,使用chattr去除標記後執行原來的命令可以成功通過。