2024/04/21

Basic Linux commands

Commands

systemd and sysvinit

systemd 是 Linux 作業系統之下的一套中央化系統及設定管理程式(init),包括有常駐程式、函式庫以及應用軟體, 因為使用了 cgroup 與 fanotify 等 Linux 組件以實現其特性,所以只適用於 Linux。 有不少 Linux distribution 已將預設 init 程式從 SysVinit 改為使用 systemd, 但是目前仍然也有使用 SysVinit 或者是其它 init 程式的 Linux distribution。

Linux kernel 開機後,第一個執行的程式為 /sbin/init,如果使用 systemd 的系統,那麼這個檔案會是指向 systemd 的連結。 如果要檢查目前系統使用的 init 程式:

ps 1

檢查 systemd 是否有在使用:

stat /sbin/init

也可以使用 readlink 檢查:

readlink /sbin/init

如果是使用 systemd 的系統,Linux 可以選擇從 CLI 或者是 GUI 開機,如果要知道目前的選項,使用下面的命令:

sudo systemctl get-default

如果只是要 run-time 改變,改為 CLI:

sudo systemctl isolate multi-user.target

改為 GUI:

sudo systemctl isolate graphical.target

如果是要修改預設值從 CLI 開機:

sudo systemctl set-default multi-user.target

修改預設值從 GUI 開機:

sudo systemctl set-default graphical.target

如果預設為 GUI 環境,使用 ALT + CTRL + F1 ~ F6 可以切換到 console,如果要切回來, 使用指令 w 列出目前登入的使用者與 ttyx 的使用情況,按 ALT + Fx (x=1, 2, 3.., etc) 切回來。


如果是 sysvinit 系統,修改 /etc/inittab 檔案(修改預設值從 CLI 開機,那麼將 5 改為 3):

id:5:initdefault:

Shell

Shell 是使用者與 Linux kernel 溝通的橋樑,使用者輸入命令來執行各種各樣的任務。

UNIX 的 shell 有兩大主流,一個是 Bourne shell, 為貝爾實驗室 Stephen Bourne 在 1977 年在 Version 7 Unix 中針對大學與學院發布; 一個是 C shell,為 Bill Joy 在 BSD 系統上開發。

目前大多數的 Linux distribution 預設的 Shell 為 GNU Bash。 Bash (Bourne Again SHell) 是在 1987 年由布萊恩·福克斯為了 GNU 計劃而編寫,是 Bourne shell 的後繼相容版本與開放原始碼版本。 1989 年釋出第一個正式版本,原先是計劃用在 GNU 作業系統上,但能執行於大多數類 Unix 系統的作業系統之上。

下面是我的個人設定(使用家目錄下的 .bashrc),用來設定 Prompt 與一些命令的彩色化設定。

# Prompt
export PS1="\[\e[1;36m\]\u\[\e[0m\]@\h:\[\e[38;5;214m\]\w\[\e[0m\]> "

# Bash setting
export HISTCONTROL=ignoreboth

# alias command
alias ls="ls --color=auto"
alias diff="diff --color"
alias grep="grep --color=auto"

# Colors in Man Pages
export GROFF_NO_SGR=1         # For Konsole and Gnome-terminal
man() {
    LESS_TERMCAP_mb=$'\e[01;31m' \
    LESS_TERMCAP_md=$'\e[01;31m' \
    LESS_TERMCAP_me=$'\e[0m' \
    LESS_TERMCAP_se=$'\e[0m' \
    LESS_TERMCAP_so=$'\e[01;44;33m' \
    LESS_TERMCAP_ue=$'\e[0m' \
    LESS_TERMCAP_us=$'\e[01;32m' \
    command man "$@"
}

Tcsh 是一個向下相容 c shell 的 Unix shell。 它本質上是為 c shell 增加命令補完,命令編輯等其他功能。 Tcsh 目前是 FreeBSD 和其延伸發行版的預設 shell。

