Linux的目錄結構是否過於複雜難懂,不夠清晰直觀?

例如安裝應用軟體時,是否可以規規矩矩的放在一個目錄下?為什麼?


你要知道windows下軟體也是要放dll到system32的,跟Linux下.so放到/usr/lib一個道理

你要知道windows下軟體的配置信息也是放到用戶AppData目錄的,跟Linux下配置信息放/etc和$HOME/.config一個道理

有同學說了,那windows不是還有綠色軟體的嘛?

當然linux下也有,configure的時候指定好prefix所有程序都是綠色軟體


你可以試試一個叫做 GoboLinux 的發行版(早就停止維護了,我去看看他主頁還在不在還能不能下載),完全是按照另外一套目錄結構搭起來的發行版,試圖讓目錄結構變得清晰直觀。確實帶來了很多優點但是也引入了很多麻煩,試試才能體會。

更新:剛剛去查了一下,居然又復活了,我得建個新的虛擬機了


UNIX時代一個軟體的文件一般來說可以用目錄分為這麼幾類

  • PREFIX/bin (二進位執行文件)
  • PREFIX/lib (庫)
  • PREFIX/libexec (軟體內部使用的二進位執行文件,一般不打算被用戶直接使用)
  • PREFIX/etc (配置文件)
  • PREFIX/var (軟體運行時動態生成的文件,往往是數據文件和日誌)
  • PREFIX/tmp (軟體運行時生成的臨時文件)

其中,PREFIX用戶可以通過configure選項在編譯前指定,比如~/app_abc。多個軟體可以使用同一個PREFIX,這樣它們的同名子目錄下的文件就合併在一起

對於一個UNIX系統來說,一般會把軟體安裝在3個PREFIX下:

  1. /

    這個PREFIX是啟動和初始化系統用的最基本的PREFIX,它的/bin、/lib等目錄都是最核心的執行文件和庫。缺了這個PREFIX下的程序,系統一般不能正常啟動或者即使能啟動功能太少
  2. /usr

    這個PREFIX和啟動系統無關。發行版提供的用來增強系統功能的軟體一般放在這個PREFIX下
  3. /usr/local

    這個是用戶自己安裝的軟體用的PREFIX,和發行版無關

為什麼UNIX允許且鼓勵多個軟體使用一樣的PREFIX?

有幾個原因:

  • 減少冗餘:這個主要是指減少PREFIX/lib下文件的冗餘
  • 便於編寫PATH等環境變數:PATH這類環境變數只要指定很少幾個目錄就能涵蓋絕大多數命令
  • 便於分別掛載不同的媒質:比如/可以用只讀的網路驅動器來掛載,但是/var和/usr/local用可寫的本地硬碟來掛載
  • 便於許可權管理:比如/etc下只有root能寫
  • 便於同一台機器上的不同用戶協作編程和共享文件

----

吐槽:

UNIX的這種設計說到底是主機時代大家公用一台機器的分時文化導致的。除了普通用戶,往往一台機器上還有一個管理員(真人),/sbin就是為他準備的,別人不能用。由於有專職管理員,所以系統管理的細節和步驟多點不要緊

但是到了個人電腦時代這種做法太重量級,不便於理解。因此DOS用的是一個軟體佔一個目錄的XCOPY式部署體系。(我覺得)其實對於個人電腦用戶來說,XCOPY方式的應用部署方案更好用


*nix 風格的目錄樹對許可權分配管理之類的具有很方便的優勢,找東西也好找,——某種類型的東西一般會在一起,於是同一個軟體的東西就分開了。這樣就得有個東東用來記住文件都在哪兒;

Windows 風格的目錄樹方便軟體管理,同一個軟體的東東一般都會扔到一個地方(咳咳,那個 program filescommon files 是個啥……),然後大家懂得,每個軟體自帶一堆 msvcr msvcp mfc blah blah 的 dll(或者給你裝上五六個不同版本的 .Net 運行庫)。

咦?為毛就不能有個綜合各家長處的解決方案?

比如說,如果文件系統層面支持同一路徑的不同訪問方式,舉個 ,對 /bin/foo 的訪問自動定位於比如 /Application/foo/bin/foo,而 /etc/foo.cfg 在 /Application/foo/etc/foo.cfg,於是,很大程度上可以做到,同一個應用的相關文件能夠在同一個目錄下,同時相同類型的文件能夠用相同的路徑來訪問。

當然,以上設計明顯不成熟,只是提供一種解決問題的思路罷了。


我也這麼覺得。

在Unix里,軟體傳統上是裝在「系統」裡面的,而且是分散的。比如有個軟體叫foobarbaz,那通常可執行程序在/usr/bin/裡面,動態、靜態庫在/usr/lib/、/usr/lib64/、/usr/lib/ARCHITECTURE/裡面,資源在/usr/share/foobarbaz/裡面,全局配置文件在/etc/foobarbaz/裡面,用戶個性化的配置文件在~/.foobarbaz/裡面。如果這個軟體是一個開發庫,那它的頭通常在/usr/include裡面。

這種布局是有很多問題的,首先就是你需要root許可權來裝一個軟體。當然,通常軟體的源代碼包會提供一個PREFIX配置選項,你如果把它指向在你自己的home裡面,就可以只裝給自己。但是,Linux發行版的binary包,比如rpm、deb,通常都僅支持system-wide的安裝。

