我在 Windows 系統下安裝軟體都會安裝在別的地方,不會裝在 C 盤,因為怕拖慢系統的運行速度。那在 Linux 系統下需不需要這樣做呢?而且 Linux 系統安裝軟體裝完了都不知道裝到哪兒了,感覺到處都有,讓強迫症很難受,能不能把它們都裝在同一個地方?


我在windows系統下安裝軟體都會安裝在別的地方不會裝在c盤,因為怕拖慢系統的運行速度,那在linux系統下需不需要這樣做呢?而且linux系統安裝軟體裝完了都不知道裝到哪兒了,感覺到處都有,讓強迫症很難受,能不能把它們都裝在同一個地方?

Linux下面的軟體,按照安裝方式,一般有這幾種:

1. 使用各種包管理器安裝的包:比較常見的例子有aptyumpipnpm等,也包括dpkg手動安裝的.deb文件。這些軟體,其安裝位置一般都不好設置,比如apt,安裝位置在.deb文件中都寫死了,改起來很費盡。不過這種情況下一般不會出現 「裝完了都不知道裝到哪兒了」的問題,包管理器一般都提供查詢已安裝軟體情況的功能,比如apt

$ apt list --installed

會顯示已經安裝的包,輸出類似下面的格式:

hostname/eoan,now 3.22 amd64 [installed]
hplip-data/eoan,eoan,now 3.19.6+dfsg0-1ubuntu1 all [installed,automatic]
hplip/eoan,now 3.19.6+dfsg0-1ubuntu1 amd64 [installed,automatic]
htop/eoan,now 2.2.0-2 amd64 [installed]使用源代碼變異

這裡[installed]指的是用戶主動安裝的包,[installed, automatic] 指的是用戶安裝別的包時候的依賴。如果我apt remove 某個包,那麼所有他依賴的包也會被移除。所以查自己裝的包,只看[installed]狀態的就可以了。

如果實在想知道安裝到了那裡,可以這樣幹。比如我想找htop在什麼地方:

$ dpkg -L htop
/usr
/usr/bin
/usr/bin/htop
/usr/share
/usr/share/applications
/usr/share/applications/htop.desktop
/usr/share/doc
/usr/share/doc/htop
/usr/share/doc/htop/AUTHORS
/usr/share/doc/htop/README
/usr/share/doc/htop/changelog.Debian.gz
/usr/share/doc/htop/copyright
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/htop.1.gz
/usr/share/pixmaps
/usr/share/pixmaps/htop.png

可以看出,軟體在/usr/bin/htop,文檔在/usr/share/doc/htop/usr/share/man/man1/htop.1.gz

你要實在不想按照他寫的位置安的話,可以把裡面的文件導出來,不過可能有許可權和其他的設置問題(apt還要運行.deb裡邊的安裝腳本,設置驅動什麼的),如果願意去解決這些問題的話可以試試。 不過向htop這種程序,只有一個二進位文件/usr/bin/htop是必須的,真導出來放在自己想要的地方也無妨。

2. 使用源代碼編譯再安裝的軟體。許多開發庫,或者包管理軟體上沒有的軟體,只能使用源代碼編譯再安裝,常見的步驟是./configure make sudo make install,設置、編譯、安裝。一般情況下默認設置是可執行文件安裝到/usr/bin,庫安裝到/usr/lib(這也是一般要加sudo的原因)。如果想改位置的話,比較常見的方法是在 ./configure中加一個flag:

$ ./configure --prefix=安裝這個軟體的文件夾

不一定所有情況都支持(這裡吐槽一下C和C++程序的混亂的build system……這就是一門語言沒有爹的後果),最好查一下軟體的說明。當然了,C和C++之外的語言一般就用自己的編譯工具了,各自有各自的情況。

這種情況的問題是一般只能通過make uninstall卸載,如果有著源代碼和Makefile的文件夾沒了,那就不好辦了。現在我的電腦裡面就有不知道多少個這樣的軟體…… (還有向gcc這樣不提供make uninstall的,只能手動去刪了。)

3. 別人提供好的二進位可執行程序,讓你下個tar.gz壓縮包的一般都是這種情況。這個就沒有任何規律了,運行後在任何地方存東西都有可以,不過比較多的是存在$HOME/.config/軟體名裡面。不過和Windows不一樣,一般不會把可執行文件扔到別的地方,所以之後想要再用的話一般也是執行這個程序。或者說這種情況一般沒有什麼「安裝」的概念,可以說是「portable」。我是在$HOME目錄建了個文件夾,所有的這種程序都放在這裡。

最後再說一句,你的強迫症沒什麼錯對之分,不過我覺得你擔心的原因沒什麼道理:「怕拖慢系統的運行速度」。不知道你是不是擔心和系統文件存在同一個盤上,讀取程序的時候和系統搶硬碟讀寫帶寬?我剛用iotop看了一下,系統在正常運行的時候對硬碟的讀寫並不多,無論是隨機讀寫還是順序讀寫,都遠遠佔不滿,估計Windows也差不多。因此,存在哪個目錄下面我覺得沒有太大的實際區別。