下面是我的個人設定(使用家目錄下的 .tcshrc),用來設定 Prompt 與一些命令的彩色化設定。

# Prompt
set promptchars = "%#"
set _orange="%{\033[38;5;214m%}"
set _cyan="%{\033[1;36m%}"
set _white="%{\033[0m%}"
set prompt="${_cyan}%n${_white}@%m:${_orange}%~${_white}%# "

unset _orange
unset _cyan
unset _white

# Tcsh setting
set histdup=erase

# alias command
alias ls="ls --color=auto"
alias diff="diff --color"
alias grep="grep --color=auto"

# Colors in Man Pages
set GROFF_NO_SGR=1         # For Konsole and Gnome-terminal
setenv LESS_TERMCAP_mb $'\e[01;31m'
setenv LESS_TERMCAP_md $'\e[01;31m'
setenv LESS_TERMCAP_me $'\e[0m'
setenv LESS_TERMCAP_se $'\e[0m'
setenv LESS_TERMCAP_so $'\e[01;44;33m'
setenv LESS_TERMCAP_ue $'\e[0m'
setenv LESS_TERMCAP_us $'\e[01;32m'

bash 可以使用 history 列出之前使用過的命令。
history -c 可以清除記錄的命令。

如果要將工作放入背景執行,在命令的最後加入 & 即可。
如果是要將工作暫停放入背景中,使用 CTRL + Z
承上,那要怎麼知道目前背景有哪些工作? 使用 jobs 可以列出來(-l 還會列出 PID 的號碼,-r:列出正在背景工具的程序, -s:則是列出正在背景中暫停的工作)。
承上,觀察上面的列表,在前面會有代表的號碼。可以使用 fg 或者是 fg %jobnumber 來將背景的工作恢復為前景運行中。
如果需要刪除背景的工作,可以使用 kill,方式為 kill %jobnumber
Bash 也有支援將工作送到背景的指令,使用 bg 或者是 bg %jobnumber

上面描述的都是 bash 產出的子程序,所以 logout 之後背景程序一樣會消失。 如果需要將工作放到系統背景,可以使用 nohup

File system

Linux 採用索引式檔案系統 (indexed allocation),通常會將這兩部份的資料分別存放在不同的區塊,權限與屬性放置到 inode 中, 至於實際資料則放置到 data block 區塊中。 另外,還有一個超級區塊 (superblock) 會記錄整個檔案系統的整體資訊,包括 inode 與 block 的總量、使用量、剩餘量等。

每個 inode 與 block 都有編號,至於這三個資料的意義可以簡略說明如下:

  • superblock:記錄此 filesystem 的整體資訊,包括 inode/block 的總量、使用量、剩餘量, 以及檔案系統的格式與相關資訊等;
  • inode:記錄檔案的屬性,一個檔案佔用一個inode,同時記錄此檔案的資料所在的 block 號碼;
  • block:實際記錄檔案的內容,若檔案太大時,會佔用多個 block 。

由於每個 inode 與 block 都有編號,而每個檔案都會佔用一個 inode ,inode 內則有檔案資料放置的 block 號碼。 因此,如果能夠找到檔案的 inode 的話,那麼自然就會知道這個檔案所放置資料的 block 號碼, 也就能夠讀出該檔案的實際資料。

File Permission

Every file in Unix has the following attributes −

  • Owner permissions − The owner's permissions determine what actions the owner of the file can perform on the file.

  • Group permissions − The group's permissions determine what actions a user, who is a member of the group that a file belongs to, can perform on the file.

  • Other (world) permissions − The permissions for others indicate what action all other users can perform on the file.

The permissions of a file are the first line of defense in the security of a Unix system. The basic building blocks of Unix permissions are the read, write, and execute permissions.

UNIX 系統使用 chmod 修改 permission。
下面是一個使用的例子(要注意 Unix permission 採用八進位計算):

