0%

Linux (一) - 基本概念與系統操作

Linux

Linux 是一個以 Unix 為原型所打造出來的開放原始碼的作業系統,最初是由芬蘭人 Linus Torvalds 出於自身愛好所創建的。

Linux 現今已成為了許多企業的伺服器所採用的作業系統,因為 Linux 具備了以下幾個優勢 :

  • 開源、免費
  • 跨平台硬體支援
  • 豐富的軟體支援
  • 多使用者、多工
  • 安全性可靠
  • 穩定性高
  • 網路功能完善

Linux 發行版本

Linux 因為是開源的,所以漸漸地衍生出了許多不同的版本,而所謂的不同版本是指開發者們基於 Linux Kernel (也就是 Linux 創始人 Linus Torvalds 所維護的核心本版) 在加上一些不同的功能。

目前市面上較有名的發行版有以下幾個 :

  • Ubuntu
  • CentOS
  • RedHat
  • Debian
  • Fedora
  • Arch Linux

Ubuntu 是以桌面應用為主的 Linux 發行版,擁有精美的 GUI 介面和豐富的應用軟體,對於新手來說可以很簡單的進行安裝、更新和操作,因此也讓 Ubuntu 在 Linux 的市佔率將近六成。

RedHat 是專門提供給企業使用的收費 Linux 發行版 REHL(RedHat Enterprise Linux),RedHat 公司會提供技術支持和版本的更新,因此 RedHat 提供了很穩定的 Linux 系統。

CentOS (Community Enterprise OS) 是 RedHat 公司所推出的免費 Linux 發行版,基本上是依照 REHL 所開放的原始碼所編譯而成,因此也和 REHL 一樣擁有高度的穩定度。而 CentOS 和 REHL 的差別在於沒有封閉的原始碼軟體,也就是不能享受到 RedHat 公司所提供的各類軟體支援。但是因為 CentOS 是免費的又同時擁有 REHL 的穩定度,所以被許多公司採用來架設伺服器。

這裡只介紹了幾個比較常被使用的 Linux 發行版,其他還有許多不同的 Linux 發行版在此就不再贅述了。

Linux 基本系統指令

取得 root 權限

Linux 系統中最高權限的管理者帳號為 root,也稱為超級使用者 (super user)。root 在使用上沒有任何的限制,所以只要使用 root 就可以對系統任意的進行變更。

但也因為 root 權限太高了,如果一個不小心是會把整個系統毀了,所以不建議直接使用 root 來登入進行操作。因此如果遇到需要取得 root 的權限時,再使用 sudosu 指令來取得 root 權限,這種作法就像是 Windows 也不會直接以系統管理員 (Administrator) 直接登入,而是在需要的時候再要求以系統管理員身分執行應用。

su

su 指令可以讓一般的使用者取得 root 的權限,輸完 root 的密碼後取得 root 的權限的使用者就可以享用 root 的權限進行系統的各種操作。

1
su

使用 su 取得 root 的權限後雖然 user id 會變成 root 的 user id 0,但是環境變數是不會跟著改變的。

因此若是需要更複雜的系統管理操作,並且會牽涉到 root 的環境變數,那就需要使用 su - 來切換。這種方式就可以仿照以 root 登入,會進入一個完整的 Shell 環境,就如同是 root 登入一樣。

1
su -

如果只是要執行一個簡單的指令,建議可以使用 su - -c,讓指令執行完直接跳離 root,這樣會比較安全。

1
su - -c <command>

sudo

sudo 指令類似於 su,差別在於 sudo 指令在取得 root 權限時要輸入的是自己這個帳號的密碼,使用上較為方便,因此大多都會使用 sudo。

sudo 的執行方式類似於 su -c,也就是執行完命令就會跳離 root。這個是最常使用的方式。

1
sudo <command>

如果想要和 su 一樣進入 root 的視窗,可以結合 sudo su,也不需要輸入 root 的密碼。

1
sudo su

以 root 登入。

1
sudo su -

權限管理

sudo 指令可以取得 root 的權限雖然很方便,但是以真正的系統環境來說並不能讓所有的使用者都可以使用 root 的權限,所以就要透過設定來決定是否可以使用 sudo 指令。

首先先介紹要設定的內容,如下 :

1
account host=(change account) command

account
輸入可以使用 sudo 的帳號名稱。

host
限制使用者從特定主機連線才可以使用 sudo,若不限制則指定為 ALL

change account
限制取得其他帳號的權限,若不限制則指定為 ALL

command
限制取得 sudo 後可以執行的指令,若不限制則指定為 ALL

範例
以 CentOS 為例,先使用 visudo 即可以 vi 編輯器開啟 sudo 設定檔。

1
sudo visudo

接著將要設定的內容貼在設定檔內,如下 :

1
user1 ALL=(ALL) ALL

不用密碼
如果每次使用 sudo 都要輸入密碼也是很麻煩,所以對於可以信任的使用者可以設定使用 sudo 不需要輸入密碼,如下 :

1
user1 ALL=(ALL) NOPASSWD:ALL

系統資訊

顯示系統時間

1
2
3
$ date