首先說一下,軟體安裝在C盤怕拖慢系統運行速度,是機械硬碟時代的說法。

而SSD時代因為不存在硬碟磁頭尋道時間的問題,所以並不存在這一點。

然後要說一下,讓你安裝在D盤的意思,並不是讓你分區,而是讓你安裝一個物理上隔離的D盤。因為只有物理上隔離的D盤,對D盤進行讀寫操作的同時才對C盤完全沒有影響。也就是說D盤的意思是你需要有兩塊硬碟。

如果你僅僅是單一硬碟分成C D兩個分區,他們依然還是互相影響的,甚至有副作用:因為硬碟靠後的區域讀寫速度會慢,單C盤本來可能儘可能使用靠前區域,強行分D盤導致一部分數據不得不放在靠後的區域,降低了性能。

最後,SSD請無視這些,一個盤一個區,解決。

如果你有兩塊硬碟,那麼第二個盤給 /home 。


Linux 軟體安裝包普遍遵循 FHS(文件系統層次結構標準),但這無法達到你的目的。

首先對於發行版而言並不會將 FHS 當作嚴格的標準對待,沒有說你安裝包文件位置放得不規範包管理器就拒絕安裝的。

即便所有軟體包都是嚴格遵循 FHS 的也無用。因為越是遵守這個標準,安裝後輸出的文件就可能越分散(不同類型的文件散佈在各個目錄中)。

有一個叫 NixOS 的發行版比較特殊,它將所有的包都隔離劃分了安裝位置,沒把 FHS 當回事兒。用 NixOS 的話,一個軟體就是一個目錄。

不過說到底這個問題首先還是應該糾正錯誤觀點。

  1. 不要把 Windows 的使用思維套在其它系統上
  2. 你的大量對 Windows 系統的觀念可能都是錯的,民科網站殘害了太多業餘技術愛好者
  3. Linux 正常使用,系統帶來的存儲開銷不大,不會像 Windows 那樣 C 盤持續膨脹。一般來講,你只需要給 /home 單獨分區


既然是入門級問題,那麼你應該使用軟體包管理器。

如果需要額外下載(甚至編譯)軟體,那麼,你應該:

使用容器,如docker、snap

現存的一切軟體都有容器版本,如果沒有,這種軟體也過於小眾,新手最好還是別碰。

如果實在沒有容器可用,你可以選擇:

  1. 安裝到/opt中
  2. 隨便找個地方編譯,不安裝直接原地運行

一定不要:

  1. 安裝到/usr或者/usr/local
  2. 不加參數直接make install (其實就是1的效果)

順便一說,windows上應該儘可能把軟體放在C盤。C盤就算100%佔用了,系統也不會有一丁點被拖慢(除非你手賤碰了系統高級設置)。軟體如果只是放在那不運行,那不管是什麼機械硬碟、SSD,都不可能影響系統性能的。

電腦卡了唯一的原因是你裝的軟體都在後臺運行,運行的越多就越卡,跟裝哪裡沒關係。


建議參考linux系統目錄結構標準FHS http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/Linux-Filesystem-Hierarchy.html,csdn上也有中文的翻譯版,就能夠瞭解各個目錄都應該放些什麼東西。

具體安裝軟體的話,我的習慣是 如果安裝軟體倉庫的軟體或者使用軟體倉庫的包(後綴.deb .rpm等等)的,默認在哪裡就在哪裡,不手動更改,因為這些都是倉庫管理者組織好了的。

如果不是從軟體倉庫來的,比如Mathematica,後綴是.bin或者.sh(這個後綴未必就是個純shell腳本)分兩種情況,

如果這個軟體需要經常通過命令行調用,那麼就安裝到/usr/local/軟體名 下面,然後在/usr/local/bin/ 手動創建些鏈接,如果必要的話。

如果這個軟體不需要命令行,比如wps,應該算是第三方協力軟體,就都到/opt/軟體名 下面

如果是需要編譯之後安裝的軟體,盡量用checkinstall等自動打包軟體做成軟體倉庫能管理的包格式,後綴deb或者rpm,configure的時候選擇/usr/local/軟體名

不過有個特殊情況,如果我沒有root許可權,或者我不希望別人用我的軟體,那麼參考https://wiki.archlinux.org/index.php/XDG_Base_Directory標準,這個標準其實等於用戶自己的一套根目錄,在家目錄下的.local .cache .config大致對應於/usr /var /etc,這個標準的目的就是避免各種軟體就在用戶家目錄下瞎幾把放文件,就像安卓系統一樣,有這個標準真的是潔癖和強迫症患者的福音,不過現在只有部分軟體支持,建議自己管理家目錄也按照這個標準來搞。所以我會把我自己用的軟體放到.local/軟體名 裡面。

現在又出來appimage和snap這些安裝包類型,這種一般不用選安裝目錄,不過我不怎麼喜歡這種安裝包。

另外,Windows下沒必要把軟體安裝到c盤之外,並不能提升速度,反而重裝系統之後更麻煩,我一般Windows分區就分兩個,一個系統與軟體分區,一個我個人數據的分區。和linux雙系統的話,再加一個和linux共享的分區


推薦閱讀:
相關文章