chmod 644 index.html

如果要加上執行權限:

chmod +x index.html

如果要刪除執行權限:

chmod -x index.html

如果要更改擁有者或者是檔案的群組,使用 chown 進行修改。

Superuser

Linux 系統最高權限的管理者帳號為 root(user id 為 0 的帳號),也就是超級使用者(superuser)帳號。 因為 root 帳號權限很高,通常不建議直接使用 root 登入系統進行管理系統的動作。

su 指令可以讓一般使用者取得 root 權限,取得 root 權限的使用者就如同 root 一樣可以對系統進行各種管理動作。 另外,su 除了可以讓一般使用者取得 root 權限之外,也可以取得其他的帳號權限。下面是一個例子:

su danilo

sudo 指令類似 su,也是用來取得 root 或是其他帳號的權限,一般使用者可以在指令前加上 sudo 來以 root 身分執行任何指令。 系統會提示使用者提供 root 密碼。如果驗證成功,便會以 root 身分執行指令。

id -un 指令會列印目前使用者的登入名稱:

sudo id -un

sudo 可以使用 -u 指定要切換的使用者,-g 指定要切換的群組。

sudo 的主要規則組態檔案為 /etc/sudoers(如果是 openSUSE Tumbleweed,那麼使用 /usr//etc/sudoers)。 如果檔案格式錯誤,使用者可能無法順桘進入系統,因此強烈建議使用 visudo 來進行編輯。 visudo 可以防止發生編輯衝突,並會在儲存修改內容之前檢查語法錯誤。

Locale

Locale 設定由三個部分所組成:語言代碼 (Language Code)、地域 (Territory)、編碼 (Encoding)。 Locale 的設定名稱就是由這三個一起組成。

可以執行 locale 查詢目前的設定。

  1. LC_CTYPE: 字元分類及處理方式。
  2. LC_COLLATE: 字元順序與字串比較。
  3. LC_MESSAGES: 程式中用何種語言來顯示訊息。
  4. LC_MONETARY: 貨幣顯式格式。
  5. LC_NUMERIC: 數字顯式格式。
  6. LC_TIME: 日期與時間的顯式格式。
  7. LC_ALL: 一次設定以上所有的類別。
  8. LANG: 也可用來一次設定所有的 locale 環境,優先權低於 LC_ALL。

如果要列出目前支援的語系,使用下列的指令:

locale -a

Linux distribution 各個設定檔案(以及設定檔案位置)可能不同。

語系設定可以分為二個部份,系統預設的語系與桌面環境的設定。openSUSE 系統的設定在 /etc/locale.conf
如果在 KDE 環境下,KDE 會參考家目錄下的 .config/plasma-localerc 設定,因此桌面環境的設定可以不同於系統的設定。

如果要修改系統語系,可以嘗試下列的指令:

localectl set-locale LANG=en_US.utf8

如果想使用修改設定檔的方式,下面是修改 /etc/locale.conf 設定主語系 LANG 變數的例子:

LANG=zh_TW.UTF-8

系統所採用的 locale 設定優先性是 LC_ 環境變數高於 LANG 環境變數。LC_ALL 的優先性則是所有類別中最高的, 不過一般不建議設定 LC_ALL。

How long the system is up

使用 uptime 可以列出系統已經運作的時間。

Get the machine architecture

使用 arch 或者是 uname -m 可以列出系統的硬體架構。

Get the name of the host

使用 hostname 或者是 uname -n 可以列出目前的主機名稱。

Print the user name

使用 whoami 可以取得目前的使用者名稱。

List Current Logged In Users

使用 w 或者是 who command。

Date

使用 date 可以列出目前的時間。

如果只是要印出日期,可以使用:

date +%F

Calendar

使用 cal 可以列出這個月的月曆。

Output strings

如果需要顯示訊息,可以使用 echo
如果需要輸出格式化的訊息,可以使用 printf

printf "%s is %d years old.\n" Orange 19

Display result and output to file

如果需要顯示程式的結果並且儲存到檔案,可以使用 tee。

下面是一個例子:

ls -al | tee result

如果你只想要將結果儲存到檔案但是不顯示到 stdout,

下面是一個例子:

ls -al | tee result > /dev/null

Display file content

如果需要顯示檔案的內容,可以使用 cat。

下面是一個例子:

cat result

Display binary file content

如果使用 cat 觀察一些非文字檔案會顯示亂碼。 這時候可以嘗試使用 od 這個命令來顯示非文字檔檔案的內容,有以下的選項可以使用:

  • -A:選擇以何種進位表示位址偏移,-Ax 為十六進位,-An 表示不顯示位址偏移。
  • -a:具名字元,例如換行字元顯示為 nl。
  • -b:以八進制格式顯示。
  • -c:以 ASCII 字符格式顯示,換行字元會顯示為 \n。
  • -d:以有符號十進制格式顯示。
  • -x:以十六進制格式顯示。

文字檔案換行符號轉換

Linux/Unix-like 系列的作業系統文字檔案的換行字元為 \n; 與 Dos (以及 Windows 平台)的換行字元為 \r\n 不同。

可以使用 dos2unixunix2dos 嘗試換行符號轉換。

語系編碼轉換

可以使用 iconv 嘗試編碼轉換。

iconv -f big5 -t utf8 input_file -o output_file

Count the number of lines, words, and bytes in the file

如果需要計算檔案的行數,字數或者是大小,可以使用 wc。

其中 -l 為計算行數, -w 為計算 word 數, -c 為計算檔案的全部 bytes 數。

下面就是透過 ls 與計算行數的方式來算出目前目錄下的檔案與目錄數目:

ls | wc -l

Clears the terminal screen

如果需要清除 termial screen 的內容,可以使用 clear。
或者也可以使用 Ctrl + L 的組合鍵。

Copy and remove files

使用 cp 可以複製檔案或者是目錄。cp -r 可以遞迴地複製子目錄下的檔案。
使用 rm 可以刪除檔案或者是目錄。如果要強制刪除一個目錄以及目錄下的檔案,使用 rm -rf
如果要搬移目錄或者是檔案,使用 mv 這個命令。

建立連結檔

使用 ln 可以建立一個連結檔案。
所謂的硬連結就是使用相同 inode 的連結檔案,ln 指令預設就是建立硬連結(可以使用 ls -i 檢查)。
軟連結(符號連結)則是靠著絕對路徑或相對路徑來指向目標檔案的連結檔,若要使用 ln 指令建立軟連結,可以加上 -s 參數。

Create and remove directory

使用 mkdir 可以建立目錄。
使用 rmdir 可以刪除目錄。

Current working directory

使用 pwd 可以取得目前的目錄路徑。

grep

如果要搜尋檔案的內容,可以使用 grep,如果列出在哪一列 (-n) 以及搜尋各個目錄下的各個檔案 (-r),下面是一個範例:

grep -rn "tcl" .

find

如果要搜尋某些檔案以後殺掉,可以用:

find . -name "FILE-TO-FIND" -exec rm -rf {} \;

或者針對檔案的寫法:

find . -type f -name "FILE-TO-FIND" -exec rm -f {} \; 

如果要找出哪個 c 檔案中有 main 函式並且印出,則可以使用:

find . -type f -name *.c -print -exec grep main {} \;

head and tail

如果沒有指定參數,head 會列出一個檔案前十列的內容,而 tail 會列出一個檔案最後十列的內容。

下面是列出 Aapche Http Server error_log 最後十行的例子。

sudo tail /var/log/apache2/error_log

Compare text files

可以使用 diff 來比較文字檔案間的不同,我通常會使用 -Naur 參數取得更詳細的比較內容。

Compare binary files

可以嘗試使用下列的指令列出差異:

cmp -l file1.bin file2.bin | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}'