Thu Sep 24 02:51:10 GMT 2020

顯示本月月曆

1
2
3
4
5
6
7
8
9
$ cal

September 2020
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

顯示開機時數

1
2
3
$ uptime

02:54:11 up 18:14, 1 user, load average: 0.00, 0.01, 0.05

顯示上線用戶清單

1
2
3
4
5
$ w

02:54:46 up 18:14, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
opc pts/0 158.101.128.54 02:51 6.00s 0.04s 0.01s w

顯示目前用戶

1
2
3
$ whoami

opc

顯示系統核心資訊

1
2
3
$ uname -a

Linux srvdocker2 3.10.0-1127.19.1.el7.x86_64 #1 SMP Tue Aug 25 17:23:54 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

顯示 CPU 資訊

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
$ cat /proc/cpuinfo

processor : 0
vendor_id : AuthenticAMD
cpu family : 23
model : 1
model name : AMD EPYC 7551 32-Core Processor
stepping : 2
microcode : 0x1000065
cpu MHz : 1996.251
cache size : 512 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm art rep_good nopl extd_apicid eagerfpu pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core retpoline_amd ssbd ibpb vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 virt_ssbd arat
bogomips : 3992.50
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:

processor : 1
vendor_id : AuthenticAMD
cpu family : 23
model : 1
model name : AMD EPYC 7551 32-Core Processor
stepping : 2
microcode : 0x1000065
cpu MHz : 1996.251
cache size : 512 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 1
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm art rep_good nopl extd_apicid eagerfpu pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core retpoline_amd ssbd ibpb vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 virt_ssbd arat
bogomips : 3992.50
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:

顯示記憶體資訊

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
$ cat /proc/meminfo

MemTotal: 1011376 kB
MemFree: 169548 kB
MemAvailable: 651252 kB
Buffers: 3108 kB
Cached: 520476 kB
SwapCached: 0 kB
Active: 376964 kB
Inactive: 367732 kB
Active(anon): 252852 kB
Inactive(anon): 19412 kB
Active(file): 124112 kB
Inactive(file): 348320 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 40 kB
Writeback: 0 kB
AnonPages: 221144 kB
Mapped: 91076 kB
Shmem: 51152 kB
Slab: 57544 kB
SReclaimable: 29192 kB
SUnreclaim: 28352 kB
KernelStack: 2880 kB
PageTables: 6524 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 505688 kB
Committed_AS: 1181300 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 24936 kB
VmallocChunk: 34359685116 kB
Percpu: 560 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 103244 kB
DirectMap2M: 942080 kB
DirectMap1G: 0 kB

顯示磁碟資訊 (Disk Free)

1
2
3
4
5
6
7
8
9
10
$ df -h

Filesystem Size Used Avail Use% Mounted on
devtmpfs 461M 0 461M 0% /dev
tmpfs 494M 0 494M 0% /dev/shm
tmpfs 494M 50M 444M 11% /run
tmpfs 494M 0 494M 0% /sys/fs/cgroup
/dev/sda3 39G 2.9G 36G 8% /
/dev/sda1 512M 12M 501M 3% /boot/efi
tmpfs 99M 0 99M 0% /run/user/1000

顯示目錄的磁碟用量

1
2
3
4
5
6
7
8
$ du

4 ./.ssh
4 ./.cache/abrt
4 ./.cache
0 ./.config/abrt
0 ./.config
24 .

顯示記憶體與 Swap 區的用量

1
2
3
4
5
$ free

total used free shared buff/cache available
Mem: 1011376 289888 168164 51208 553324 650360
Swap: 0 0 0

關機

Linux 多用於伺服器使用,很少會用到關機的操作,通常是要進行升級或是維修等等才會進行關機。另外關機是需要有 root 的管理權限的,所以在下關機指令前要使用 sudo 切換到 root

sync

在關機前,要習慣先執行 sync 指令將資料同步寫進硬碟。

1
sync

shutdown

shutdown 指令是一般 Linux 系統建議的關機方式,在使用 shutdown 指令關機時所有登入的使用者都會收到通知。而若是有設定自動關機的時間,則在關機前 5 分鐘會禁止所有新的使用者進行登入。

1
shutdown [option] TIME [message]

TIME 用於指定關機時間,可以用以下幾種格式指定 :

  • now : 立即關機。
  • +m : 指定多少分鐘之後關機,例如 : +10 就是 10 分鐘後關機。
  • hh:mm : 以 24 小時制指定特定時間點關機,例如 : 20:24 就是晚上 8 點 24 分關機。

Option

  • -r : 重新開機
  • -h : 系統停止運作 (halt) 或關閉電源 (power off)
  • -H : 系統停止運作 (halt)
  • -P : 關閉電源
  • -c : 取消先前設定的關機命令
  • -k : 模擬關機,只對使用者發出關機通知並禁止新進入的使用者,不會真的關機

停止運作 (halt) 和 關閉電源 (power off) 的差別在於停止運作是停止所有 CPU 的運作,而關閉電源就會通知電腦關閉電源,就是一般所謂的關機。

範例

立即關機

1
shutdown -h now

指定時間關機

1
2
3
$ shutdown -h 16:30

