Linux學習筆記1,linux學習筆記
自從我大微軟終於放下身段,決定給開源社區一個遲來的擁抱,追隨多年的擁躉們像是突然得到了女神的垂青,各種茫然失措、痛哭流涕、歡欣鼓舞,紛紛唱了起來:“等了好久終於等到今天,夢了好久終於把夢實現……”唱完之後才想起來好像說的什麼開源、跨平台啥的和自己沒太大關係,最基本的,Linux、IOS會嗎?被.NET細心呵護了這許多年,現在跟我說開源跨平台,你是玩我呢?不說了,拖了幾個月的項目,老闆還等著今天上線呢!
呵呵,開個玩笑,其實微軟的開放姿態是受多數方肯定和歡迎的,IT行業各方面也多少有點影響,對於我來說,最大的影響莫過於打算好好研究下Linux,這玩意一直都想系統學習,奈何沒有充足的動力,如今沒有借口了,希望能儘快入門。
按照本人部落格一貫的風格,本文並非系統的講解,而是側重於方便以後的複習回顧做筆記。本文綠字為個人見解,需驗證。本系列參考書籍是《Linux就是這個範兒》,趙鑫磊和張潔著。
學習Linux第一個要面對的問題是版本選擇,尼瑪當時我一看就傻眼了,瞬間就有打道回府的衝動。大夥來瞅瞅,下面這還是07年時候的分支圖(摘自網路),想想現在Android的景象,嘖嘖,這圖還能裝下麼。
要從中選一個合適的,對門外漢來說確實不是件容易的事。開源就是這點不好,大家各行其是,說好聽點百花齊放,卻分流了本就不多的使用者群,若如此眾多的版本開發可以合力一處,windows還有笑傲江湖的資格麼。雖說在伺服器端因為開源的原因闖出了一片天地,但仍然無法迴避佔市場大頭的案頭用戶端的失利。博主認為凡事都不可走極端,純開放和純封閉都不可取,兩者相互借鑒,給予自由,但又有機構按規則統一版本控制,才是軟體發展的正確方式(maybe有某類開源協議支援博主的觀點,除了GPL,博主對其它開源協議不甚清楚)。
所幸對於我們這群碼農來說,各發行版都大同小異,一通百通。目前服務端用的比較多的免費版本非CentOS莫屬,很多書籍也採用CentOS講解,如今已到了7.1版本。
作為.NETer,雖然勾搭上了Linux,但是正房還是Windows,不可拋棄。那麼如何在同台電腦上另外安裝Linux呢,要知道Linux和Windows的檔案系統都不一樣,網上有此雙系統的教程,但是為了安全計,我還是選擇了虛擬機器的方式。虛擬機器的缺點是軟體環境是類比出來的,比如剛說的檔案系統,虛擬機器裡Linux的檔案系統都是由windows檔案系統經虛擬機器轉換而來,效率上絕壁比原生安裝的低下很多。
虛擬機器我選擇的是VMware Workstation,最新版11.1,註冊碼網上搜便是。在VMware介面上選擇CentOS鏡像檔案,然後靜靜等待安裝完畢即可,在此期間會讓你輸入使用者名稱密碼作為安裝後的登入使用者,然後是語言和IME選擇,完了就進入案頭了,如下:
也沒什麼特別的感覺,完全沒有各類書籍裡說的驚豔,maybe CentOS偏向於服務效能,對圖形介面不care,maybe Ubuntu就不一樣了。不管怎麼說,我終於向前邁出了曆史性的一步!
使用者和使用者組
Linux使用者中除了root天生就很牛逼,其他使用者都是屌絲。一個使用者至少屬於一個使用者組,/etc/passwd檔案中每行即表示一個使用者,其中第4列即GID表示使用者的“初始使用者組”,使用者所屬的所有使用者組稱為“支援使用者組”。還有個概念是“有效使用者組”,所謂有效使用者組表示使用者當前所在的使用者組,即使用者在同一時刻只能以一個使用者群組成員的身份參與系統互動,至於為什麼這麼設計,目前未知。
前者說了,root很牛逼,幾乎無所不能,很極端的對立,廣大屌絲一般除了自己的一畝三分地,幾乎不能幹任何“有技術含量的”事(比如添加使用者),所以有點什麼事都要麻煩root。root為了不累死,決定傳授一句咒語給屌絲們,讓他們能在一段時間內具備自己(root)的能力,或者說“變身”為root,這個咒語就是sudo。比如/etc/shadow 這個檔案是儲存密碼的,普通使用者沒有許可權查看,一定要看的話可以執行“$ sudo cat /etc/shadow”,這時系統會要求輸入目前使用者密碼,輸密碼雖然麻煩,但安全性高了,至少各類背景程式不能偷偷地搞小動作了。要給某個使用者賦予sudo特權,就需要更改/etc/sudoers 檔案中的內容,該檔案能設定使用者或使用者組行使sudo權利的命令範圍,甚至可以設定sudo時不用輸入密碼,不過這自然是不安全的,不推薦。
su命令,用來切換目前使用者。所以如果嫌sudo太麻煩,就可以使用su臨時切換到root使用者,切換使用者時須輸入目標使用者的密碼。root使用者使用su命令切換到任何使用者都不需要輸入密碼,所以我們要在/etc/sudoers中明確禁止su被sudo特權執行。
和使用者組類似,使用者也有實際使用者和有效使用者(即上文說的目前使用者)的概念,分別可用who am i 和 whoami 查看。
檔案[屬性和許可權]
Linux環境大小寫敏感,檔案名稱也是,在檔案名稱前加上“.”則該檔案[夾]將隱藏。和windows不同,檔案基本上沒有副檔名,因為Linux不根據副檔名判斷檔案類型,而是根據檔案的內容來判斷。。
檔案串連,也是一種檔案類型,基於inode,inode包含檔案的元資訊。我們可以將inode簡單理解成一個指標,指向檔案所在磁碟中的物理位置,多個檔案名稱可以指向同個inode,這意味著,可以用不同的檔案名稱訪問同樣的內容;對檔案內容進行修改,會影響到所有檔案名稱;但是,刪除一個檔案名稱,不影響另一個檔案名稱的訪問,這種情況就被稱為"永久連結"(hard link)。除了永久連結以外,還有一種特殊情況。檔案A和檔案B的inode號碼雖然不一樣,但是檔案A的內容是檔案B的路徑。讀取檔案A時,系統會自動將訪問者導向 檔案B。因此,無論開啟哪一個檔案,最終讀取的都是檔案B。這時,檔案A就稱為檔案B的"軟連結"(soft link)或者"符號連結(symbolic link)。軟串連和永久連結最大的不同是:軟串連指向的是目標檔案的檔案名稱,而永久連結指向的是目標檔案的inode,軟串連兩個檔案的inode是不一樣的,不會影響目標檔案inode的串連數。更多內容可參看Linux的inode的理解。
建立串連用ln,如果是複製cp命令,那麼產生的是一個內容一樣的新檔案。
檔案許可權:r、w、x、s、t。前三者分表表示讀、寫、執行。由於許可權可自由組合,所以以標誌位的形式設計是最合理的。用數字表示,r為4,w為2,x為1,那麼5就是r-x,rwx就是7。檔案按順序規定了擁有者、所屬組和其他無關者的許可權許可權,如777即表示所有使用者都對檔案有讀寫執行許可權,600表示只有擁有者有對該檔案的許可權,且該許可權為讀寫權限即rw-。
我們可以使用chmod命令改變檔案許可權,如 chmod 700 testtext,這是數字許可權法,還可以使用文字表示許可權更改,如 chmod u+w testtext,表示給擁有者加上寫入權限。u、g、o、a分別表示擁有者、所屬組、其他無關者和全部,+、-、=分別表示增加、減去、設定。
還有s、t,這兩個許可權代表什麼呢?先說s,將檔案的擁有者和使用者組許可權的執行位設定成s,分別稱之為SUID和SGID,對二進位程式有效,SGID還能用在目錄上。一個檔案本身具有uid和gid的屬性,表示擁有者和所屬組,在檔案被執行時,還會多出兩個屬性——euid和egid——分別表示執行檔案的有效(當前)使用者ID和有效(當前)使用者組ID,Linux核心主要是根據euid和egid來確定進程對資源的存取權限。下面舉個例子就清楚了:
假設檔案myfile是屬於foo使用者的,是可執行檔,現在沒設SUID位,許可權位是rwxr-xr-x,foo使用者的uid和gid分別為200和201。另有一使用者kevin,他的uid和gid分別為204和202。那麼kevin運行myfile程式形成的進程的 euid=uid=204,egid=gid=202,核心根據這些值來判斷進程對資源訪問的限制,其實就是kevin使用者對資源訪問的許可權,和foo沒關係。然後我們將myfile設為SUID,則euid和egid變成被啟動並執行程式的所有者的uid和gid,即現在kevin使用者運行myfile,euid=200,egid=201,則這個進程具有它的屬主foo的資源存取權限。http://i.cnblogs.com/EditPosts.aspx?postid=4678311
不知道執行SUID檔案過程中,之前提到的系統的有效使用者和有效使用者組是否也對應於執行檔案時的euid和egid, 即上例後半部,kevin運行myfile時,此時的系統有效使用者是kevin還是foo呢?這個問題留待日後驗證。
SUID的作用就是這樣:讓本來沒有相應許可權的使用者運行這個程式時,可以訪問他沒有許可權訪問的資源。
SGID在二進位程式上的功效和SUID類似,在目錄上能產生如下效果:假設該目錄的所屬組為gA,那麼有效使用者組為gB的使用者進入此目錄後,該使用者的有效使用者組就變成gA了,那麼建立新檔案,新檔案的使用者組就是gA。SGID如此,那麼是否上述紅字描述的問題也是一般答案呢?
更多內容可參看linux:SUID、SGID詳解。
t,將檔案的其他無關者許可權執行位設為t,稱為SBIT,僅對目錄有效。功效:使用者在設定了SBIT目錄下建立的檔案,只有自己和root才有權利刪除此檔案。
其它
$PATH環境變數,決定了shell將到哪些目錄中尋找命令或程式,PATH的值是一系列目錄,當您運行一個程式時,Linux在這些目錄下進行搜尋編譯連結。
cpio命令:顧名思義,即輸入輸出的copy,現代電腦的標準輸入就是鍵盤,標準輸出是螢幕,我們可以通過重新導向(|、>、<)輸入輸出,用它進行檔案拷貝、打包解包等,和find等命令一起能發揮很大功效。關於cpio命令的中文man,可參看cpio命令詳解
fork:拷貝一個子進程。如果一個進程fork之後,此時連同該進程是3個進程(該進程、fork後的父進程、fork後的子進程)呢,還是2個進程(該進程即fork後的父進程、fork後的子進程)呢?日後再解。
小結
接觸到現在,概念倒還罷了,Linux的命令也忒多了,目前簡單瞭解的有:man、cd、cp、kill、mkdir、mv、rm、nohup、cpio、ls、ln、jobs、find、whereis、which、type、tar、chmod、chown、su、sudo、gzip、cat、tail、bg、fg、at、crontab、echo、fork、ps、top……且不說每個命令各自的命令參數,尼瑪,只能說用多如牛毛來形容了。
轉載本文請註明出處:http://www.cnblogs.com/newton/p/4678311.html