(這時候不是以 0,而是以 1 開始計算位置,和一般的慣例略有差異)

tar

tar 可以將多個目錄或檔案打包成一個檔案,而且可以透過 gzip/bzip2 的支援,對打包後的檔案進行壓縮。

壓 縮:tar -jcv -f filename.tar.bz2 要被壓縮的檔案或目錄名稱
查 詢:tar -jtv -f filename.tar.bz2
解壓縮:tar -jxv -f filename.tar.bz2 -C 欲解壓縮的目錄
選項與參數:
-c :建立打包檔案,可搭配 -v 來察看過程中被打包的檔名(filename)
-t :察看打包檔案的內容含有哪些檔名,重點在察看『檔名』就是了;
-x :解打包或解壓縮的功能,可以搭配 -C (大寫) 在特定目錄解開
特別留意的是, -c, -t, -x 不可同時出現在一串指令列中。
-J :透過 xz 的支援進行壓縮/解壓縮:此時檔名最好為 *.tar.xz
-j :透過 bzip2 的支援進行壓縮/解壓縮:此時檔名最好為 *.tar.bz2
-z :透過 gzip 的支援進行壓縮/解壓縮:此時檔名最好為 *.tar.gz
-v :在壓縮/解壓縮的過程中,將正在處理的檔名顯示出來!
-f filename:-f 後面要立刻接要被處理的檔名!建議 -f 單獨寫一個選項囉!
-C 目錄 :這個選項用在解壓縮,若要在特定目錄解壓縮,可以使用這個選項。