Shutdown scheduled for Wed 2020-09-23 16:30:00 GMT, use 'shutdown -c' to cancel.

關機並發送通知給所有使用者

1
2
3
$ shutdown -h 16:30 "Server will shutdown at 16:30 for maintenance."

Shutdown scheduled for Wed 2020-09-23 16:30:00 GMT, use 'shutdown -c' to cancel.

重新啟動

1
2
3
4
5
$ shutdown -r

Shutdown scheduled for Wed 2020-09-23 08:14:50 GMT, use 'shutdown -c' to cancel.
Broadcast message from root@srvdocker2 (Wed 2020-09-23 08:13:50 GMT):
The system is going down for reboot at Wed 2020-09-23 08:14:50 GMT!

halt

halt 指令不管系統現在狀態如何會直接停止系統運作,等同於 shutdown -H

1
halt -f

poweroff

poweroff 指令不管系統狀態如何直接強行關閉電源。等同於 shutdown -P

1
poweroff -f

reboot

reboot 指令會重新啟動電腦,等同於 shutdown -r

1
reboot

last

last 指令可以列出目前和過去登入系統的使用者相關資訊,這裡只介紹如何查看關機的紀錄。

1
last -x  [command]

command 可以指定 shutdown 或是 reboot。

範例
查看關機紀錄

1
2
3
4
5
6
7
$ last -x shutdown

shutdown system down 3.10.0-1127.19.1 Wed Sep 23 08:24 - 08:40 (00:15)
shutdown system down 3.10.0-1127.19.1 Wed Sep 23 08:06 - 08:07 (00:00)
shutdown system down 3.10.0-1127.19.1 Tue Sep 22 08:47 - 08:48 (00:01)

wtmp begins Mon Sep 21 02:25:22 2020

查看重新啟動紀錄

1
2
3
4
5
6
7
8
9
$ last -x reboot

reboot system boot 3.10.0-1127.19.1 Wed Sep 23 08:40 - 08:42 (00:02)
reboot system boot 3.10.0-1127.19.1 Wed Sep 23 08:15 - 08:24 (00:09)
reboot system boot 3.10.0-1127.19.1 Wed Sep 23 08:07 - 08:24 (00:17)
reboot system boot 3.10.0-1127.19.1 Tue Sep 22 08:48 - 08:06 (23:18)
reboot system boot 3.10.0-1127.19.1 Mon Sep 21 02:25 - 08:47 (1+06:21)

wtmp begins Mon Sep 21 02:25:22 2020

Linux 快捷鍵

按鍵 功能
顯示前一個命令
Ctrl+R 搜尋執行過的命令
Ctrl+Z 將執行中的命令移至背景執行
Ctrl+C 停止執行中的命令
Ctrl+D 登出 Terminal,等同 exit 命令
Ctrl+L 清除螢幕顯示,等同 clear 命令
!! 再次執行上一個命令
Ctrl+E 游標移至尾端,等同 End 鍵
Ctrl+A 游標移至開頭,等同 Home 鍵
Ctrl+U 剪下游標前的所有文字並複製到剪貼簿
Ctrl+K 剪下游標後的所有文字並複製到剪貼簿
Ctrl+Y 貼上從 Ctrl+U 或 Ctrl+K 所剪下的內容
Ctrl+W 刪除游標前方的單字
Ctrl+Shift+C 複製選取的文字
Ctrl+Shift+V 貼上選取的文字
Tab 命令補全或文件補全

Tab

這裡特別介紹 Tab 鍵,Tab 鍵可以依照目前輸入的內容自動的補齊剩下的內容,或是列出所有可用的命令及文件名稱。

Tab 一次 : 若目前輸入內容只有唯一的檔案或指令會自動補齊。
Tab 兩次 : 列出所有與目前輸入內容有關的指令或檔案

範例
列出所有與目前輸入內容有關的指令。

1
2
3
$ do[Tab][Tab]
do dockerd docker-proxy done dosfslabel
docker docker-init domainname dosfsck

當第一個指令完整輸入完後,再輸入兩次 Tab 就會列出目前資料夾下的檔案或是這個指令可以使用的命令參數。

1
2
3
4
5
6
7
8
$ docker [Tab][Tab]
attach cp help kill pause restart service tag wait
build create history load plugin rm stack top
builder diff image login port rmi start trust
commit engine images logout ps run stats unpause
config events import logs pull save stop update
container exec info network push search swarm version
context export inspect node rename secret system volume

Summary

本篇簡單介紹了一些 Linux 的概念,並且也介紹了一些系統操作的基本指令,而上述這些指令也都是對於學習 Linux 來說必須要了解的。

參考

[1] Linux 簡介 | RUNOOB
[2] 常用的Linux版本介紹
[3] Linux 關機指令(shutdown、halt 與 poweroff)教學與範例
[4] Linux常用命令last的使用方法詳解
[5] Linux 的 su 與 sudo 指令教學與範例
[6] How to sudo without password on CentOS Linux
[7] Linux常用Terminal命令與快捷鍵參考
[8] Bash 使用 Tab 自動完成 檔案或目錄的輸入