出處 | 極客時間《趣談 linux 操作系統》專欄
如果你還沒有上手用過 Linux,那么學習《趣談 Linux 操作系統》,你可能會感受到困惑。因為沒有一手的體驗,你可能很難將 Linux 的機制和你的使用行為關聯起來。所以這一節,咱們先介紹幾個上手 Linux 的命令,通過這些命令,我們試試先把 Linux 用起來。
為什么我把 Linux 命令稱為“黑話”呢?就像之前我們介紹的,Linux 操作系統有很多功能,我們有很多種方式可以使用這些功能,其中最簡單和直接的方式就是命令行(Command Line)。命令行就相當于你請求 Linux 服務使用的專業術語。干任何事情,第一步就是學會使用正確的術語。這樣,Linux 作為服務方,才能聽的懂。這些術語可不就是“黑話”嗎?
Window 系統你肯定很熟悉吧?現在,我就沿著你使用 windows 的習慣,來給你介紹相應的 Linux 命令。
用戶與密碼
當我們打開一個新系統的時候,第一件要做的事就是登錄。系統默認有一個 Administrator 用戶,也就是系統管理員,它的權限很大,可以在這個系統上干任何事。Linux 上面也有一個類似的用戶,我們叫 Root。同樣,它也具有最高的操作權限。
接下來,你需要輸入密碼了。密碼從哪里來呢?對于 Windows 來講,在你安裝操作系統的過程中,會讓你設置一下 Administrator 的密碼;對于 Linux,Root 的密碼同樣也是在安裝過程中設置的。
對于 Windows,你設好之后,可以多次修改這個密碼。比如說,我們在控制面板的賬戶管理里面就可以完成這個操作。但是對于 Linux 呢?不好意思,沒有這么一個統一的配置中心了。你需要使用命令來完成這件事情。“命令”很好記,passwd,其實就是 password 的簡稱。
# passwd Changing password for user root. New password:
按照這個命令,我們就可以輸入新密碼啦。
在 Windows 里,除了 Administrator 之外,我們還可以創建一個以自己名字命名的用戶。那在 Linux 里可不可以創建其他用戶呢?當然可以了,我們同樣需要一個命令useradd。
useradd cliu8
執行這個命令,一個用戶就被創建了。它不會彈出什么讓你輸入密碼之類的頁面,就會直接返回了。因為接下來你需要自己調用 passwd cliu8 來設置密碼,再進行登錄。
在 Windows 里設置用戶的時候,用戶有一個“組”的概念。你可能沒注意過,不過我一說名字你估計就能想起來了,比如“Adminsitrator 組”“Guests 組”“Power User 組”等等。同樣,Linux 里也是分組的。前面我們創建用戶的時候,沒有說加入哪個組,于是默認就會創建一個同名的組。
能不能在創建用戶的時候就指定屬于哪個組呢?我們來試試。我們可以使用 -h 參數看一下,使用 useradd 這個命令,有沒有相應的選項。
[root@deployer ~]# useradd -h Usage: useradd [options] LOGIN useradd -D useradd -D [options] Options: -g, --gid GROUP name or ID of the primary group of the new account
一看還真有這個選項。以后命令不會用的時候,就可以通過 -h 參數看一下,它的意思是 help。
如果想看更加詳細的文檔,你可以通過 man useradd 獲得,細細閱讀。
上一節我們說過,Linux 里是“命令行 + 文件”模式。對于用戶的管理來說,也是一樣的。咱們通過命令創建的用戶,其實是放在 /etc/passwd 文件里的。這是一個文本文件。我們可以通過 cat 命令,將里面的內容輸出在命令行上。組的信息我們放在 /etc/group 文件中。
# cat /etc/passwd root:x:0:0:root:/root:/bin/bash ...... cliu8:x:1000:1000::/home/cliu8:/bin/bash # cat /etc/group root:x:0: ...... cliu8:x:1000:
在 /etc/passwd 文件里,我們可以看到 root 用戶和咱們剛創建的 cliu8 用戶。x 的地方應該是密碼,密碼當然不能放在這里,不然誰都知道了。接下來是用戶 ID 和組 ID,這和 /etc/group 里面就對應上了。
/root 和 /home/cliu8 是什么呢?它們分別是 Root 用戶和 cliu8 用戶的主目錄。主目錄是用戶登錄進去后默認的路徑。其實 Windows 里面也是這樣的。當我們打開文件夾瀏覽器的時候,左面會有“文檔”“圖片”“下載”等文件夾,路徑在 C:Userscliu8 下面。要注意,同一臺電腦,不同的用戶情況會不一樣。
/bin/bash 的位置是用于配置登錄后的默認交互命令行的,不像 Windows,登錄進去是界面,其實就是 explorer.exe。而 Linux 登錄后的交互命令行是一個解析腳本的程序,這里配置的是 /bin/bash。
瀏覽文件
終于登錄進來啦,接下來你可以在文件系統里面隨便逛一逛、看一看了。
可以看到,Linux 的文件系統和 Windows 是一樣的,都是用文件夾把文件組織起來,形成一個樹形的結構。這一點沒有什么差別。只不過在 Linux 下面,大多數情況,我們需要通過命令行來查看 Linux 的文件。
其實在 Windows 下也有命令行,例如cd就是 change directory,就是切換目錄;cd . 表示當前目錄;cd …表示上一級目錄;使用 dir,可以列出當前目錄下的文件。Linux 基本也是這樣,只不過列出當前目錄下的文件我們用的是ls,意思是 list。
我們常用的是 ls -l,也就是用列表的方式列出文件。
# ls -l drwxr-xr-x 6 root root 4096 Oct 20 2017 apt -rw-r--r-- 1 root root 211 Oct 20 2017 hosts
其中第一個字段的第一個字符是文件類型。如果是“-”,表示普通文件;如果是 d,就表示目錄。當然還有很多種文件類型,咱們后面遇到的時候再說,你現在先記住我說的這兩個就行了。
第一個字段剩下的 9 個字符是模式,其實就是權限位(access permission bits)。3 個一組,每一組 rwx 表示“讀(read)”“寫(write)”“執行(execute)”。如果是字母,就說明有這個權限;如果是橫線,就是沒有這個權限。
這三組分別表示文件所屬的用戶權限、文件所屬的組權限以及其他用戶的權限。例如,上面的例子中,-rw-r–r-- 就可以翻譯為,這是一個普通文件,對于所屬用戶,可讀可寫不能執行,對于所屬的組,僅僅可讀,對于其他用戶,也是僅僅可讀。如果想改變權限,可以使用命令 chmod 711 hosts。
第二個字段是硬鏈接(hard link)數目,這個比較復雜,講文件的時候我會詳細說。
第三個字段是所屬用戶,第四個字段是所屬組。第五個字段是文件的大小,第六個字段是文件被修改的日期,最后是文件名。可以通過命令chown改變所屬用戶,chgrp改變所屬組。
安裝軟件
好了,你現在應該會瀏覽文件夾了,接下來應該做什么呢?當然是開始安裝那些“裝機必備”的軟件啦!
在 Windows 下面,在沒有類似軟件管家的軟件之前,我們其實都是在網上下載 installer,然后再進行安裝的。
就以我們經常要安裝的 JDK 為例子。應該去哪里下載呢?為了安全起見,一般去官網比較好。如果你去 JDK 的官網,它會給你一個這樣的列表。
對于 Windows 系統,最方便的方式就是下載 exe,也就是安裝文件。下載后我們直接雙擊安裝即可。
對于 Linux 來講,也是類似的方法,你可以下載 rpm 或者 deb。這個就是 Linux 下面的安裝包。為什么有兩種呢?因為 Linux 現在常用的有兩大體系,一個是 centos 體系,一個是 Ubuntu 體系,前者使用 rpm,后者使用 deb。
在 Linux 上面,沒有雙擊安裝這一說,因此想要安裝,我們還得需要命令。CentOS 下面使用rpm -i jdk-XXX_linux-x64_bin.rpm進行安裝,Ubuntu 下面使用dpkg -i jdk-XXX_linux-x64_bin.deb。其中 -i 就是 install 的意思。
在 Windows 下面,控制面板里面有程序管理,我們可以查看目前安裝了哪些軟件,可以刪除這些軟件。
在 Linux 下面,憑借rpm -qa和dpkg -l就可以查看安裝的軟件列表,-q 就是 query,a 就是 all,-l 的意思就是 list。
如果真的去運行的話,你會發現這個列表很長很長,很難找到你安裝的軟件。如果你知道要安裝的軟件包含某個關鍵詞,可以用一個很好用的搜索工具 grep。
rpm -qa | grep jdk,這個命令是將列出來的所有軟件形成一個輸出。|是管道,用于連接兩個程序,前面 rpm -qa 的輸出就放進管道里面,然后作為 grep 的輸入,grep 將在里面進行搜索帶關鍵詞 jdk 的行,并且輸出出來。grep 支持正則表達式,因此搜索的時候很靈活,再加上管道,這是一個很常用的模式。同理dpkg -l | grep jdk也是能夠找到的。
如果你不知道關鍵詞,可以使用rpm -qa | more和rpm -qa | less這兩個命令,它們可以將很長的結果分頁展示出來。這樣你就可以一個個來找了。
我們還是利用管道的機制。more 是分頁后只能往后翻頁,翻到最后一頁自動結束返回命令行,less 是往前往后都能翻頁,需要輸入 q 返回命令行,q 就是 quit。
如果要刪除,可以用rpm -e和dpkg -r。-e 就是 erase,-r 就是 remove。
我們剛才說的都是沒有軟件管家的情況,后來 Windows 上有了軟件管家,就方便多了。我們直接搜索一下,然后點擊安裝就行了。
Linux 也有自己的軟件管家,CentOS 下面是 yum,Ubuntu 下面是 apt-get。
你可以根據關鍵詞搜索,例如搜索jdk、yum search jdk和apt-cache search jdk,可以搜索出很多很多可以安裝的 jdk 版本。如果數目太多,你可以通過管道 grep、more、less 來進行過濾。
選中一個之后,我們就可以進行安裝了。你可以用yum install JAVA-11-openjdk.x86_64和apt-get install openjdk-9-jdk來進行安裝。
安裝以后,如何卸載呢?我們可以使用yum erase java-11-openjdk.x86_64和apt-get purge openjdk-9-jdk。
Windows 上的軟件管家會有一個統一的服務端,來保存這些軟件,但是我們不知道服務端在哪里。而 Linux 允許我們配置從哪里下載這些軟件的,地點就在配置文件里面。
對于 Centos 來講,配置文件在 /etc/yum.repos.d/CentOS-Base.repo里。
[base] name=CentOS-$releasever - Base - 163.com baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-7
對于 Ubuntu 來講,配置文件在 /etc/apt/sources.list里。
deb http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse
這里為什么都是 163.com 呢?因為 Linux 服務器遍布全球,不能都從一個地方下載,最后選一個就近的地方下載,例如在中國,選擇 163.com,就不用跨越重洋了。
其實無論是先下載再安裝,還是通過軟件管家進行安裝,都是下載一些文件,然后將這些文件放在某個路徑下,然后在相應的配置文件中配置一下。例如,在 Windows 里面,最終會變成 C:Program Files 下面的一個文件夾以及注冊表里面的一些配置。對應 Linux 里面會放的更散一點。例如,主執行文件會放在 /usr/bin 或者 /usr/sbin 下面,其他的庫文件會放在 /var 下面,配置文件會放在 /etc 下面。
所以其實還有一種簡單粗暴的方法,就是將安裝好的路徑之間下載下來,然后解壓縮成為一個整的路徑。在 JDK 的安裝目錄中,Windows 有 jdk-XXX_Windows-x64_bin.zip,這是 Windows 下常用的壓縮模式。Linux 有 jdk-XXX_linux-x64_bin.tar.gz,這是 Linux 下常用的壓縮模式。
如何下載呢?Linux 上面有一個工具 wget,后面加上鏈接,就能從網上下載了。
下載下來后,我們就可以進行解壓縮了。Windows 下可以有 winzip 之類的壓縮解壓縮程序,Linux 下面默認會有 tar 程序。如果是解壓縮 zip 包,就需要另行安裝。
yum install zip.x86_64 unzip.x86_64 apt-get install zip unzip
如果是 tar.gz 這種格式的,通過 tar xvzf jdk-XXX_linux-x64_bin.tar.gz 就可以解壓縮了。
對于 Windows 上 jdk 的安裝,如果采取這種下載壓縮包的格式,需要在系統設置的環境變量配置里面設置JAVA_HOME和PATH。
在 Linux 也是一樣的,通過 tar 解壓縮之后,也需要配置環境變量,可以通過 export 命令來配置。
export JAVA_HOME=/root/jdk-XXX_linux-x64 export PATH=$JAVA_HOME/bin:$PATH
export 命令僅在當前命令行的會話中管用,一旦退出重新登錄進來,就不管用了,有沒有一個地方可以像 Windows 里面可以配置永遠管用呢?
在當前用戶的默認工作目錄,例如 /root 或者 /home/cliu8 下面,有一個.bashrc 文件,這個文件是以點開頭的,這個文件默認看不到,需要 ls -la 才能看到,a 就是 all。每次登錄的時候,這個文件都會運行,因而把它放在這里。這樣登錄進來就會自動執行。當然也可以通過 source .bashrc 手動執行。
要編輯.bashrc 文件,可以使用文本編輯器 vi,也可以使用更加友好的 vim。如果默認沒有安裝,可以通過 yum install vim 及 apt-get install vim 進行安裝。
vim 就像 Windows 里面的 notepad 一樣,是我們第一個要學會的工具。要不然編輯、查看配置文件,這些操作你都沒辦法完成。vim 是一個很復雜的工具,剛上手的時候,你只需要記住幾個命令就行了。
vim hello,就是打開一個文件,名字叫 hello。如果沒有這個文件,就先創建一個。
我們其實就相當于打開了一個 notepad。如果文件有內容,就會顯示出來。移動光標的位置,通過上下左右鍵就行。如果想要編輯,就把光標移動到相應的位置,輸入i,意思是 insert。進入編輯模式,可以插入、刪除字符,這些都和 notepad 很像。要想保存編輯的文本,我們使用esc鍵退出編輯模式,然后輸入“:”,然后在“:”后面輸入命令w,意思是 write,這樣就可以保存文本,冒號后面輸入q,意思是 quit,這樣就會退出 vim。如果編輯了,還沒保存,不想要了,可以輸入q!。
好了,掌握這些基本夠用了,想了解更復雜的,你可以自己去看文檔。
通過 vim .bashrc,將 export 的兩行加入后,輸入:wq,寫入并且退出,這樣就編輯好了。
運行程序
好了,裝好了程序,可以運行程序了。
我們都知道 Windows 下的程序,如果后綴名是 exe,雙擊就可以運行了。
Linux 不是根據后綴名來執行的。它的執行條件是這樣的:只要文件有 x 執行權限,都能到文件所在的目錄下,通過 ./filename運行這個程序。當然,如果放在 PATH 里設置的路徑下面,就不用./ 了,直接輸入文件名就可以運行了,Linux 會幫你找。
這是Linux 執行程序最常用的一種方式,通過 shell 在交互命令行里面運行。
這樣執行的程序可能需要和用戶進行交互,例如允許讓用戶輸入,然后輸出結果也打印到交互命令行上。這種方式比較適合運行一些簡單的命令,例如通過 date 獲取當前時間。這種模式的缺點是,一旦當前的交互命令行退出,程序就停止運行了。
這樣顯然不能用來運行那些需要“永遠“在線的程序。比如說,運行一個博客程序,我總不能老是開著交互命令行,博客才可以提供服務。一旦我要去睡覺了,關了命令行,我的博客別人就不能訪問了,這樣肯定是不行的。
于是,我們就有了Linux 運行程序的第二種方式,后臺運行。
這個時候,我們往往使用nohup命令。這個命令的意思是 no hang up(不掛起),也就是說,當前交互命令行退出的時候,程序還要在。
當然這個時候,程序不能霸占交互命令行,而是應該在后臺運行。最后加一個 &,就表示后臺運行。
另外一個要處理的就是輸出,原來什么都打印在交互命令行里,現在在后臺運行了,輸出到哪里呢?輸出到文件是最好的。
最終命令的一般形式為nohup command >out.file 2>&1 &。這里面,“1”表示文件描述符 1,表示標準輸出,“2”表示文件描述符 2,意思是標準錯誤輸出,“2>&1”表示標準輸出和錯誤輸出合并了。合并到哪里去呢?到 out.file 里。
那這個進程如何關閉呢?我們假設啟動的程序包含某個關鍵字,那就可以使用下面的命令。
ps -ef |grep 關鍵字 |awk '{print $2}'|xargs kill -9
從這個命令中,我們多少能看出 shell 的靈活性和精巧組合。
其中 ps -ef 可以單獨執行,列出所有正在運行的程序,grep 上面我們介紹過了,通過關鍵字找到咱們剛才啟動的程序。
awk 工具可以很靈活地對文本進行處理,這里的 awk '{print $2}'是指第二列的內容,是運行的程序 ID。我們可以通過 xargs 傳遞給 kill -9,也就是發給這個運行的程序一個信號,讓它關閉。如果你已經知道運行的程序 ID,可以直接使用 kill 關閉運行的程序。
在 Windows 里面還有一種程序,稱為服務。這是系統啟動的時候就在的,我們可以通過控制面板的服務管理啟動和關閉它。
Linux 也有相應的服務,這就是程序運行的第三種方式,以服務的方式運行。例如常用的數據庫 MySQL,就可以使用這種方式運行。
例如在 Ubuntu 中,我們可以通過 apt-get install mysql-server 的方式安裝 MySQL,然后通過命令systemctl start mysql啟動 MySQL,通過systemctl enable mysql設置開機啟動。之所以成為服務并且能夠開機啟動,是因為在 /lib/systemd/system 目錄下會創建一個 XXX.service 的配置文件,里面定義了如何啟動、如何關閉。
在 CentOS 里有些特殊,MySQL 被 Oracle 收購后,因為擔心授權問題,改為使用 MariaDB,它是 MySQL 的一個分支。通過命令yum install mariadb-server mariadb進行安裝,命令systemctl start mariadb啟動,命令systemctl enable mariadb設置開機啟動。同理,會在 /usr/lib/systemd/system 目錄下,創建一個 XXX.service 的配置文件,從而成為一個服務。
systemd 的機制十分復雜,這里咱們不討論。如果有興趣,你可以自己查看相關文檔。
最后咱們要學習的是如何關機和重啟。這個就很簡單啦。shutdown -h now是現在就關機,reboot就是重啟。
總結時刻
好了,掌握這些基本命令足夠你熟練操作 Linux 了。如果你是個初學者,這些命令估計看起來還是很多。我把今天這些基本的命令以及對應的操作總結了一下,方便你操作和查閱。
你不用可以去死記硬背,按照我講的這個步驟,從設置用戶和密碼、瀏覽文件、安裝軟件,最后到運行程序,自己去操作幾遍,再自己整理一遍,手腦并用,加深理解,鞏固記憶,效果可能會更好。
現在你應該已經學會了安裝 JDK 和 MySQL,你可以嘗試搭建一個基于 Java+MySQL 的服務端應用,上手使用一下。