然後,還有資源定位的問題:如果我在system-wide裡面有foobarbaz,然後還有一份user-space的foobarbaz,那麼資源、配置文件怎樣隔離?比如,foobarbaz使用如下機制載入配置文件:

  1. ~/.foobarbaz/config

  2. PREFIX/foobarbaz/config

那完B了,優先順序為1的配置文件既影響system-wide的foobarbaz行為,也影響你自己的foobarbaz的行為。

那麼我們只能用這種機制:在配置階段加入一個標籤叫USER_OWN_BUILD,然後用一個宏:

#ifdef USER_OWN_BUILD
// only process PREFIX/foobarbaz/config, which points to your home
// we dont need to process ~/.foobarbaz/config, as PREFIX/foobarbaz/config is already in user space
#else
// process ~/.foobarbaz/config, which is in user space
// process PREFIX/foobarbaz/config, which is system-wide
#endif

我就特別佩服那種能夠做到這一點軟體,像Blender、Qt開發包什麼的。但是他們的編譯配置文件不知道有幾千行。這TM多噁心啊!!


unix思想就是一個程序做一件事。那要完成複雜的工作怎麼辦。就是把簡單的程序放到一起。用shell/perl/python膠水把他們串起來。

他們是一個整體。程序都是相當於擴展shell的功能。還有很多輔助各種程序並行串列協作的程序。

編程的時候大家也不會在一個標準下。用的庫也各不相同。對於這種分散的開發模式。不太可能一個一個的去設定path libpath。

unix這種方式除了不符有些人的使用習慣之外,其實有很多好處。

程序的臨時文件夾都在/tmp下/這樣可以簡單的吧/tmp放到內存中。

/usr 可以用壓縮文件系統提高讀速度,因為他在普通用戶許可權下只讀。瓶頸是硬碟io。程序載入的時候就可以利用cpu的過剩性能接壓縮提高速度。

/var經常讀寫 可以單獨分開一個存儲設備隔離錯誤等等。

系統工具拯救系統可以放到/boot下然後單獨放開一個分區。/掛了還可以有個小系統想辦法。


上ubuntu-core吧,每個軟體一個目錄。


ios就是這樣吧。越新的操作系統,對文件,目錄這樣的概念都在對用戶淡化。文件和目錄逐漸變為程序開發者才需要了解的內容。普通用戶只需要關心應用即可,無需知道後面的內容存在哪裡。


用習慣這種目錄結構的話,會感覺Linux/Unix目錄的結構比Windows清晰很多。附上下面這張圖:


必須要掌握的重要目錄

/etc/sysconfig/network-scripts/ifcfg-eth0

查看網卡配置

/etc/resolv.conf

設置Linux本地的客戶端DNS的配置文件* **** DNS 可以實現域名和IP的互相解析。

/etc/hosts

設定用戶IP與名字(或域名)的對應解析表,相當於本地LAN區域網內的DNS* ****

/etc/sysconfig/network

可修改機器名及網卡啟動,網關等配置。

/etc/fstab

實現開機要掛載的文件系統的一個文件* ****

/etc/rc,local

用於存放開機自啟動程序命令的文件(chkconfig常用來管理yum/rpm安裝的程序的服務的開機自啟動)。自己開發的程序,習慣把啟動命令放入/etc/rc.local。實現開機啟動這些程序。開機時會把/etc/rc.local里的內容執行一遍。* ****

/etc/inittab

設定系統啟動時init進程把系統設置成什麼樣的runleve;運行級別及載入相關的級別對應啟動文件設置。

/etc/init.d

這個目錄是用來存放通過yum,或rpm工具安裝的軟體的默認啟動程序的目錄。比如Cent OS/RedHat:*****

/etc/profile

系統全局環境變數永久生效的配置文件***** 定義別名以及PATH變數等。

/usr/local

這個目錄一般是用來存放用戶自編譯安裝軟體的存放目錄:一般是通過源碼包安裝的軟體,如果沒有特別指定安裝目錄的話。一般是安裝在這個目錄中。相當於:c:Program files 。

/usr/src

內核源碼存放目錄,比如下面有內核源碼目錄,比如Linux,Linux-2.xxx.xx 目錄等。

/var/log/messages

系統信息默認日誌文件,非常重要,按周自動輪循 *****[root@oldboy /]# ll /var/log/messages*

/var/log/secure/

記錄登入系統存取信息的文件,按周自動輪循,例如 pop3,ssh.telnet,ftp等都會記錄在此。**** 系統安全的日誌文件。依賴於rsyglog服務開啟。

/var/spool/cron/root

定時任務crontab默認路徑,按用戶名命名的文件

/proc/cpuimfo

關於處理器的信息,如類型,廠家,型號和性能等。****

/proc/meminfo

系統內存信息

/proc/loadavg

系統負載平均值信息(系統的繁忙情況,比較準確,但是不夠細緻系統性能指標),uptime的結果 ***** 負載值不要超過CPU的核數。看負載top,uptime。

/proc/mounts

設備的掛載信息,df-h類似。


man 7 hier


是!

已有的答案說了一大堆,但是學個Linux/unix先要學一堆無關緊要的歷史遺留問題,才能解釋為什麼有usr等等這種奇怪的目錄,為什麼rmdir不能刪除一個非空目錄,為啥沒有rename。

典型的沒有困難製造困難。

太累。無力吐槽。。。


Filesystem Hierarchy Standard


不加後綴名引發的血案

另外表示帶 symlink 的 FHS 比某些時候的 /usr/games 這種亂七八糟的已經好非常多了…


推薦閱讀:

TAG:操作系統 | Linux | Linux系統管理 |