Report the file system disk space usage

可以使用 df 這個命令。

df -h

List block devices

可以使用 lsblk 這個命令來列出 block devices。

如果要確認,可以使用 fdisk 來確認:

sudo fdisk -l

List systemd services

如果需要列出目前 systemd 正在執行的 services,可以使用下列的指令:

pstree

工作管理員程式

top (table of processes)是一個工作管理員程式,用於監看目前所有程式的執行狀況, 顯示有關 CPU 和記憶體利用率的資訊。在程式執行後,按 q 可以離開程式。

檢查處理程序狀態

使用者可以使用 ps 指令來尋找正在執行中的處理程序,並顯示這些處理程序的相關資訊。

顯示所有在系統上執行的處理程序:

ps -ef

也可以使用下列的參數 (-aux) 顯示所有在系統上執行的處理程序:

ps -aux

在 Linux 中掛載 ISO 檔案

如果需要在 Linux 中掛載 ISO 檔案來存取資料的話,下面是如何掛載的範例:

# cd /mnt
# mkdir cdrom
# mount /home/danilo/Desktop/openSUSE-11.3-DVD-i586.iso /mnt/cdrom -o loop

在 Linux 中建立 ISO 檔案

使用 mkisofs 建立。下面是一個範例:

mkisofs -o home.iso /home/danilo

Create usb boot disk

  • 下載 live image
  • 使用下列的 command:
dd if=image.iso of=/dev/sdb bs=4M;sync

其中 image.iso 和 /dev/sdb 要換成符合自己環境的參數。

Increase The Maximum Number Of Open Files / File Descriptors (FD)

Use the following command command to display maximum number of open file descriptors:

cat /proc/sys/fs/file-max

The hard limit is the ceiling for the soft limit. The soft limit is what is actually enforced for a session or process. This allows the administrator (or user) to set the hard limit to the maximum usage they wish to allow. Other users and processes can then use the soft limit to self-limit their resource usage to even lower levels if they so desire.

針對各個使用者的設定,如果要查詢目前的情況:

ulimit -Sn
ulimit -Hn

要變更設定,可以編輯 /etc/security/limits.conf,下面是設定範例:

danilo soft nofile 80920
danilo hard nofile 102400

要重開機以後才會生效。

參考資料

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。