Linux從入門到入坑
Linux簡介
Linux作業系統
Linux,全稱GNU/Linux,是一種免費使用和自由傳播的類UNIX作業系統,其核心由林納斯·本納第克特·託瓦茲於1991年10月5日首次釋出,它主要受到Minix和Unix思想的啟發,是一個基於POSIX的多使用者、多工、支援多執行緒和多CPU的作業系統。它能執行主要的Unix工具軟體、應用程式和網路協議。它支援32位和64位硬體。Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多使用者網路作業系統。Linux有上百種不同的發行版,如基於社群開發的debian、archlinux,和基於商業開發的[Red Hat Enterprise Linux](
目前市面上較知名的發行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。
總結:
- Windows 收費閉源作業系統,主要用於日常辦公、遊戲、娛樂多一些 -
- Linux 免費的,開源的,主要用於伺服器領域,效能穩定,安全
- Unix 用於封閉的硬體環境,企業的應用依賴於定製化開發
核心
- 什麼是作業系統?
作業系統是負責整個系統最基本功能和系統管理,包括核心、裝置驅動程式、啟動載入程式、命令列shell或其它種類的使用者介面、基本的檔案管理工具和系統工具。
使用者介面是作業系統的外在表象,核心是作業系統的內在核心。
- 什麼是核心?
核心由一系列程式組成,包括負責響應中斷的中斷服務程式、負責管理多個程序從而分享處理器時間的排程程式、負責管理地址空間的記憶體管理程式、網路、程序間通訊的系統服務程式等。
核心負責管理系統的硬體裝置。
- 核心空間 VS 使用者空間
核心空間表示核心擁有的記憶體空間,使用者空間表示使用者程式執行時的記憶體空間。
核心擁有直接訪問硬體裝置的所有許可權,使用者程式不能直接訪問硬體裝置,因此使用者程式通過系統呼叫和核心通訊來執行。
Linux核心
作業系統是一個用來和硬體打交道併為使用者程式提供一個有限服務集的低階支撐軟體。一個計算機系統是一個硬體和軟體的共生體,它們互相依賴,不可分割。計算機的硬體,含有外圍裝置、處理器、記憶體、硬碟和其他的電子裝置組成計算機的發動機。但是沒有軟體來操作和控制它,自身是不能工作的。完成這個控制工作的軟體就稱為作業系統,在Linux的術語中被稱為“核心”,也可以稱為“核心”。Linux核心的主要模組(或元件)分以下幾個部分:儲存管理、CPU和程序管理、檔案系統、裝置管理和驅動、網路通訊,以及系統的初始化(引導)、系統呼叫等。
主要的子程式
- 系統呼叫介面
- 程序管理
- 記憶體管理
- 虛擬檔案系統
Linux核心的功能
1、程序管理
核心負責建立和銷燬程序,並處理它們與外部世界的聯絡(輸入和輸出)。不同程序間通訊(通過訊號,管道,或者程序間通訊原語)對整個系統功能來說是基本的,也由核心處理。另外,排程器,控制程序如何共享CPU,是程序管理的一部分。更通常地,核心的程序管理活動實現了多個程序在一個單個或者幾個CPU 之上的抽象。
2、記憶體管理
計算機的記憶體是主要的資源,處理它所用的策略對系統性能是至關重要的。核心為所有程序的每一個都在有限的可用資源上建立了一個虛擬地址空間。核心的不同部分與記憶體管理子系統通過一套函式呼叫互動,從簡單的malloc/free對到更多更復雜的功能。
3、檔案系統
Unix 在很大程度上基於檔案系統的概念;幾乎Unix中的任何東西都可看作一個檔案。核心在非結構化的硬體之上建立了一個結構化的檔案系統,結果是檔案的抽象非常多地在整個系統中應用。另外,Linux 支援多個檔案系統型別,就是說,物理介質上不同的資料組織方式。例如,磁碟可被格式化成標準Linux的ext3檔案系統,普遍使用的FAT 檔案系統,或者其他幾個檔案系統。
4、裝置控制
幾乎每個系統操作終都對映到一個物理裝置上。除了處理器,記憶體和非常少的別的實體之外,全部中的任何裝置控制操作都由特定於要定址的裝置相關的程式碼來進行,這些程式碼稱為裝置驅動.。核心中必須嵌入系統中出現的每個外設的驅動,,從硬碟驅動到鍵盤和磁帶驅動器。核心功能的這個方面是本書中的我們主要感興趣的地方。
5、網路
網路必須由作業系統來管理,因為大部分網路操作不是特定於某一個程序:進入系統的報文是非同步事件。報文在某一個程序接手之前必須被收集,識別,分發。系統負責在程式和網路介面之間遞送資料報文,它必須根據程式的網路活動來控制程式的執行。另外,所有的路由和地址解析問題都在核心中實現。
Linux的發展歷程
https://www.linuxprobe.com/origin-of-linux.html
centos7 的安裝
見部落格:http://101.37.172.180:8848/archives/vmware虛擬機器安裝centos7
初識Shell
shell是系統的使用者介面,提供了使用者與核心進行互動的一種介面。它接收使用者輸入的命令並把它送到核心中去執行。實際上Shell是一個命令直譯器,它解釋使用者輸入的命令並把使用者的意圖傳達給核心。(可以理解為使用者和核心之間的翻譯官角色)
Shell 分類
常見的Shell型別有sh, bash, csh, tcsh, ash,bash shell 是Linux預設的shell,
Shell 語法
命令:整條shell命令的主體部分
選項:會影響會微調命令的行為,通常以-或者--開頭
引數: 命令作用的物件(長引數,短引數)
bash的基本特性
自動補全
[root@localhost ~]# yum install -y bash-completion.noarch
快捷鍵
-
Ctrl + l - 清屏
-
Ctrl + A - 游標移到行首
-
Ctrl + E - 游標移到行尾
-
Ctrl + W - 清除游標之前一個單詞
-
Ctrl + K - 清除游標到行尾的字元
-
Ctrl + T - 交換游標前兩個字元
-
Ctrl + V - 輸入控制字元 如Ctrl+v ,會輸入^M
-
Ctrl + F - 游標後移一個字元
-
Ctrl + B - 游標前移一個字元
-
Ctrl + H - 刪除游標前一個字元
歷史命令
[root@localhost ~]# history
選項
- -c:將目前shell中的所有history命令消除(只清空快取,不清空檔案)
- -a:將目前新增的命令寫入 histfiles , 預設寫入 ~/.bash_history
- -d:刪除指定的歷史命令
- -r:將 histfiles 內容讀入到目前shell的history記憶中
- -w:將目前history記憶的內容寫入到 histfiles
- 使用 ! 執行歷史命令
# history [n] n為數字,列出最近的n條命令
[root@localhost ~]# history -w histfiles.txt 1
[root@localhost ~]# history -c ! number 執行第幾條命令 ! command 從最近的命令查到以 command 開頭的命令執行
!! 執行上一條
命令別名(alias)
[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
設定別名
[root@localhost ~]# alias cathis='cat /root/.bash_history'
[root@localhost ~]# cathis
取消別名
[root@localhost ~]# unalias cathis='cat /root/.bash_history'
man手冊
檢視某個命令的 man手冊
[root@localhost ~]# man ls
下載安裝中文版的man手冊
[root@localhost ~]# yum -y install man-pages-zh-CN.noarch
[root@localhost ~]# echo alias cman='man -M /usr/share/man/zh_CN' >> /root/.bashrc
[root@localhost ~]# source .bashrc
[root@localhost ~]# cman ls
檔案管理
檔案系統目錄結構
在Linux中,檔案以樹狀圖的形式表現出來。其中/ 為根目錄 只有一個根目錄 。所以也稱之為單根檔案系統
-
/bin:(Red Hat7以後,該目錄被淘汰)
bin 是 Binaries (二進位制檔案) 的縮寫, 這個目錄存放著最經常使用的命令。 -
/boot:
這裡存放的是啟動 Linux 時使用的一些核心檔案,包括一些連線檔案以及映象檔案。 -
/dev :
dev 是 Device(裝置) 的縮寫, 該目錄下存放的是 Linux 的外部裝置,在 Linux 中訪問裝置的方式和訪問檔案的方式是相同的。 -
/etc:
etc 是 Etcetera(等等) 的縮寫,這個目錄用來存放所有的系統管理所需要的配置檔案和子目錄。 -
/home:(普通使用者家目錄)
使用者的主目錄,在 Linux 中,每個使用者都有一個自己的目錄,一般該目錄名是以使用者的賬號命名的,如上圖中的 alice、bob 和 eve。 -
/root:
該目錄為系統管理員,也稱作超級許可權者的使用者主目錄。 -
/lib:
lib 是 Library(庫) 的縮寫這個目錄裡存放著系統最基本的動態連線共享庫,其作用類似於 Windows 裡的 DLL 檔案。幾乎所有的應用程式都需要用到這些共享庫。 -
/lost+found:
這個目錄一般情況下是空的,當系統非法關機後,這裡就存放了一些檔案。 -
/media:
linux 系統會自動識別一些裝置,例如U盤、光碟機等等,當識別後,Linux 會把識別的裝置掛載到這個目錄下。 -
/mnt:
系統提供該目錄是為了讓使用者臨時掛載別的檔案系統的,我們可以將光碟機掛載在 /mnt/ 上,然後進入該目錄就可以檢視光碟機裡的內容了。 -
/opt:
opt 是 optional(可選) 的縮寫,這是給主機額外安裝軟體所擺放的目錄。比如你安裝一個ORACLE資料庫則就可以放到這個目錄下。預設是空的。 -
/proc:
proc 是 Processes(程序) 的縮寫,/proc 是一種偽檔案系統(也即虛擬檔案系統),儲存的是當前核心執行狀態的一系列特殊檔案,這個目錄是一個虛擬的目錄,它是系統記憶體的對映,我們可以通過直接訪問這個目錄來獲取系統資訊。
這個目錄的內容不在硬碟上而是在記憶體裡,我們也可以直接修改裡面的某些檔案,比如可以通過下面的命令來遮蔽主機的ping命令,使別人無法ping你的機器:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
-
/sbin:
s 就是 Super User 的意思,是 Superuser Binaries (超級使用者的二進位制檔案) 的縮寫,這裡存放的是系統管理員使用的系統管理程式。 -
/selinux:
這個目錄是 Redhat/CentOS 所特有的目錄,Selinux 是一個安全機制,類似於 windows 的防火牆,但是這套機制比較複雜,這個目錄就是存放selinux相關的檔案的。 -
/srv:
該目錄存放一些服務啟動之後需要提取的資料。 -
/sys:
這是 Linux2.6 核心的一個很大的變化。該目錄下安裝了 2.6 核心中新出現的一個檔案系統 sysfs 。
sysfs 檔案系統集成了下面3種檔案系統的資訊:針對程序資訊的 proc 檔案系統、針對裝置的 devfs 檔案系統以及針對偽終端的 devpts 檔案系統。
該檔案系統是核心裝置樹的一個直觀反映。
當一個核心物件被建立的時候,對應的檔案和目錄也在核心物件子系統中被建立。
-
/tmp:
tmp 是 temporary(臨時) 的縮寫這個目錄是用來存放一些臨時檔案的。 -
/usr:
usr 是 unix shared resources(共享資源) 的縮寫,這是一個非常重要的目錄,使用者的很多應用程式和檔案都放在這個目錄下,類似於 windows 下的 program files 目錄。 -
/usr/bin:
系統使用者使用的應用程式。 -
/usr/sbin:
超級使用者使用的比較高階的管理程式和系統守護程式。 -
/usr/src:
核心原始碼預設的放置目錄。 -
/var:
var 是 variable(變數) 的縮寫,這個目錄中存放著在不斷擴充著的東西,我們習慣將那些經常被修改的目錄放在這個目錄下。包括各種日誌檔案。 -
/run:
是一個臨時檔案系統,儲存系統啟動以來的資訊。當系統重啟時,這個目錄下的檔案應該被刪掉或清除。如果你的系統上有 /var/run 目錄,應該讓它指向 run。
檔案定位 路徑
路徑的作用:定位檔案
絕對路徑:從根目錄下出發的路徑稱為絕對路徑
相對路徑:相對於當前目錄下出發的路徑稱為相對路徑
[root@localhost ~]# cd [路徑]
#相對路徑
[root@localhost ~]# mkdir test
[root@localhost ~]# cd test
#絕對路徑
[root@localhost ~]# cd /root/test
檔案管理 (檔案操作)
檔案(touch)
[root@localhost ~]# touch [fiile-name] # 無則建立,有則修改時間
[root@localhost ~]# touch file1 file2 file3
[root@localhost ~]# touch /home/{file4,file4}
[root@localhost ~]# touch test{1..1000}
# 建立test1-test1000 檔案
[root@localhost ~]# touch test{1,10}
# 建立test1 和 test10
目錄(mkdir)
[root@localhost ~]# mkdir dir
[root@localhost ~]# mkdir dir1 dir2 dir3
[root@localhost ~]# mkdir dir{1..5}
[root@localhost ~]# mkdir -p /dir/test/dir1
# 遞迴建立
選項:
-v:將建立的結果打印出來
-p:遞迴建立
拷貝(cp)
[root@localhost ~]# cp [目標file/目錄] [目的file/目錄]
[root@localhost ~]# cp /root/dir/test test1
引數
-a:相當於 -pdr 的意思,至於 pdr 請參考下列說明;(常用)
-d:若來源檔為連結檔的屬性(link file),則複製連結檔屬性而非檔案本身;
-f:為強制(force)的意思,若目標檔案已經存在且無法開啟,則移除後再嘗試一次;
-i:若目標檔(destination)已經存在時,在覆蓋時會先詢問動作的進行(常用)
-l:進行硬式連結(hard link)的連結檔建立,而非複製檔案本身;
-p:連同檔案的屬性一起復制過去,而非使用預設屬性(備份常用);
-r:遞迴持續複製,用於目錄的複製行為;(常用)
-s:複製成為符號連結檔 (symbolic link),亦即『捷徑』檔案;
移動(mv)
[root@localhost ~]# mv file1 /root/dir # 將file1移動到/root/dir
[root@localhost ~]# mv file2 /root/dir/file20
# 將file2 移動到 /root/dir 目錄下, 並改名為 file20
[root@localhost ~]# mv file3 file4
# 將file3改名為file4
刪除(rm)
[root@localhost ~]# rm -f(強制刪除) [file_name]
[root@localhost ~]# rm -r(遞迴刪除) [file_name] # 刪除目錄
[root@localhost ~]# rm -i [file_name] # 互動模式刪除
[root@localhost ~]# rm -rf [file_name]
檢視(cat)
除此之外還有:tac less more tail tailf
cat:從上往下(正常順序)開啟
tac:從下網上開啟
more:顯示進度 (空格翻頁、q退出)
head:預設從前面檢視10行
tail:從後面檢視
tailf:實時追蹤
管道符、重定向於環境變數
重定向
-
輸入輸出
- 標準輸入
- 標準正確輸出1
- 標準錯誤輸出2
-
輸出重定向
- '>' : 覆蓋重定向
- '>>' : 追加重定向
- '2>' : 覆蓋重定向錯誤輸出資料流
- '2>>' : 追加重定向錯誤輸出資料流
-
輸入重定向
- '<':覆蓋輸入重定向
- '<<':追加輸入重定向
-
標準輸出和錯誤輸出各自重定向至不同位置
[root@localhost ~]# commmand 1> /path/file.out 2> /path/error.out /dev/null
-
合併標準輸出和錯誤輸出為同一個資料流進行重定向
- '&>':覆蓋重定向
- '&>>': 追加重定向
- '2>&1': 將錯誤流重定向到標準輸出檔案中
- '1>&2': 將正確流重定向到標準錯誤輸出檔案中
-
標準輸入
[root@localhost ~]# cat > output <<EOF
> 123
> 456
> 678
> EOF
[root@localhost ~]# cat >> output <<EOF
> 789
> 456
> 123
> EOF
[root@localhost ~]# cat output
管道符命令
通俗來說,把前一個命令原本要輸出到螢幕上的內容當成後一個命令的資料 兩個命令用 " | " 分隔開
[root@localhost ~]# 命令1 | 命令2 | 命令3
[root@localhost ~]# grep "/sbin/nologin" /etc/passwd | wc -l
15
通過管道符重置使用者密碼
[root@localhost ~]# echo redhat | passwd --stdin root
Changing password for user root.
passwd: all authentication tokens updated successfully.
命令列的萬用字元
- '*': 代表匹配所有
[root@localhost ~]# ls -l /dev/sda*
brw-rw----. 1 root disk 8, 0 Oct 18 07:32 /dev/sda
brw-rw----. 1 root disk 8, 1 Oct 18 07:32 /dev/sda1
brw-rw----. 1 root disk 8, 2 Oct 18 07:32 /dev/sda2
- '?': 代表匹配單個字元
[root@localhost ~]# ls -l /dev/sda?
brw-rw----. 1 root disk 8, 1 Oct 18 07:32 /dev/sda1
brw-rw----. 1 root disk 8, 2 Oct 18 07:32 /dev/sda2
- 除了使用[0-9]來匹配 0~9 之間的單個數字,也可以用[135]這樣的方式僅匹配這三個指定 數字中的一個,若沒有匹配到,則不會顯示出來:
[root@localhost ~]# ls -l /dev/sda[0-9]
brw-rw----. 1 root disk 8, 1 Oct 18 07:32 /dev/sda1
brw-rw----. 1 root disk 8, 2 Oct 18 07:32 /dev/sda2
[root@localhost ~]# ls -l /dev/sda[135]
brw-rw----. 1 root disk 8, 1 Oct 18 07:32 /dev/sda1
重要的環境變數
變數是計算機系統用於儲存可變值的資料型別。在 Linux 系統中,變數名稱一般都是大 寫的,這是一種約定俗成的規範。我們可以直接通過變數名稱來提取到對應的變數值。Linux 系統中的環境變數是用來定義系統執行環境的一些引數,比如每個使用者不同的家目錄、郵件 存放位置等。
變數名 | 作用 |
---|---|
HOME | 使用者的主目錄(及家目錄) |
SHELL | 使用者在使用的Shell直譯器的名稱 |
HISTSIZE | 輸出的歷史命令條數 |
HISTFILESIZE | 保持的歷史命令條數 |
郵件儲存路徑 | |
LANG | 系統語言,語系名稱 |
RANDOM | 生成一個隨機數字 |
PS1 | Bash直譯器的提示符 |
PATH | 定義直譯器搜尋使用者執行命令的路徑 |
EDITOR | 使用者預設的文字編輯器 |
我們可以自己定義變數,例如定義一個變數WORKDIR,方便直接到達使用者工作的目錄,如下:
[root@localhost ~]# useradd user1
[root@localhost ~]# echo 123 | passwd --stdin user1
Changing password for user user1.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# mkdir /home/user1/test
[root@localhost ~]# WORKDIR=/home/user1/test/
[root@localhost ~]# cd $WORKDIR
[root@localhost test]# pwd
/home/user1/test
但是,這樣的變數不具有全域性性,作用範圍也有限,預設情況下不能被其他使用者所使用。可以使用export命令將其提升為全域性變數。
[root@localhost ~]# export WORKDIR
小工具
tr命令
[root@localhost ~]# tr [option] [set1] [set2]
常用選項
-d: 刪除
案例1:
將/etc/passwd檔案中的前5行的內容轉換為大寫後儲存在/tmp/passwd.out中
[root@localhost ~]# head -n 5 /etc/passwd | tr 'a-z' 'A-Z' > /tmp/passwd.out
[root@localhost ~]# cat /tmp/passwd.out
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN
案例2:
[root@localhost ~]# who
root pts/0 2021-10-18 17:51 (192.168.88.1)
[root@localhost ~]# who | tail -n 1 | tr 'a-z' 'A-Z' > /tmp/who.out
[root@localhost ~]# cat /tmp/who.out
ROOT PTS/0 2021-10-18 17:51 (192.168.88.1)
wc命令(統計)
常用選項:
-l: 顯示行數
-w: 單詞數
-c: 字元數
cut命令(切割命令)
常用選項:
-d: 指定分割符
-f: 指定欄位
sort命令(排序檔案)
常用選項:
-f: 忽略大小寫
-r: 逆序
-t: 欄位分割符
-k #: 以指定欄位為標準排序
-n: 以數值進行排序
-u: 排序後去重
uniq命令(去重)
常用選項:
-c: 僅顯示每行重複出現的次數
-d: 僅顯示重複過的行
-u: 僅顯示不曾重複的行
案例:
[root@localhost ~]# cut -d: -f6-10 /etc/passwd | cut -f3 | sort -n | uniq -c 1 /bin:/sbin/nologin
1 /home/user1:/bin/bash
1 /root:/bin/bash
1 /root:/sbin/nologin
1 /sbin:/bin/sync
4 /:/sbin/nologin
1 /sbin:/sbin/halt
1 /sbin:/sbin/nologin
1 /sbin:/sbin/shutdown
1 /usr/games:/sbin/nologin
1 /var/adm:/sbin/nologin
1 /var/empty/sshd:/sbin/nologin
1 /var/ftp:/sbin/nologin
1 /var/lib/chrony:/sbin/nologin
1 /var/spool/lpd:/sbin/nologin
1 /var/spool/mail:/sbin/nologin
1 /var/spool/postfix:/sbin/nologin
文字編輯器
Linux上也有圖形化的文字編輯器,類似windows的記事本,但是很多時候我們也只能用命令列來管理Linux作業系統,所以必須要掌握命令列的文字編輯器軟體。
目前常見的文字編輯器有:
- nano: 在debain系列的系統上會比較常見,但是在其他的發行版中也可以安裝
- vi: 所有的Unix link 系統都會內建vi 文字編輯器,其他的文字編輯器則不一定會存在
- vim: 具有程式編輯能力的文字編輯器,可以主動以字型顏色辨別語法的正確性,方便設計程式
目前vim是使用最多的,也是比較推薦的Linux文字編輯器
什麼是vim
Vim是從 vi 發展出來的一個文字編輯器。程式碼補完、編譯及錯誤跳轉等方便程式設計的功能特別豐富,在程式設計師中 被廣泛使用。
簡單的來說, vi 是老式的字處理器,不過功能已經很齊全了,但是還是有可以進步的地方。 vim 則可以說是 程式開發者的一項很好用的工具。
連 vim 的官方網站 (http://www.vim.org) 自己也說 vim 是一個程式開發工具而不是文書處理軟體。
vim是一個純命令列文字編輯器,很多文字編輯的功能都是通過鍵盤快捷鍵的方式完成,所以我們需要記住常 用的鍵位,在vim官方網站上我們可以找到vim鍵盤圖的完整版,不過對於初學者來說,我們只需要知道常用 的就可以了。
vi/vim的使用
基本上vi/vim共分為三種模式,分別是命令模式(Command mode),輸入模式(Insert mode)和末行模式 (Last line mode)。 這三種模式的作用分別是:
命令模式
剛剛啟動vim的時候就進入了命令模式
此狀態下敲擊鍵盤動作會被Vim識別為命令,而非輸入字元。比如我們此時按下 i ,並不會輸入一個字元, i 被當作了一個命令。
以下是常用的幾個命令:
- i : 切換到命令模式(在當前字元的前面輸入)
- a : 切換命令模式(在當前字元後買你輸入)
- o : 切換命令模式(在當前行的下一行輸入)
- x : 刪除當前游標所在位置的字元
- ':' : 切換到末行模式,在最底下一行輸入命令
若想要編輯文字:啟動Vim,進入了命令模式,按下 i、a、o ,切換到輸入模式
命令模式只有一些最基本的命令,因此需要末行模式在輸入更多的命令。
輸入模式
進入輸入模式的命令上面講到
在輸入模式中,可以使用以下按鍵:
- 字元按鍵及Shift組合,輸入字元
- ENTER 回車鍵,換行
- DEL 刪除鍵,刪除游標後面的一個字元
- hjkl : 方向鍵,不過這個只能在命令模式中使用
- ESC ,退出輸入模式,切換到命令模式
- HOME/END,移動游標到行首/行尾
- Page Up/Page Down,上/下翻頁
末行模式
在命令模式下按下:
(英文冒號) 就可以進入末行模式,在末行模式下可用的命令非常多。基本命令有:
- q :退出但不儲存
- w : 寫入(儲存)
- x :儲存並退出
詳細用法
- 移動游標的方法
h 或 向左 箭頭鍵 (←) | 游標向左移動一個字元 |
---|---|
j 或 向下 箭頭鍵(↓) | 游標向下移動一個字元 |
k 或 向上 箭頭鍵(↑) | 游標向上移動一個字元 |
l 或 向右 箭頭鍵 (→) | 游標向右移動一個字元 |
[Ctrl] + [f] | 螢幕『向下』移動一頁,相當於 [Page Down]按鍵 (常用) |
[Ctrl] + [b] | 螢幕『向上』移動一頁,相當於 [Page Up] 按鍵 (常用) |
[Ctrl] + [d] | 螢幕『向下』移動半頁 |
[Ctrl] + [u] | 螢幕『向上』移動半頁 |
+ | 游標移動到非空格符的下一行 |
- | 游標移動到非空格符的上一行 |
n+空格 或者 nl/nh | 那個 n 表示『數字』,例如 20 。按下數字後再按空格鍵,游標會向右移動這一行的 n 個字元。 例如 20 則游標會向後面移動 20 個字元距離。 |
0 或功能 鍵[Home] | 這是數字『 0 』:移動到這一行的最前面字元處 (常用) |
$ 或功能 鍵[End] | 移動到這一行的最後面字元處(常用) |
H | 游標移動到這個螢幕的最上方那一行的第一個字元 |
M | 游標移動到這個螢幕的中央那一行的第一個字元 |
L | 游標移動到這個螢幕的最下方那一行的第一個字元 |
G | 移動到這個檔案的最後一行(常用 |
nG | n 為數字。移動到這個檔案的第 n 行。例如 20G 則會移動到這個檔案的第 20 行(可配合 :set nu) |
gg | 移動到這個檔案的第一行,相當於 1G 啊! (常用) |
n |
n 為數字。游標向下移動 n 行(常用) |
- 文字的搜尋與替換
/word | 向光標之下尋找一個名稱為 word 的字串。 (常用) |
---|---|
?word | 向光標之上尋找一個字串名稱為 word 的字串。 |
n | 這個 n 是英文按鍵。代表重複前一個搜尋的動作。 |
N | 這個 N 是英文按鍵。與 n 剛好相反,為『反向』進行前一個搜尋動作。 |
:n1,n2s/word1/word2/g | n1 與 n2 為數字。在第 n1 與 n2 行之間尋找 word1 這個字串,並將該字串 取代為 word2 (常用) |
:1,$s/word1/word2/g 或 :%s/word1/word2/g | 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 !(常用) |
:1,$s/word1/word2/gc 或 :%s/word1/word2/gc | 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 !且在取 代前顯示提示字元給使用者確認 (confirm) 是否需要取代!(常用) |
- 刪除/剪下、複製與貼上
x, X | 在一行字當中,x 為向後刪除一個字元 (相當於 [del] 按鍵), X 為向前刪除一個字元(相當於 [backspace] 亦即是退格鍵) (常用) |
---|---|
nx | n 為數字,連續向後刪除 n 個字元。舉例來說,我要連續刪除 10 個字元, 『10x』 |
dd | 刪除/剪下游標所在的那一整行(常用) |
ndd | n 為數字。刪除/剪下游標所在的向下 n 行,例如 20dd 則是刪除 20 行 (常用) |
d1G | 刪除游標所在到第一行的所有資料 |
dG | 刪除游標所在到最後一行的所有資料 |
d$ | 刪除遊標所在處,到該行的最後一個字元 |
d0 | 那個是數字的 0 ,刪除游標所在處,到該行的最前面一個字元 |
yy | 複製遊標所在的那一行(常用) |
nyy | n 為數字。複製游標所在的向下 n 行,例如 20yy 則是複製 20 行(常用) |
y1G | 複製遊標所在行到第一行的所有資料 |
yG | 複製遊標所在行到最後一行的所有資料 |
y0 | 複製游標所在的那個字元到該行行首的所有資料 |
y$ | 複製游標所在的那個字元到該行行尾的所有資料 |
p, P | p為將已複製的資料在游標下一行貼上,P 則為貼在游標上一行! 舉例來說,我目前游標在第 20 行,且已經複製了 10 行資料。則按下 p 後, 那 10 行資料會貼在原本的 20 行之後,亦即由 21 行 開始貼。但如果是按下 P 呢? 那麼原本的第 20 行會被推到變成 30 行。 (常用) |
J | 將游標所在行與下一行的資料結合成同一行 |
c | 重複刪除多個數據,例如向下刪除 10 行,[ 10c ] |
u | 復原前一個動作。(常用) |
[Ctrl]+r | 重做上一個動作。(常用) |
. | 重複前一個動作。 如果你想要重複刪除、重複貼上等等動作,按下小數點『.』就好了 (常用) |
- 進入輸入或者取代的編輯模式
i, I | 進入輸入模式(Insert mode): i 為『從目前游標所在處輸入』, I 為『在目前所在行的第一個非空格 符處開始輸入』。 (常用) |
---|---|
a, A | 進入輸入模式(Insert mode): a 為『從目前游標所在的下一個字元處開始輸入』, A 為『從游標所在 行的最後一個字元處開始輸入』。(常用) |
o, O | 進入輸入模式(Insert mode): 這是英文字母 o 的大小寫。o 為在目前游標所在的下一行處輸入新的一 行; O 為在目前游標所在的上一行處輸入新的一行!(常用) |
r, R | 進入取代模式(Replace mode): r 只會取代游標所在的那一個字元一次;R會一直取代游標所在的文 字,直到按下 ESC 為止;(常用) |
[Esc] | 退出編輯模式,回到一般模式中(常用) |
- 儲存退出,離開的指令
:w | 將編輯的資料寫入硬碟中(常用) |
---|---|
:w! | 若檔案屬性為『只讀』時,強制寫入該檔案。不過,到底能不能寫入, 還是跟你對該檔案的權 限有關 |
:q | 離開 vi (常用) |
:q! | 若曾修改過檔案,又不想儲存,使用 ! 為強制離開不儲存。 |
:wq | 儲存後離開,若為 :wq! 則為強制儲存後離開 (常用) |
ZZ | 這是大寫的 Z 喔!如果修改過,儲存當前檔案,然後退出!效果等同於(儲存並退出) |
:x | 效果等同於(儲存並退出) |
:X | 大寫的X,用於加密檔案 |
ZQ | 不儲存,強制退出。效果等同於:q!。 |
:w [filename] | 將編輯的資料儲存成另一個檔案(類似檔案另存為) |
:r [filename] | 在編輯的資料中,讀入另一個檔案的資料。亦即將 『filename』 這個檔案內容加到游標所在 行後面 |
:n1,n2 w [filename] | 將 n1 到 n2 的內容儲存成 filename 這個檔案。 |
:! command | 暫時離開 vi 到bash命令列下執行 command 的顯示結果!例如 『:! ls /home』即可在 vi 當中 察看 /home 底下以 ls 輸出的檔案資訊! |
vim環境變數
root@localhost ~]# vim .vimrc # 當前使用者生效
root@localhost ~]# vim /etc/vimrc # 全域性生效
# 行號
顯示:set number,簡寫為set nu
取消顯示:set nonumber,簡寫為set nonu
# 括號匹配
匹配:set showmatch,簡寫為set sm
取消:set nosm
# 自動縮排
啟用:set ai
禁用:set noai
# 高亮搜尋
啟用:set hlsearch
禁用:set nohlsearch
# 語法高亮
啟用:syntax on
禁用:syntax off
# 忽略字元的大小寫
啟用:set ic
不忽略:set noic
# 獲取幫助
: help
檔案基本屬性與檔案查詢
檔案屬性
檔案時間
任何一個作業系統都有時間的概念,時間的概念主要用於對檔案和系統中發生的時間進行記錄,在Linux中, 可以使用stat檢視Linux系統中檔案的時間
stat
用於顯示檔案時間和inode內容
stat [選項]... 檔案...
例項
- stat檢視檔案時間,這邊為了方便我們看的懂,建議改成英文系統環境
root@localhost ~]# export LANG="en_US.UTF-8"
# 改回中文是LANG="zh_CN.UTF-8"
[root@localhost ~]# stat anaconda-ks.cfg
File: ‘anaconda-ks.cfg’
Size: 1241 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 33574979 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:admin_home_t:s0
Access: 2021-04-04 17:54:09.700844151 +0800
Modify: 2021-04-04 16:53:30.524854041 +0800
Change: 2021-04-04 16:53:30.524854041 +0800
Birth: -
- Access:訪問時間,也叫atime
- 當檔案被訪問的時候。這個時間就會發生改變
- Linux檔案執行的時候檢視檔案又頻繁數量又大,如果每次都重新整理atime都要記入硬碟中,長期以來,會給硬碟帶來很大的壓力。RHEL6開始relatime,atime延遲修改,必須滿足其中一個條件:
- 自上次atime修改後,已達到86400秒
- 發生寫操作的時候
- Modify:修改時間(內容),也叫mtime
- 當檔案內容發生變化的時候,這個時間就會變化
- Change:改變時間(狀態)
- 當檔案狀態被改變的時候,這個時間就會發生變化
檔案型別
Linux系統和Windows系統有很大的區別,Windows系統檢視檔案的字尾名就可以知道這個是什麼型別的文 件,比如: test.jpg 這個是一個圖片,如果你在windows上雙擊開啟,就會使用支援檢視圖片的軟體打 開。
Linux系統就根本不看檔案的字尾名,你認為這個是什麼檔案,你就使用什麼工具開啟這個檔案,如果開啟錯 誤,就會報錯,看下面的案例
root@localhost ~]# cat file
cat: file: Is a directory
當你以為file是個檔案,使用cat命令檢視的時候,cat會提示你這個是個資料夾,你才反應過來,應該使用cd 命令開啟。 所以在Linux中,我們需要使用和windows不一樣的方法來判斷這個檔案的型別。
方法一:ls
使用ls可以檢視當前目錄下有哪些檔案,我們會發現資料夾和檔案的顏色並不一樣,所以我們可以簡單的通過 顏色來進行判斷,不過這種判斷的方式並不準確,因為不同的Linux發行套件顏色的標準並不一樣,不同的遠 程管理工具對顏色的理解也有偏差,比如可能把藍色顯示為淡藍色,而淡藍色又顯示成其他顏色。所以最推薦 的做法是通過 ls -l
檢視第一個字母:
- -普通檔案(文字文件,二進位制檔案,壓縮檔案,電影,圖片等等)
- d目錄檔案(一般為藍色)
- b塊裝置檔案(塊裝置)儲存裝置硬碟,U盤 /dev/sda,/dev/sda1
- c字元裝置檔案(字元裝置)如印表機,終端/dev/tty1,/dev/zero
- s套接字檔案
- p管道檔案
- l連結檔案(一般為淡藍色)
[root@localhost ~]# type ll
ll 是 `ls -l --color=auto' 的別名
[root@localhost ~]# ll -d /etc/hosts /bin/ls /home /dev/sda /dev/tty1
/etc/grub2.cfg /dev/log /run/dmeventd-client
-rwxr-xr-x. 1 root root 117680 10月 31 2018 /bin/ls
srw-rw-rw-. 1 root root 0 4月 4 16:54 /dev/log
brw-rw----. 1 root disk 8, 0 4月 4 16:54 /dev/sda
crw--w----. 1 root tty 4, 1 4月 4 16:56 /dev/tty1
lrwxrwxrwx. 1 root root 22 4月 4 16:49 /etc/grub2.cfg ->
../boot/grub2/grub.cfg
-rw-r--r--. 1 root root 158 6月 7 2013 /etc/hosts
drwxr-xr-x. 2 root root 6 4月 11 2018 /home
prw-------. 1 root root 0 4月 4 16:54 /run/dmeventd-client
方法二:file
file是專門用來檢視檔案型別的命令
[root@localhost ~]# file /etc/hosts
/etc/hosts: ASCII text
[root@localhost ~]# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically
linked (uses shared libs), for GNU/Linux 2.6.32,
BuildID[sha1]=ceaf496f3aec08afced234f4f36330d3d13a657b, stripped
[root@localhost ~]# file /dev/sda
/dev/sda: block special
[root@localhost ~]# file /dev/tty1
/dev/tty1: character special
[root@localhost ~]# file /etc/grub2.cfg
/etc/grub2.cfg: symbolic link to `../boot/grub2/grub.cfg'
[root@localhost ~]# file /home
/home: directory
[root@localhost ~]# file /run/dmeventd-client
/run/dmeventd-client: fifo (named pipe)
檔案查詢
which
用於查詢檔案
which命令會在環境變數$PATH設定的目錄裡查詢符合條件的檔案
[root@localhost ~]# which [filename...]
例項
- 檢視ls命令的可執行檔案在哪個目錄
[root@localhost ~]# which ls
lias ls='ls --color=auto'
/usr/bin/ls
# which會先告訴你ls其實是一個別名
# 然後顯示出來ls所在的具體位置
小知識:我們在執行ls的時候,其實執行的是ls -color=auto
這條命令,在顯示檔案的時候使用不同的顏色表示不同的檔案型別,如果我們想執行ls
本體,而不想執行別名,我們可以輸入\ls
就可以了,這樣就不會就不同顏色的檔案型別了。
- 檢視poweroff在什麼目錄
[root@localhost ~]# which poweroff
/usr/sbin/poweroff
locate
用於查詢符合條件的檔案,他會去儲存檔案和目錄名稱的資料庫內,查詢合乎範本樣式條件的檔案或者目錄
在centos7的最小安裝中,並沒有自帶locate命令,需要輸入如下命令進行安裝
[root@localhost ~]# yum -y install mlocate
locate命令的使用方式如下
[root@localhost ~]# locate [選項]...[範本樣式]...
在使用locate之前,需要更新一下資料庫,因為locate只會在資料庫中查詢檔案所在的位置,所以locate查詢 速度極快,缺點就是資料庫更新並不是實時的,更新資料庫有兩種方式:
- 手動更新,輸入 updatedb
- 預設情況下,updatedb 會每天自動執行一次
選項
- -c:只輸出找到的數量
- -n:至多顯示 n個輸出
- -i:忽略大小寫
- -r:使用基本正則表示式
- --regex:使用擴充套件正則表示式
- -d DBPATH:使用 DBPATH 指定的資料庫,而不是預設資料庫
/var/lib/mlocate/mlocate.db
例項
- 查詢
passwd
檔案所在的位置
root@localhost ~]# updatedb
# 更新資料庫並不是每次查詢都需要,但是建議更新資料庫來保證資料是最新的
[root@localhost ~]# locate passwd
- 查詢ens33網絡卡配置檔案所在的位置
[root@localhost ~]# locate -r ens33$
/etc/sysconfig/network-scripts/ifcfg-ens33
# $在正則表示式中表示以什麼結尾,所以ens33$表示的是以ens33結尾的檔案
find
實時查詢工具,通過遍歷指定路徑下的檔案系統來完成檔案的查詢
工作特點:
- 查詢速度略慢
- 精確查詢
- 實時查詢
- 可以滿足多種條件的匹配
使用方法如下
find [選項] [路徑] [查詢條件 + 處理動作]
# 查詢路徑:指定具體目錄路徑,預設是當前資料夾
# 查詢條件:指定的查詢標準(檔名/大小/型別/許可權等),預設是找出所有檔案
# 處理動作:對符合條件的檔案做什麼操作,預設輸出螢幕
查詢條件
- 根據檔名查詢
root@localhost ~]# find /etc -name "ifcfg-ens33"
[root@localhost ~]# find /etc -iname "ifcfg-ens33" # 忽略大小寫
[root@localhost ~]# find /etc -iname "ifcfg*"
- 按照檔案大小查詢
[root@localhost ~]# find /etc -size +5M # 大於5M
[root@localhost ~]# find /etc -size 5M # 等於5M
[root@localhost ~]# find /etc -size -5M # 小於5M
[root@localhost ~]# find /etc -size +5M -ls # 找到的處理動作-ls
- 指定查詢的目錄深度
[root@localhost ~]# find / -maxdepth 3 -a -name "ifcfg-ens33" # 最大查詢深度
# -a是同時滿足,-o是或
[root@localhost ~]# find / -mindepth 3 -a -name "ifcfg-ens33" # 最小查詢深度
- 按照時間查詢
root@localhost ~]# find /etc -mtime +5 # 修改時間超過5天
[root@localhost ~]# find /etc -mtime 5 # 修改時間等於5天
[root@localhost ~]# find /etc -mtime -5 # 修改時間5天以內
atime: 檔案訪問時間
ctime: 檔案狀態修改時間
mtime: 檔案內容修改時間
- 按照檔案屬主,屬組查詢
[root@localhost ~]# find /home -user atopos # 屬主是atopos的檔案
[root@localhost ~]# find /home -group atopos
[root@localhost ~]# find /home -user atopos -group atopos
[root@localhost ~]# find /home -user atopos -a -group root
[root@localhost ~]# find /home -user atopos -o -group root
[root@localhost ~]# find /home -nouser # 沒有屬主的檔案
[root@localhost ~]# find /home -nogroup # 沒有屬組的檔案
其中-a
是和,-o
是或
- 按檔案型別
root@localhost ~]# find /dev -type d
- 按照檔案許可權查詢
root@localhost ~]# find / -perm 644 -ls
[root@localhost ~]# find / -perm -644 -ls # 許可權小於644的
[root@localhost ~]# find / -perm 4000 -ls
[root@localhost ~]# find / -perm -4000 -ls
- 按正則表示式查詢
[root@localhost ~]# find /etc -regex '.*ifcfg-ens[0-9][0-9]'
# .* 任意多個字元
# [0-9] 任意一個數字
處理動作
- -print:預設的處理動作,顯示到螢幕上
- -ls:類似與對查詢到的檔案執行ls -l命令
- -delete: 刪除查詢到的檔案
- -fls /path/to/somefile:查詢到的所有檔案的長格式資訊儲存至指定的檔案中
- -ok COMMAND{}:對查詢到的檔案執行由COMMAND指定的命令,需要確認
- -exec COMMAND{}:對查詢到的檔案執行由COMMAND指定的命令,不需要確認
- {}:用於引用查詢到的檔名自生
例項
- 查詢/var目錄下屬主為root,且屬組為mail的所有檔案或目錄
[root@localhost ~]# find /var -user root -a -group mail
- 查詢/usr目錄下不屬於root,bin或Hadoop的所有檔案或目錄
[root@localhost ~]# find /usr -not -user root -not -user bin -not -user Hadoop(centos)
[root@localhost ~]# find /usr -not \(-user root -user bin -user Hadoop\)
- 查詢/etc目錄下最近一週內容曾被修改過的檔案或目錄
[root@localhost ~]# find /etc -mtime -7
- 查詢當前系統上沒有屬主或屬組,且最近一週內曾被訪問過的檔案或目錄
[root@localhost ~]# find / \(-nouser -o -nogroup\) -a -atime -7
- 查詢/etc目錄下大於1M且型別為普通檔案的所有檔案或目錄
[root@localhost ~]# find /etc -size +1M -a -type f
- 查詢/etc目錄下所有使用者都沒有寫許可權的檔案
[root@localhost ~]# find /etc -not -perm -222
- 查詢/etc目錄下至少一類使用者沒有執行許可權的檔案
[root@localhost ~]# find /etc -not -perm 111
- 查詢/etc/init.d目錄下,所有使用者都執行許可權,且其它使用者寫許可權的檔案
[root@localhost ~]# find /etc/init.d -perm -113
使用者許可權管理
Linux系統是一個多使用者多工的分時作業系統,任何一個要使用系統資源的使用者,都必須向管理員申請一個賬號,然後輸入這個賬號的身份進入系統。
為了更加方便的管理多個使用者,就出現了使用者組的相關概念,關於使用者和使用者組:
- 系統上每個程序(執行的程式)都是作為特定使用者執行的
- 每個檔案是由一個特定的使用者擁有
- 訪問檔案和目錄收到使用者的限制
- 與正在執行的程序相關聯的使用者確定該程序可以訪問的檔案和目錄
實現使用者賬號的管理,主要完成的工作有以下的幾個方面:
- 使用者賬號的新增,刪除和修改
- 使用者口令的管理
- 使用者組的管理
使用者和使用者組的檢視
id
現實使用者的ID,以及所屬群組的ID
id
會顯示使用者以及所屬群組的實際與有效ID。若兩個ID相同,則僅顯示實際ID。若僅指定使用者名稱稱,則顯示目前使用者的ID
[root@localhost ~]# id [OPTION]... [USER]
- g:顯示使用者所屬群組的ID
- -G:顯示使用者所屬附加組的ID
- -n:顯示使用者,所屬群組或者附加組的名稱
- -r:顯示實際ID
- -u:顯示使用者ID
uid的約定
Linux系統會依賴使用者的uid數值來判定這個使用者的角色,分別如下:
- 0:超級管理員,也就是root,在Linux系統中擁有絕對的權力
- 1~999:系統使用者,系統使用者往往是用來約束系統中的服務用的
- 1000+:普通使用者,可以用來登入和使用Linux作業系統
關於root使用者
- uid是0
- 擁有作業系統的所有權利
- 該使用者有權力覆蓋檔案系統上普通許可權
- 安裝後者刪除軟體並管理系統檔案和目錄
- 大多數裝置只能有root控制
例項
- 檢視當前登入使用者的資訊
[root@localhost ~]# id
uid=0(root) gid=0(root) 組=0(root) 環境
=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
- 檢視檔案的擁有者
- 檢視執行程序的使用者名稱
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S 09:06 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 09:06 0:01 [ksoftirqd/0]
root 4 0.1 0.0 0 0 ? R 09:06 0:09 [kworker/0:0]
root 5 0.0 0.0 0 0 ? S< 09:06 0:00 [kworker/0:0H]
相關的檔案
Linux一切皆檔案,所以使用者和使用者組相關的資訊也都是儲存在文字檔案中的
passwd檔案
用於儲存使用者資訊,一般第一行是root使用者,下面都是其他使用者
[root@localhost ~]# head -n 1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 這個格式為使用者名稱:密碼:uid:gid:描述:家目錄:登陸後執行的命令
shadow檔案
格式中密碼佔位置太長了,所以用x來代替,Linux系統會到shadow檔案中查詢x部分的密碼內容
[root@localhost ~]# head -n 1 /etc/shadow
root:$6$frokclXSnQa8EbKs$pWElbjPlmxjYh30tr8qLsTQVOhuPg7GmW9Sanm2yXAK8TNMgje1gyc
/vwPgqvmSMf6VaoEvveM0gFvtETmXy/.::0:99999:7:::
# 這個格式為使用者名稱:加密密碼:最後一次修改時間:最小修改時間間隔:密碼有效期:密碼需要變更前的
警告天數:密碼過期後的寬限時間:賬號失效時間:保留欄位
密碼在 passwd 檔案中會使用加密演算法加密,所以別想知道我的密碼是什麼,加密演算法預設是 $6 ,這個類 型6的加密演算法是sha-512。
group檔案
使用者和組的對應關係,會儲存在group這個檔案中
[root@localhost ~]# head -n 1 /etc/group
root:x:0:
# 這個格式是組名:口令:組標識號:組內使用者列表
使用者組管理
groupadd 新增使用者組
groupadd 命令用於建立一個新的工作組,新工作組的資訊將被新增到系統檔案中
[root@localhost ~]# groupadd [選項] 組名
選項
- -g:指定新建工作組的ID
- -r:建立系統工作組,系統工作組的ID小於500
- -k:覆蓋配置檔案
/etc/login.defs
- -o:允許新增組ID號不唯一的工作組
- -f:如果指定的組已經存在,此選項將失明瞭僅以成功的狀態退出,當與 -g 一起使用,並且指定的 GID_MIN已經存在時,選擇另一個唯一的GID(即-g關閉)
例項
[root@localhost ~]# groupadd hr -g 1000
[root@localhost ~]# groupadd sale -g 2000
[root@localhost ~]# groupadd it -g 3000
[root@localhost ~]# groupadd fd -g 4000
[root@localhost ~]# tail -n 4 /etc/group
hr:x:1000:
sale:x:2000:
it:x:3000:
fd:x:4000:
groupmod 修改使用者組
groupmod命令用於更改使用者組識別碼或者名稱
[root@localhost ~]# groupmod [選項] 名稱
選項
- -g:將組ID改為GID
- -n:改名
- -o:允許重複使用GID
例項
- 修改fd組的名稱為finance
[root@localhost ~]# groupmod -n finance fd
[root@localhost ~]# tail -n 1 /etc/group
finance:x:4000:
groupdel:刪除使用者組
groupdel命令用於刪除群組
需要從系統上刪除群組時,可用groupdel(group delete)指令來完成這項工作。倘若該群組中仍包括某些用 戶,則必須先刪除這些使用者後,方能刪除群組。
[root@localhost ~]# groupdel 組名
例項
- 刪除一個使用者組
[root@localhost ~]# groupadd test
[root@localhost ~]# groupdel test
gpasswd:使用者組成員管理
gpasswd 是 Linux 下工作組檔案 /etc/group 和 /etc/gshadow 管理工具,用於將一個使用者新增到組或者從組 中刪除
[root@localhost ~]# gpasswd [選項] 組名
選項
- -a:將使用者新增到組裡面
- -d:從組裡刪除使用者
- -A:指定管理員
- -M:指定組成員和-A的用途差不多
- -R:限制使用者登入組,只有組中的使用者才可以用newgrp加入該組
例項
- 建立使用者test,並且加入it組
[root@localhost ~]# useradd test
[root@localhost ~]# gpasswd -a test it
正在將使用者“test”加入到“it”組中
[root@localhost ~]# cat /etc/group |grep it:
it:x:3000:test
# 在組檔案中,可以看到這個組的成員
[root@localhost ~]# id test
uid=6667(test) gid=6667(test) 組=6667(test),3000(it)
# 在使用者的資訊中,可以看到這個使用者的所屬組
使用者管理
useradd:新增使用者
uaeradd可以用來新增新的使用者
[root@localhost ~]# useradd [選項] 使用者名稱
新建使用者home目錄下的bash開頭的檔案時從/etc/skel/中複製過去的
如果建立一個使用者時,未指定任何選項,系統會建立一個和使用者名稱相同的組作為使用者的 Primary Group
選項
- -c comment:指定一段註釋性描述
- -d :指定使用者的主目錄,如果此目錄不存在,則同時使用-m選項,可以建立主目錄
- -m:建立使用者的主目錄
- -g:指定使用者所屬的使用者組,預設會建立一個和使用者名稱差不多的使用者組
- -G:指定使用者的附加組,一個使用者可以屬於多個附加組
- -s:指定使用者登入的shell
- -u:指定使用者的使用者號,如果同時有-o選項,則可以重複使用其他使用者的標識號
- -r:建立系統使用者
例項
- 新增一般使用者
[root@localhost ~]# useradd test1
- 為新增的使用者指定相應的使用者組
[root@localhost ~]# useradd -g root test2
- 為新新增的使用者指定home目錄
[root@localhost ~]# useradd -m /home/test3 test3
- 建立一個不給登入的使用者
[root@localhost ~]# useradd -s /sbin/nologin test4
usermod:修改使用者資訊
usermod用於修改使用者的的各類設定
[root@localhost ~]# usermod [選項] 使用者名稱
選項
-
-c:修改使用者賬號的備註資訊
-
-a:追加,預設的修改是覆蓋
-
-d:修改使用者登入時的目錄
-
-e:修改賬號的有效期限
-
-f:修改在密碼過期後多少天關閉該賬號
-
-g:修改使用者所屬群組
-
-G:修改使用者所屬附加組
-
-l:修改使用者賬號的名稱
-
-L:鎖定使用者密碼,使密碼無效
-
-a:修改使用者登入後使用是shell
-
-u:修改使用者uid
-
-U:解除密碼鎖定
例項
- 更改登入的目錄
[root@localhost ~]# useradd user01
[root@localhost ~]# usermod -d /home user01
[root@localhost ~]# su - user01
-bash-4.2$ pwd
/home
- 改變使用者的UID
[root@localhost ~]# usermod -u 6666 user01
userdel:刪除使用者
userdel命令用於刪除使用者賬號
userdel可刪除使用者帳號與相關的檔案。若不加引數,則僅刪除使用者帳號,而不刪除相關檔案
[root@localhost ~]# userdel [-r] 使用者賬號
選項
- -r:刪除使用者登入目錄以及目錄中所有的檔案
passwd檔案中的shell
檢視/etc/passwd
檔案會發現每一行的最後面是我們登入成功以後執行的命令,其中有兩種命令使用最為頻繁
/bin/bash
:這個是Linux命令列工具,我麼你正常登入後預設進入的就是這個命令列/sbin/nologin
:如果寫成nologin,那麼使用者將無法登入,有些使用者是作為程序許可權管理而存在的,不需 要登入。如果提供登入的功能反而不安全,所以寫成nologin
cat一下/etc/passwd
檔案
[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
新建一個使用者,給他自定義命令
[root@localhost ~]# useradd -s /bin/vi test
[root@localhost ~]# tail -n 1 /etc/passwd
test:x:1000:1000::/home/test:/bin/vi
我們切換到test使用者就會發現使用者預設進入vi編輯頁面
login.defs
useradd參照檔案
建立使用者時對使用者的一些限制,對root使用者無效
[root@atopos ~]# vim /etc/login.defs
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
CREATE_HOME yes
ENCRYPT_METHOD SHA512
[root@atopos ~]# vim /etc/default/useradd
SHELL=/bin/bash
chage
[root@localhost ~]# chage [選項] 使用者
選項
- -d, --lastday 最近日期 將最近一次密碼設定時間設為“最近日期”
- -E, --expiredate 過期日期 將帳戶過期時間設為“過期日期”
- -h, --help 顯示此幫助資訊並推出
- -I, --inactive INACITVE 過期 INACTIVE 天數後,設定密碼為失效狀態
- -l, --list 顯示帳戶年齡資訊
- -m, --mindays 最小天數 將兩次改變密碼之間相距的最小天數設為“最小天數”
- -M, --maxdays 最大天數 將兩次改變密碼之間相距的最大天數設為“最大天數”
- -R, --root CHROOT_DIR chroot 到的目錄 -W, --warndays 警告天數 將過期警告天數設為“警告天數”
例項
[root@atopos ~]# useradd user01
[root@atopos ~]# echo 123456 |passwd --stdin user01
更改使用者 user01 的密碼 。
passwd:所有的身份驗證令牌已經成功更新。
[root@atopos ~]# chage -d 0 user01 # 強制使用者在下次登入的時候換密碼
使用者密碼管理
root使用者可以直接設定普通使用者密碼,普通使用者必須要提供原密碼,才可以修改自己密碼。
passwd命令
[root@localhost ~]# passwd [選項...] 賬號名稱
選項
- -n mindays:指定最短使用期限
- -x maxdays:指定最大使用期限
- -w warndays:提前多少天開始警告
- -i inactivedays:非活動期限
- --stdin:從標準輸入接收使用者密碼
例項
[root@localhost ~]# echo "123456" | passwd --stdin username
sudo:提權
以root使用者的身份授權普通使用者
檔案許可權
基本許可權 UGO
檔案許可權時控制某個使用者或者使用者組訪問某個檔案的方式
UGO設定基本許可權
許可權物件
U:屬主
G:屬組
O:其他人
許可權型別
r:讀 數字:4
w:寫 數字:2
x:執行 數字:1
許可權管理
chown:更改檔案的屬組和屬主
[root@localhost ~]# chown user01:user01 file
# 更改屬主和屬組
[root@localhost ~]# chown :user01 file
# 只更改屬組
[root@localhost ~]# chown user01 file
# 只更愛屬主
chmod:更改檔案許可權
物件:u g o a
賦值符號:+ - =
許可權型別:r w x 也可以用數字
[root@localhost ~]# chown u+x file # 屬主增加執行全新啊
[root@localhost ~]# chown a=rwx file # 所有使用者賦予rwx許可權
[root@localhost ~]# chown ug=rw,o=r file # 屬主屬組賦予讀寫,其他人只讀
# 使用數字
[root@localhost ~]# chown 644 file # 屬主擁有讀寫許可權,屬組和其他使用者只讀
chown:改變某個檔案的屬主屬組
chmod:改變某個檔案自身的許可權
r,w,x許可權對檔案和目錄的意義區別
許可權 | 對檔案的影響 | 對目錄的影響 |
---|---|---|
r(讀取) | 可以讀取檔案的內容 | 可以列出目錄的內容,可以使用ls相關命令 |
w(寫入) | 可以更改檔案的內容 | 可以建立或刪除目錄中的檔案,可以使用touch,rm等相關命令 |
x(執行) | 可以執行可執行檔案 | 可以訪問目錄裡面的內容,可以使用cd等相關命令 |
目錄許可權跟檔案許可權無關
ACL設定基本許可權(r,w,x)
UGO設定基本許可權:只能一個使用者或者一個組或者其他人
ACL的基本用法
[root@localhost ~]# setfacl [選項] 檔案/目錄
選項
- -m:新增acl設定引數
- -x:刪除acl設定引數
- -b:移除所有的acl設定引數
- -R:遞迴新增acl設定引數
- -d:新增預設的acl設定引數(目錄)
例項
[root@atopos ~]# ll file1
-rw-r--r--. 1 centos it 0 9月 4 11:03 file1
[root@atopos ~]# getfacl file1
# file: file1
# owner: centos
# group: it
user::rwgroup::r--
other::r--
[root@atopos ~]# setfacl -m u:centos:rw file1 # 增加使用者許可權
[root@atopos ~]# setfacl -m u:user05:- file1 # 增加使用者許可權
[root@atopos ~]# setfacl -m o::rw file1 # 修改其他人許可權
[root@atopos ~]# ll file1
-rw-rw-rw-+ 1 centos it 0 9月 4 11:03 file1
[root@xwz ~]# getfacl file1
# file: file1
# owner: centos
# group: it
user::rwuser:centos:rwuser:user05:---
group::r--
mask::rwother::rw-
[root@xwz ~]# setfacl -m g:hr:r file1 # 增加組許可權
[root@xwz ~]# setfacl -x g:hr file1 # 刪除組許可權
[root@xwz ~]# setfacl -b file1 # 刪除所有acl許可權
mask
mask決定了使用者對檔案的的最高許可權,說白了,mask和acl共同控制使用者對檔案的許可權,如果mask許可權為r--,acl許可權為rwx,則最後的許可權只能時r--
mask 許可權,指的是使用者或群組能擁有的最大 ACL 許可權,也就是說,給使用者或群組設定的 ACL 許可權不能超過 mask 規定的許可權範圍,超出部分做無效處理。
設定mask許可權
[root@atopos ~]# setfacl -m m::--- file1
[root@atopos ~]# getfacl file1
# file: file1
# owner: centos
# group: it
user::rwgroup::r-- #effective:---
mask::---
other::---
default
一般正對訪問目錄,預設許可權獨立與該目錄本身的許可權,規定了在該目錄中建立檔案的預設acl許可權
default可以指定在目錄中建立的新檔案的初始acl許可權
例項
使用者centos能夠對/home以及以後再/home下建立的檔案具有讀寫執行許可權
[root@atopos ~]# setfacl -m u:centos:rwx /home
[root@atopos ~]# setfacl -m d:u:centos:rwx /home
[root@atopos ~]# getfacl /home
getfacl: Removing leading '/' from absolute path names
# file: home
# owner: root
# group: root
user::rwx
user:centos:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:centos:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
特殊許可權
檔案除了上述的r,w,x基本許可權,還有三個特殊許可權:suid,sgid,sbit(sticky)
suid
suid 屬性只能運用在可執行檔案上,含義是開放檔案所有者的許可權給其他使用者,即當用戶執行該執行檔案 時,會擁有該執行檔案所有者的許可權。如果給一個非二進位制檔案檔案附加 suid 許可權,則會顯示大寫S,屬於無效。
普通使用者能夠執行 passwd 命令修改自己的密碼,修改密碼其實就是修改 /etc/shadow 這個檔案,查 看 /etc/passwd 這個檔案的許可權,發現除了 root 其他人沒有寫許可權,但是普通使用者能夠成功執行 passwd ,其原因就在於 passwd 這個命令的許可權是 rwsrw---- ,其中 s 的作用就是讓執行命令的人具有和 該命令擁有者相同的許可權。
[root@atopos ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
例項
[root@localhost ~]# su - user1
[user1@localhost ~]$ passwd
更改使用者 user1 的密碼 。
為 user1 更改 STRESS 密碼。
(當前)UNIX 密碼:
- 保持這個會話,新建一個會話,檢視系統程序,可以看到當前是root使用者在執行passwd命令
[root@localhost ~]# ps -aux |grep passwd
root 7521 0.0 0.1 170760 2052 pts/0 S+ 10:24 0:00 passwd
- 如果想自己新增suid許可權,可以輸入下面兩個命令
chmod u+s file
chmod 4765 file
sgid
sgid 屬性可運用於檔案或者目錄,運用在檔案的含義是開放檔案所屬組的許可權給其他使用者,即當用戶執行 該執行檔案時,會擁有該執行檔案所屬組使用者的許可權。如果給一個非二進位制檔案檔案附加 sgid 許可權,則會 顯示大寫S,屬於無效。
運用在目錄上的含義是,在該目錄下所有使用者建立的檔案或者目錄的所屬組都和其一樣。即如 果 /home/user1 目錄具有 sgid 許可權,且所屬組是 user1 ,則任何使用者在 /home/user1 下建立的子目錄 或者檔案的所屬組都是 user1 。
例項
- 設定sgid,讓使用者在workdir下建立的檔案都屬於worker組
[root@atopos ~]# mkdir workdir
[root@atopos ~]# chmod g+s workdir/
[root@atopos ~]# cd workdir/
[root@atopos workdir]# touch file2
[root@atopos workdir]# ll
total 0
-rw-r--r--. 1 root root 0 Jan 13 07:04 file
-rw-r--r--. 1 root worker 0 Jan 13 07:05 file2
sbit(sticky)
sticky 許可權只能運用於目錄上,含義是該目錄下所有的檔案和子目錄只能由所屬者刪除,即使其的許可權是777 或者其他。一個公共目錄,每個人都可以建立檔案,刪除自己的檔案,但不能刪除別人的檔案(僅對目錄有效)
例項
- 設定sbit,讓普通使用者只能建立檔案,不能刪除檔案
[root@localhost ~]# chmod 777 /workdir/
[root@localhost ~]# chmod o+t /workdir/
[root@localhost ~]# su - user1
[user1@localhost ~]$ cd /workdir/
[user1@localhost workdir]$ touch user1file
[user1@localhost workdir]$ exit
登出
[root@localhost ~]# su - user2
[user2@localhost ~]$ cd /workdir/
[user2@localhost workdir]$ touch user2file
[user2@localhost workdir]$ rm -rf user1file # 不給刪除別人的檔案
rm: 無法刪除"user1file": 不允許的操作
[user2@localhost workdir]$ rm -rf user2file # 只能刪除自己的檔案
[user2@localhost workdir]$ ll
總用量 0
-rw-rw----+ 1 user1 worker 0 4月 14 11:11 user1file
chattr檔案屬性
chattr命令用來改變檔案的屬性
這項指令可以改變存放在檔案或者目錄屬性,這些屬性共有一下8種模式:
- a:讓檔案或目錄僅供附加用途
- b:不更新檔案或目錄的最後存取時間
- c:將檔案或目錄壓縮後存放
- d:將檔案或目錄排除在傾倒操作之外
- i:不得任意更動檔案或目錄
- s:保密性刪除檔案或目錄
- S:即時更新檔案或目錄
- u:預防意外刪除
[root@localhost ~]# chattr [-RV][+/-/=<屬性>][檔案或目錄...
選項
- -R:遞迴處理,將指定目錄下的所有檔案及子目錄一併處理
- -v <版本編號>:設定檔案或目錄版本
- -V:顯示指令執行過程
- +<屬性>:開啟檔案或目錄的該項屬性
- -<屬性>:關閉檔案或目錄的該項屬性
- = <屬性>:指定檔案或目錄的該項屬性
例項
- 使用chattr命令防止系統中某個關鍵檔案被修改
[root@localhost ~]# chattr +i /etc/resolv.conf
[root@localhost ~]# lsattr /etc/resolv.conf
----i----------- /etc/resolv.conf
[root@localhost ~]# echo test >> /etc/resolv.conf
-bash: /etc/resolv.conf: 許可權不夠
[root@localhost ~]# chattr +a /var/log/messages
[root@localhost ~]# lsattr /var/log/messages
-----a---------- /var/log/messages
[root@localhost ~]# echo > /var/log/messages # 不允許清空日誌
-bash: /var/log/messages: 不允許的操作
umask
umask命令指定在建立檔案時預設的許可權掩碼,程序 新建檔案、目錄的預設許可權會收到umask的影響, umask表示要減掉得到許可權。
umask可用來設定[許可權掩碼]。[許可權掩碼]是由3個八進位制的數字所組成,將現有的存取許可權減掉許可權掩碼後, 即可產生建立檔案時預設的許可權。
[root@localhost ~]# umask [選項][許可權掩碼]
選項
- -S:以文字的方式來表示許可權掩碼
例項
- 檢視當前使用者的umask許可權
[user01@atopos ~]$ umask
0002
- 檢視最終所有的許可權
[user01@atopos ~]$ umask -S
u=rwx,g=rwx,o=rx
- 修改umask數值(臨時)
[user01@atopos ~]$ umask 0000
[user01@atopos ~]$ mkdir dir1
[user01@atopos ~]$ ll
total 0
drwxrwxrwx. 2 user01 user01 6 Jan 13 07:28 dir1
- 修改umask數值(永久)
[root@localhost ~]# vim /etc/profile
--------------
59 if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
60 umask 002
61 else
62 umask 022
63 fi
---------------
[root@localhost ~]# source /etc/profile # 立即在當前shell中生效
- 通過umask決定新建使用者 HOME 目錄的許可權
[root@localhost ~]# vim /etc/login.defs
-----------------
61 # The permission mask is initialized to this value. If not specified,
62 # the permission mask will be initialized to 022.
63 UMASK 077
------------------
程序process
什麼是程序
程序是cpu進行資源分配的最小單位,是一個在系統中執行的程式
程序是已啟動的可執行程式的執行例項,程序有一下部分組成:
- 已分配的記憶體空間
- 安全屬性,包括所有權憑據和特權
- 程序程式碼的一個或多個執行執行緒
- 進場狀態
程序:程式執行的過程,動態,有生命週期及執行狀態
程序型別
守護程序:在系統引導啟動過程中啟動的程序,跟終端無關
前臺程序:跟終端相關,通過終端啟動的程序
程序的生命週期
父程序複製自己的地址空間(fork)建立一個新的子程序結構,每個新程序分配一個唯一的程序ID(PID),滿足跟蹤安全之需。PID和父程序ID(PPID)是子程序環境的元素,任何程序都可以建立子程序,所有進 程都是第一個系統程序的後代:
centos5/6:init
centos7: systemd
程序狀態:
子程序繼承父程序的安全性身份、過去和當前的檔案描述符、埠和資源特權、環境變數,以及程式代 碼。隨後,子程序可能exec自己的程式程式碼。通常,父程序在子程序執行期間處於睡眠(sleeping)狀態。 當子程序完成時發出(exit)資訊請求,在退出時,子程序已經關閉或丟棄了其資源環境,剩餘的部分稱之 為殭屍(zombie)。父程序在子程序退出時收到訊號而被喚醒,清理剩餘的結構,然後繼續執行其自己的 程式程式碼。
程序狀態
在多工處理作業系統中,每個CPU(或核心)在一個時間點上只能處理一個程序。在程序執行時,它對 CPU時間和資源分配的要求會不斷變化,從而為程序分配一個狀態,它隨著環境要求而改變。
R:執行狀態(runing): 表明程序要麼在執行中要麼在執行佇列裡,並不意味著程序一定在執行中。
S:睡眠狀態(sleeping):意味著程序在等待事件的完成(這裡的睡眠有時候也叫做可中斷睡眠)
D:磁碟睡眠狀態(Disk sleep): 有時候也叫做不可中斷睡眠,在這個狀態的程序通常會等待IO的結束
T:停止狀態(stopped):可以通過傳送SIGSTOP訊號給程序來停止(T)程序。這個被暫停的程序可以通過 傳送SIGCNT訊號讓程序繼續執行。
Z:殭屍狀態(zombie):通知父程序回收所有的資源
X:死亡狀態(dead):這個狀態只是一個返回狀態,你不會在任務列表裡看到這個狀態。
- 殭屍程序:當一個程序fork一個子程序之後,如果子程序退出,而父程序沒有利用wait 或者 waitpid 來獲取子程序的狀態資訊,那麼子程序的狀態描述符依然儲存在系統中。
- 孤兒程序:當一個父程序fork一個子程序之後,父程序突然被終止了,那麼這個子程序就成為了一 個孤兒程序,它會被init程序接管
- 參考部落格:殭屍程序與孤兒程序解析_TerryZjl的部落格-CSDN部落格_殭屍程序和孤兒程序的區別
檢視程序
ps命令
靜態檢視程序ps 注: ps -aux 不同於 ps aux
常用組合:aux
u:以使用者為中心組織程序狀態資訊顯示
a:與終端相關的程序;
x:與終端無關的程序;
~]# ps -uax
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
使用者 程序ID CPU佔用 記憶體佔用
VSZ:Virtual memory SiZe 虛擬記憶體集
RSS:ReSident Size 常駐記憶體集———其他的都可以放入交換記憶體中
STAT:程序狀態
R:running
S:interruptable sleeping
D:uninterruptable sleeping
T:stopped
Z:zombie
+:前臺程序
l:多執行緒程序
N:低優先順序程序
<:高優先順序程序
s:session leader
START:啟動時間
TIME:執行佔據cpu的累積時長
COMMAND:由哪個命令來啟動的相關程序
常用組合:ps -ef
-e:顯示所有程序
-f:顯示完整格式程式資訊
常用組合:ps -eFH
-F:顯示完成格式的程序資訊
-H:以程序層級格式顯示程序相關資訊
常用組合:eo,axo
自定義想要查詢的欄位值
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
-axo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wcha n:14,comm
ni:nice值
pri:priority,優先順序
psr:processor,CPU
rtprio:實時優先順序
[root@atopos ~]# ps aux |less
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 193720 6768 ? Ss 05:38 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 05:38 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 05:38 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 05:38 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 05:38 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 05:38 0:00 [rcu_bh]
USER:執行程序的使用者
PID:程序ID
%CPU:CPU佔用率
%MEM:記憶體佔用率
VSZ:佔用虛擬記憶體
RSS:佔用實際記憶體 駐留記憶體
TTY:程式執行的終端
STAT:程序狀態 man ps(/STATE)
- R(runing):執行狀態
- S(sleeping):淺度睡眠狀態
- D(disk sleep):磁碟睡眠狀態
- T(stopped):停止程序
- X(dead):死亡狀態
- Z(zombie):殭屍狀態
START:程序的啟動時間
TIME:程序佔用CPU的總時間
COMMAND:程序檔案,程序名
[root@atopos ~]# ps aux --sort %cpu |less # 按照CPU使用率排序
[root@atopos ~]# ps aux --sort -%cpu |less
[root@atopos ~]# ps aux --sort rss |less
[root@atopos ~]# ps aux --sort -rss |less
[root@atopos ~]# yum -y install httpd
[root@atopos ~]# systemctl start httpd
[root@atopos ~]# ps auxf |grep httpd # 按照父子程序層級顯示
root 29276 0.0 0.0 112724 988 pts/1 S+ 14:25 0:00
\_ grep --color=auto httpd
root 29267 0.2 0.2 230408 5192 ? Ss 14:24 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00 \_
/usr/sbin/httpd -DFOREGROUND
apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00 \_
/usr/sbin/httpd -DFOREGROUND
apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00 \_
/usr/sbin/httpd -DFOREGROUND
apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00 \_
/usr/sbin/httpd -DFOREGROUND
apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00 \_
/usr/sbin/httpd -DFOREGROUND
[root@xwz ~]# ps -ef # 精簡顯示
自定義顯示欄位
[root@atopos ~]# cat /run/sshd.pid
[root@atopos ~]# ps aux |grep sshd
[root@atopos ~]# pgrep -l sshd
[root@atopos ~]# pidof sshd
檢視程序樹(需要安裝pstree)
[root@atopos ~]# pstree
top命令
動態顯示系統相關資源的管理器,有點類似於windows當中的工作管理員
[root@atopos ~]# top
[root@atopos ~]# top -d 1 # 一秒鐘重新整理一次
[root@atopos ~]# top -d 1 -p 6995 # 檢視指定PID
[root@atopos ~]# top -d 1 -p 6995,1 # 檢視多個PID程序
[root@atopos ~]# top -d 1 -u apache # 檢視指定使用者的程序
[root@atopos ~]# top -d 1 -b -n 2 > top.txt # 將2次top資訊寫入到檔案
第1行:系統時間、執行時間、登入終端數、系統負載(三個數值分別為1分鐘、5分鐘、15分鐘內的平 均值,數值越小意味著負載越低)。
第2行:程序總數、執行中的程序數、睡眠中的程序數、停止的程序數、僵死的程序數。
第3行:使用者佔用資源百分比、系統核心佔用資源百分比、改變過優先順序的程序資源百分比、空閒的資源 百分比等。
第4行:實體記憶體總量、記憶體使用量、記憶體空閒量、作為核心快取的記憶體量。(buffer和cache之間的區 別,cache是提高cpu和記憶體之間的資料交換速度,buffer是io裝置和儲存裝置之間的緩衝區)
第5行:虛擬記憶體總量、虛擬記憶體使用量、虛擬記憶體空閒量、已被提前載入的記憶體量。
程序資訊:
- h|?:幫助
- M:按記憶體的使用排序
- P:按CPU使用排序
- N:以PID的大小排序
- R:對排序進行反轉
- f:自定義顯示欄位
- 1:顯示所有CPU的負載
- k:輸入訊號
- < :向前
- > :向後
- z:彩色
- W:儲存top環境設定 ~/.toprc
訊號控制程序
[root@atopos ~]# kill -l # 列出所有支援的訊號
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42)
SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47)
SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52)
SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57)
SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62)
SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
常用訊號
訊號 | 訊號名 | 作用 |
---|---|---|
1 | SIGHUP | 重新載入配置 |
2 | SIGINT | 鍵盤中斷^C |
3 | SIGQUIT | 鍵盤退出 |
9 | SIGKILL | 強制終止 |
15 | SIGTERM | 終止(正常結束),預設訊號 |
18 | SIGCONT | 繼續 |
19 | SIGSTOP | 停止 |
20 | SIGTSTP | 暫停 |
[root@atopos ~]# ps aux |grep sshd
root 6995 0.0 0.2 112756 4356 ? Ss 9月09 0:00
/usr/sbin/sshd -D
root 31872 5.0 0.2 160844 5620 ? Ss 18:56 0:00 sshd:
root@pts/1
root 31917 0.0 0.0 112728 988 pts/1 S+ 18:56 0:00 grep --
color=auto sshd
[root@atopos ~]# kill -1 6995 # 重新載入配置檔案
例項
測試訊號9和訊號15
[root@atopos ~]# touch file1 file2
[root@atopos ~]# tty
/dev/pts/1
[root@atopos ~]# vim file1
[root@atopos ~]# tty
/dev/pts/2
[root@atopos ~]# vim file2
[root@atopos ~]# ps aux |grep vim
root 32072 0.2 0.2 151532 5064 pts/1 S+ 19:09 0:00 vim file1
root 32127 0.1 0.2 151532 5080 pts/2 S+ 19:09 0:00 vim file2
root 32176 0.0 0.0 112728 988 pts/3 S+ 19:09 0:00 grep --
color=auto vim
[root@atopos ~]# kill 32072
[root@atopos ~]# kill -9 32127
[root@atopos ~]# killall vim # 殺死所有vim程序
測試訊號18和訊號19
[root@atopos ~]# ps aux |grep httpd
root 29267 0.0 0.2 230408 5192 ? Ss 14:24 0:01
/usr/sbin/httpd -DFOREGROUND
apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
root 32229 0.0 0.0 112724 988 pts/3 S+ 19:14 0:00 grep --
color=auto httpd
[root@atopos ~]# kill -19 29267
[root@atopos ~]# ps aux |grep httpd
root 29267 0.0 0.2 230408 5192 ? Ts 14:24 0:01
/usr/sbin/httpd -DFOREGROUND
apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
root 32231 0.0 0.0 112724 984 pts/3 S+ 19:15 0:00 grep --
color=auto httpd
[root@atopos ~]# kill -18 29267
[root@atopos ~]# ps aux |grep httpd
root 29267 0.0 0.2 230408 5192 ? Ss 14:24 0:01
/usr/sbin/httpd -DFOREGROUND
apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00
/usr/sbin/httpd -DFOREGROUND
root 32233 0.0 0.0 112724 984 pts/3 S+ 19:15 0:00 grep --
color=auto httpd
踢出遠端登入使用者
[root@atopos ~]# w
19:21:16 up 1 day, 6:26, 4 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root :0 :0 四11 ?xdm? 2:05m 0.50s
/usr/libexec/gnome-se
root pts/0 :0 四11 5days 1.36s 0.36s -bash
root pts/1 192.168.222.1 18:56 4.00s 0.14s 0.02s w
centos pts/2 192.168.222.1 19:21 3.00s 0.04s 0.04s -bash
[root@atopos ~]# pkill -u centos
[root@atopos ~]# pkill -t pts/2 # 終止pts/2上所有程序
[root@atopos ~]# pkill -9 -t pts/2 # 終止pts/2上所有程序,並結束pts/2
程序優先順序 nice
Linux程序排程及多工
每個CPU(或CPU核心)在一個時間點上只能處理一個程序,通過時間片技術,Linux實際能夠執行的程序 (和執行緒數)可以超出實際可用的CPU及核心數量。Linux核心程序排程程式將多個程序在CPU核心上快速 切換,從而給使用者多個程序在同時執行的假象。(併發)
相對優先順序
由於不是每個程序都與其他程序同樣重要,可告知程序排程程式為不同的程序使用不同的排程策略。常 規系統上執行的大多數程序所使用的的排程策略為SCHED_OTHER(也稱為SCHED_NORMAL),但還有其他 一些排程策略用於不同的目的。SCHED_OTHER排程策略執行的程序的相對優先順序稱為程序的nice值, 可以有40種不同級別的nice值。
程序優先順序 0-99:實時優先順序,數字越小,優先順序越低
00-139:靜態優先順序,數字越小,優先順序越高
程序預設啟動時nice為0,優先順序為120
nice值越高表示優先順序越低,例如+19,該程序容易將CPU使用量讓給其他程序
nice值越低表示優先順序越高,例如-20,該程序更傾向於不讓出CPU
檢視程序的nice級別
使用ps檢視
[root@atopos ~]# ps axo pid,command,nice --sort=nice
[root@atopos ~]# ps axo pid,command,nice,cls --sort=-nice
TS表示該程序使用的排程策略為SCHED_OTHER
使用top檢視
NI:實際nice級別
PR:將nice級別顯示為對映到更大優先順序佇列,-20對映到0,+19對映到39
啟動具有不同nice級別的程序
啟動程序的時候為程序指定nice值
啟動程序時,通常會繼承父程序的nice級別,預設為0
[root@atopos ~]# nice -n -5 sleep 6000 &
[root@atopos ~]# ps axo command,pid,nice |grep sleep
[root@atopos ~]# nice -n -20 systemctl start httpd
[root@atopos ~]# ps axo pid,command,nice,cls |grep httpd
10146 /usr/sbin/httpd -DFOREGROUN 0 TS
10161 /usr/sbin/httpd -DFOREGROUN 0 TS
10162 /usr/sbin/httpd -DFOREGROUN 0 TS
10163 /usr/sbin/httpd -DFOREGROUN 0 TS
10164 /usr/sbin/httpd -DFOREGROUN 0 TS
10165 /usr/sbin/httpd -DFOREGROUN 0 TS
10167 grep --color=auto httpd 0 TS
更改現有程序的nice級別
- 使用top更改nice級別
r 調整程序的優先順序(Nice Level) (-20高) - - - 0 - - - (19低)
- 使用shell更改nice級別
[root@atopos ~]# sleep 7000 &
[2] 10267
[root@atopos ~]# renice -20 10267
10267 (程序 ID) 舊優先順序為 0,新優先順序為 -20
儲存管理
磁碟管理
認識Linux上的磁碟
從工作原理區分
機械硬碟HDD
固態硬碟SSD
從磁碟尺寸區分
SATA
HDD
從磁碟主要介面區分
SATA(Serial ATA)
SAS(Serial Attached SCSI)
磁碟裝置的命名
物理磁碟:/dev/sd[a-z]
KVM虛擬化:/dev/vd[a-z]
,/dev/sd[a-z]
裝置命名:
IDE:/dev/hd
SCSI,SATA,SAS,USB:/dev/sb
不同裝置上:[a-z]
同一裝置上:[1,2,3,,]
分割槽方式的區別
MBR <2TB fdisk 4個主分割槽,擴充套件分割槽,邏輯分割槽
GPT >2TB gdisk 128個分割槽
MBR: 使用32位表示扇區數,分割槽不超過2T ,按柱面進行分割槽,4個主分割槽;3主分割槽+1擴充套件(N個邏輯分 區)。
GPT:支援128個分割槽,使用64位,使用128位UUID(Universally Unique Identifier) 表示磁碟和分割槽 GPT 分割槽 表自動備份在頭和尾兩份
注意:從MBR轉到GPT,或從GPT轉換到MBR會導致資料全部丟失
儲存結構與磁碟劃分
Linux上的目錄結構前面有詳細的結束,可以看前面的內容
物理裝置的命名規則
常見的硬體裝置及其檔名稱
硬體裝置 | 檔名稱 |
---|---|
IDE裝置 | /dev/hd[a-d] |
SCSI/SATA/U盤 | /dev/sd[a-p] |
軟碟機 | /dev/fd[0-1] |
印表機 | /dev/lp[0-15] |
光碟機 | /dev/cdrom |
滑鼠 | /dev/mouse |
磁帶機 | /dev/st0或/dev/ht0 |
檔案系統與資料資料
檔案系統的作用是合理規劃硬碟,以保證使用者正常的使用需求。Linux系統支援數十種的檔案系統,而最常見的檔案系統如下所示。
檔案系統 | 解釋 |
---|---|
Ext3 | 是一款日誌檔案系統,能夠在系統異常宕機時避免檔案系統資料丟失,並能自動修復資料 的不一致與錯誤。然而,當硬碟容量較大時,所需的修復時間也會很長,而且也不能百分 之百地保證資料不會丟失。它會把整個磁碟的每個寫入動作的細節都預先記錄下來,以便 在發生異常宕機後能回溯追蹤到被中斷的部分,然後嘗試進行修復。 |
Ext4 | Ext3的改進版本,作為RHEL 6系統中的預設檔案管理系統,它支援的儲存容量高達 1EB(1EB=1,073,741,824GB),且能夠有無限多的子目錄。另外,Ext4檔案系統能夠批 量分配block塊,從而極大地提高了讀寫效率。 |
XFS | 是一種高效能的日誌檔案系統,而且是RHEL 7中預設的檔案管理系統,它的優勢在發生意 外宕機後尤其明顯,即可以快速地恢復可能被破壞的檔案,而且強大的日誌功能只用花費 極低的計算和儲存效能。並且它最大可支援的儲存容量為18EB,這幾乎滿足了所有需 求。 |
格式化後發生的事情
- Linux建立一個硬碟地圖'superblock',記錄此filesystem 的整體資訊,包括inode/block的總量、 使用量、剩餘量, 以及檔案系統的格式與相關資訊等;
- inode:記錄檔案的屬性,一個檔案佔用一個inode,同時記錄此檔案的資料所在的block 號碼,默 認一個inode表格128位元組,一個block記錄消耗4B,記錄滿了後會新建inode用於擴充套件。
- 該檔案的訪問許可權(read、write、execute)
- 該檔案的所有者與所屬組(owner、group)
- 該檔案的大小(size)
- 該檔案的建立或內容修改時間(ctime)
- 該檔案的最後一次訪問時間(atime)
- 該檔案的修改時間(mtime)
- 檔案的特殊許可權(SUID、SGID、SBIT)
- 該檔案的真實資料地址(point)
- block:用於儲存資料
計算機系統在發展過程中產生了眾多的檔案系統,為了使使用者在讀取或寫入檔案時不用關心底層的硬碟 結構,Linux核心中的軟體層為使用者程式提供了一個VFS(Virtual File System,虛擬檔案系統)介面, 這樣使用者實際上在操作檔案時就是統一對這個虛擬檔案系統進行操作了。
mount 掛載硬體裝置
[root@atopos ~]# mount 裝置名 掛載點
選項
-a:掛載所有在/etc/fstab
中定義的磁碟裝置
-t:指定檔案系統的型別
直接使用mount,只是臨時掛載,必須將分割槽資訊寫入/etc/fstab
中,在使用mount -a
掛載資訊檔案中的裝置
第一個欄位:掛載的裝置
- 一般為裝置的路徑+裝置名稱,也可以寫唯一識別碼(UUID,Universally Unique Identifier)
第二個欄位:掛載的目錄
- 指定要掛載到那個目錄下面,需要事前建立好該目錄
第三個欄位:格式型別
- 指定檔案的格式型別,
第四個欄位:許可權選項
- 若設定為defaults,則預設許可權為:rw, suid, dev, exec, auto, nouser, async
第五個欄位:是否備份
- 若為1則開機後使用dump進行磁碟備份,為0則不備份
第六個欄位:是否自檢
- 若為1則開機後自動進行磁碟自檢,為0則不自檢
umount 撤銷掛載
撤銷已經掛載的裝置檔案 umount [掛載點/裝置檔案]
[root@atopos ~]# umount /dev/sdb1
新增磁碟裝置
fdisk 管理磁碟分割槽
[root@atopos ~]# fdisk [磁碟名稱]
選項
- m:檢視可用的全部引數
- n:新增新的分割槽
- d:刪除某個分割槽檔案
- l:列出所有可用的分割槽型別
- t:改變某個分割槽的型別
- p:檢視分割槽資訊
- w:儲存並退出
- q:不儲存直接退出
掛載磁碟的步驟
1. 新增一塊磁碟
2. 使用fdisk建立分割槽
3. 使用mkfs.ext4進行檔案系統格式化
4. 使用mount掛載分割槽
du 檢視檔案資料的佔用量
[root@atopos ~]# du [選項] [檔案]
[root@atopos ~]# du -sh /*
0 /app
0 /bin
113M /boot
0 /dev
35M /etc
0 /home
0 /lib
0 /lib64
0 /media
0 /mnt
0 /opt
du: cannot access ‘/proc/20259/task/20259/fd/4’: No such file or directory
du: cannot access ‘/proc/20259/task/20259/fdinfo/4’: No such file or directory
du: cannot access ‘/proc/20259/fd/4’: No such file or directory
du: cannot access ‘/proc/20259/fdinfo/4’: No such file or directory
0 /proc
44K /root
9.6M /run
0 /sbin
0 /srv
0 /sys
0 /tmp
1.4G /usr
368M /var
選項
- -a或-all:顯示目錄中個別檔案的大小。
- -b或-bytes:顯示目錄或檔案大小時,以byte為單位。
- -c或--total:除了顯示個別目錄或檔案的大小外,同時也顯示所有目錄或檔案的總和。
- -D或--dereference-args:顯示指定符號連線的原始檔大小。
- -h或--human-readable:以K,M,G為單位,提高資訊的可讀性。
- -H或--si 與-h引數相同,但是K,M,G是以1000為換算單位。
- -k或--kilobytes:以1024 bytes為單位。
- -l或--count-links:重複計算硬體連線的檔案。
- -L<符號連線>或--dereference<符號連線>:顯示選項中所指定符號連線的原始檔大小。
- -m或--megabytes:以1MB為單位。
- -s或--summarize:僅顯示總計。
- -S或--separate-dirs:顯示個別目錄的大小時,並不含其子目錄的大小。
- -x或--one-file-xystem:以一開始處理時的檔案系統為準,若遇上其它不同的檔案系統目錄則略過。
- -X<檔案>或--exclude-from=<檔案> 在<檔案>指定目錄或檔案。
- --exclude=<目錄或檔案>:略過指定的目錄或檔案。
- --max-depth=<目錄層數>:超過指定層數的目錄後,予以忽略。
- --help:顯示幫助。
- --version:顯示版本資訊。
df 檢視檔案系統佔用情況
pass
新增交換分割槽
SWAP(交換)分割槽是一種通過在硬碟中預先劃分一定的空間,然後將把記憶體中暫時不常用的資料臨時 存放到硬碟中,以便騰出實體記憶體空間讓更活躍的程式服務來使用的技術
在生產環境中,交換分割槽的大小一般為真實實體記憶體的1.5~2倍
[root@atopos ~]# mkswap /dev/sdb1
Setting up swapspace version 1, size = 5242876 KiB
no label, UUID=494ce424-6f8e-4dc7-a1f7-7df45da24928
[root@atopos ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 195M 1.1G 9.5M 469M 1.3G
Swap: 2.0G 0B 2.0G
[root@atopos ~]# sw
swaplabel swapoff swapon switch_root
[root@atopos ~]# swapon /dev/sdb1
[root@atopos ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 200M 1.1G 9.5M 469M 1.3G
Swap: 7.0G 0B 7.0G
命令
mkswap [磁碟路徑] # 格式化swap
swapon [磁碟路徑] # 掛載swap分割槽
swapoff [磁碟路徑] # 解除安裝swap分割槽
引數:
-a:全部
磁碟容量配額
例項
描述:
- 建立5個使用者user1,user2,user3,user4,user5,密碼和使用者名稱相同,初始組為usergrp組。
- 5個使用者都可以取得300M的磁碟使用空間,檔案數量不限。超過250M,給於提示。
- usergrp這個組內成員最大使用空間1GB。
- 如果有使用者超過soft限制,給14天的寬限時間。
準備磁碟
- 建立分割槽
[root@atopos ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G
Partition 1 of type Linux and of size 2 GiB is set
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x29af810b
Device Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux
- lsblk 檢視當前分割槽情況
[root@atopos ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 2G 0 part
sr0 11:0 1 1024M 0 rom
- 格式化分割槽的檔案系統
[root@atopos ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131072 inodes, 524288 blocks
26214 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
- 建立目錄並掛載
[root@atopos ~]# mkdir /mnt/mountpoint1
[root@atopos ~]# mount /dev/sdb
sdb sdb1
[root@atopos ~]# mount /dev/sdb1 /mnt/mountpoint1/
[root@atopos ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 17G 2.2G 15G 13% /
devtmpfs devtmpfs 898M 0 898M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 9.7M 901M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 146M 869M 15% /boot
tmpfs tmpfs 182M 0 182M 0% /run/user/0
overlay overlay 17G 2.2G 15G 13% /var/lib/docker/overlay2/ea6bd330b5a7154860e3e7b90affaf8b12673a6f71ff35665ecea39a47e3bce0/merged
/dev/sdb1 ext4 2.0G 6.0M 1.8G 1% /mnt/mountpoint1
準備使用者
[root@atopos ~]# setenforce 0
# 臨時關閉SELinux
[root@atopos ~]# getenforce
Permissive
[root@atopos ~]# groupadd usergrp
[root@atopos ~]# for i in {1..5}; do useradd -g usergrp -b /mnt/mountpoint1 user$i; done
確保檔案系統支援
- 檢查掛載點是否支援quota配置
[root@atopos ~]# mount | grep mountpoint1
/dev/sdb1 on /mnt/mountpoint1 type ext4 (rw,relatime,seclabel,data=ordered)
- 重新掛載,讓檔案系統支援quota配置
[root@atopos ~]# mount -o remount,usrquota,grpquota /mnt/mountpoint1/
[root@atopos ~]# mount | grep mountpoint1
/dev/sdb1 on /mnt/mountpoint1 type ext4 (rw,relatime,seclabel,quota,usrquota,grpquota,data=ordered)
[root@atopos ~]#
安裝 quota
- 軟限制:當達到軟限制時會提示使用者,但仍允許使用者在限定的額度內繼續使用。
- 硬限制:當達到硬限制時會提示使用者,且強制終止使用者的操作。
quotacheck主要引數
- -a:掃描所有在/etc/mtab內含有quota引數的檔案系統
- -u:針對使用者掃描檔案與目錄的使用情況,會新建一個aquota.user檔案
- -g:針對使用者組掃描檔案與目錄的使用情況,會新增一個aquota.group檔案
- -v:顯示掃描過程的資訊
[root@atopos ~]# yum install -y quota
開啟 quota
[root@atopos ~]# quotacheck -avug
quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.
quotacheck: Scanning /dev/sdb1 [/mnt/mountpoint1] done
quotacheck: Cannot stat old user quota file /mnt/mountpoint1/aquota.user: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old group quota file /mnt/mountpoint1/aquota.group: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old user quota file /mnt/mountpoint1/aquota.user: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old group quota file /mnt/mountpoint1/aquota.group: No such file or directory. Usage will not be subtracted.
quotacheck: Checked 8 directories and 15 files
quotacheck: Old file not found.
quotacheck: Old file not found.
[root@atopos ~]# quotaon -avug
/dev/sdb1 [/mnt/mountpoint1]: group quotas turned on
/dev/sdb1 [/mnt/mountpoint1]: user quotas turned on
編輯配額配置
[root@atopos ~]# edquota -u user1
- 可以將針對user1的限制複製給user2
[root@atopos ~]# edquota -p user1 -u user2
- 檢視限制情況
[root@atopos ~]# repquota -as
*** Report for user quotas on device /dev/sdb1
Block grace time: 7days; Inode grace time: 7days
Space limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 20K 0K 0K 2 0 0
user1 -- 16K 245M 293M 4 0 0
user2 -- 16K 245M 293M 4 0 0
user3 -- 16K 0K 0K 4 0 0
user4 -- 16K 0K 0K 4 0 0
user5 -- 16K 0K 0K 4 0 0
測試
[user1@atopos ~]$ dd if=/dev/zero of=bigfile bs=10M count=50
sdb1: warning, user block quota exceeded.
sdb1: write failed, user block limit reached.
dd: 寫入"bigfile" 出錯: 超出磁碟限額
記錄了30+0 的讀入
記錄了29+0 的寫出
307183616位元組(307 MB)已複製,1.96853 秒,156 MB/秒
[user1@atopos ~]$ du -sh *
293M bigfile
[user1@atopos ~]$
quota 命令
Linux quota命令用於顯示磁碟已使用的空間與限制。
執行quota指令,可查詢磁碟空間的限制,並得知已使用多少空間
選項:
- -g 列出群組的磁碟空間限制。
- -q 簡明列表,只列出超過限制的部分。
- -u 列出使用者的磁碟空間限制。
- -v 顯示該使用者或群組,在所有掛入系統的儲存裝置的空間限制。
- -V 顯示版本資訊。
ln 連結
[root@atopos ~]# ln [選項] 原始檔 目標檔案
選項
- -s:建立“符號連結”(如果不帶-s引數,則預設建立硬連結)
- -f:強制建立檔案或目錄的連結
- -i:覆蓋前先詢問
- -v:顯示建立連結的過程
連結方式
在Linux系統中存在硬連結和軟連線兩種檔案
- 硬連結(hard link):
- 可以將它理解為一個“指向原始檔案inode的指標”,系統不為它分配獨立的inode和檔案。所 以,硬連結檔案與原始檔案其實是同一個檔案,只是名字不同。我們每新增一個硬連結,該文 件的inode連線數就會增加1;而且只有當該檔案的inode連線數為0時,才算徹底將它刪除。 換言之,由於硬連結實際上是指向原檔案inode的指標,因此即便原始檔案被刪除,依然可以 通過硬連結檔案來訪問。需要注意的是,由於技術的侷限性,我們不能跨分割槽對目錄檔案進行連結。
- 軟連結(也稱為符號連結[symbolic link]):
- 僅僅包含所連結檔案的路徑名,因此能連結目錄檔案,也可以跨越檔案系統進行連結。但是, 當原始檔案被刪除後,連結檔案也將失效,從這一點上來說與Windows系統中的“快捷方式”具 有一樣的性質
軟連結和硬連結的區別
硬連結的特點
- 不論是修改原始檔(test 檔案),還是修改硬連結檔案(test-hard 檔案),另一個檔案中的 資料都會發生改變。
- 不論是刪除原始檔,還是刪除硬連結檔案,只要還有一個檔案存在,這個檔案都可以被訪問。
- 硬連結不會建立新的 inode 資訊,也不會更改 inode 的總數。
- 硬連結不能跨檔案系統(分割槽)建立,因為在不同的檔案系統中,inode號是重新計算的 硬連結不能連線目錄
軟連結的特點
- 不論是修改原始檔(check),還是修改軟連結檔案(check-soft),另一個檔案中的資料都會 發生改變。
- 刪除軟連結檔案,原始檔不受影響。而刪除原檔案,軟連結檔案將找不到實際的資料,從而顯 示檔案不存在。
- 軟連結會新建自己的 inode 資訊和 block,只是在 block 中不儲存實際檔案資料,而儲存的是 原始檔的檔案 名及 inode 號。
- 軟連結可以連結目錄。 軟連結可以跨分割槽
例項
軟連結
[root@localhost ~]# echo "hello" > test
[root@localhost ~]# ln -s test test123
[root@localhost ~]# cat test123
hello
[root@localhost ~]# ls -l test
-rw-r--r--. 1 root root 6 Apr 12 06:10 test
[root@localhost ~]# rm -f test
[root@localhost ~]# cat test123
cat: test123: No such file or directory
硬連結
[root@localhost ~]# echo "hello" > test
[root@localhost ~]# ln test test123
[root@localhost ~]# cat test123
hello
[root@localhost ~]# ls -l test
-rw-r--r--. 2 root root 6 Apr 12 06:12 test
[root@localhost ~]# rm -f test
[root@localhost ~]# cat test123
hello
RAID(獨立冗餘磁碟陣列)
LVM(邏輯卷管理器)
軟體包管理
軟體包的型別
- 原始碼包
- 需要自己編譯
- 二進位制包
- 已編譯
常見的二進位制包
- RedHat/Centos
- RPM
- 工具
- rpm
- yum:(自動安裝,自動解決依賴關係)
- Ubuntu/Debain
- DPKG
- 工具
- dpkg
- apt:(自動安裝,自動解決依賴關係)
rpm 包管理
- rpm工具使用分為安裝、查詢、驗證、更新、刪除等操作
- rpm包的格式說明:
[root@atopos ~]# rpm -ivh httpd-2.4.6-93.el7.centos.x86_64.rpm
- httpd:包名
- 2:主版本號
- 4:次版本號
- 6:修訂次數,指的是第幾次修改bug
- 93:release(第幾次釋出,指的是簡單的修改引數)
- e17:作業系統版本
- x86_64:64位作業系統
- 命令格式:
[root@atopos ~]# rpm [選項] 軟體包
選項
安裝:
- -i:install的意思,安裝軟體包
- -v:顯示附加資訊,提供更多詳細資訊
- -V:校驗,對已安裝的軟體進行校驗
- -h --hash:安裝時輸出###標記
查詢:
- -q:查詢,一般跟下面的引數配合使用
- -a:查詢所有已安裝的軟體包
- -f:系統檔名(查詢系統檔案屬於哪個安裝包)
- -i:顯示已安裝的rpm軟體包資訊
- -l:查詢軟體包檔案的安裝位置
- -p:查詢未安裝軟體包的相關資訊
- -R:查詢軟體包的依賴性
解除安裝:
- -e:erase
- --nodeps:忽略依賴
升級:
- -U:一般配合vh使用
例項:安裝
[root@atopos ~]# rpm -ivh
http://centos.ustc.edu.cn/centos/7/os/x86_64/Packages/httpd-2.4.6-
93.el7.centos.x86_64.rpm
[root@localhost ~]# rpm -ivh vim-enhanced-7.4.629-6.el7.x86_64.rpm
警告:vim-enhanced-7.4.629-6.el7.x86_64.rpm: 頭V3 RSA/SHA256 Signature, 金鑰 ID
f4a80eb5: NOKEY
錯誤:依賴檢測失敗:
libgpm.so.2()(64bit) 被 vim-enhanced-2:7.4.629-6.el7.x86_64 需要
libperl.so()(64bit) 被 vim-enhanced-2:7.4.629-6.el7.x86_64 需要
perl(:MODULE_COMPAT_5.16.3) 被 vim-enhanced-2:7.4.629-6.el7.x86_64 需要
vim-common = 2:7.4.629-6.el7 被 vim-enhanced-2:7.4.629-6.el7.x86_64 需要
# 需要自己手動解決依賴關係
# 額外安裝選項
# --nosignature 不檢驗軟體包的簽名
# --force 強制安裝軟體包
# --nodeps 忽略依賴關係
例項:查詢
[root@atopos ~]# rpm -q vim-enhanced
vim-enhanced-7.4.629-8.el7_9.x86_64
[root@atopos ~]# rpm -qa |grep vim-enhanced
vim-enhanced-7.4.629-8.el7_9.x86_64
[root@atopos ~]# rpm -ql vim-enhanced
/etc/profile.d/vim.csh
/etc/profile.d/vim.sh
/usr/bin/rvim
/usr/bin/vim
/usr/bin/vimdiff
/usr/bin/vimtutor
[root@atopos ~]# rpm -qc openssh-server
/etc/pam.d/sshd
/etc/ssh/sshd_config
/etc/sysconfig/sshd
[root@atopos ~]#
例項:解除安裝
[root@atopos ~]# rpm -e tree
原始碼包管理
原始碼包安裝三絕招
./configure
#可以指定安裝路徑,啟用或者禁用功能等,最終生成makefile
make
#按Makefile檔案編譯
make install
#按Makefile定義的檔案路徑安裝
make clean
#清除上一次make命令所產生的object檔案,要重新執行
configure時,需要執行make clean。
例項
- 炫酷程式碼雨編譯安裝
[root@localhost ~]# yum -y install ncurses* gcc gcc-c++
[root@localhost ~]# tar xf cmatrix-1.2a.tar.gz
[root@localhost ~]# cd cmatrix-1.2a
[root@localhost cmatrix-1.2a]# ./configure
[root@localhost cmatrix-1.2a]# make
[root@localhost cmatrix-1.2a]# make install
[root@localhost cmatrix-1.2a]# cmatrix
yum 包管理
yum 介紹
- yum是一個前端軟體包管理器。基於rpm包管理,能夠從指定的伺服器自動下載rpm包並且安裝,可以自動處理依賴關係,並且一次安裝所有依賴的軟體包,無需繁瑣的一次次下載、安裝。yum提供了查詢、安裝、刪除某一個、一組甚至全部軟體包的命令,而且命令簡介而又好記。
- yum可以自己解決依賴關係
本地原始檔解釋
# 路徑
[root@atopos ~]# ls /etc/yum.repos.d/
name=centos #源的描述資訊
baseurl=https://xxxx.xxx.xxx/xx # 倉庫地址
enabled=1 #啟動yum,0為不啟用
gpgcheck=0 #不使用使用公鑰檢驗rpm的正確性,1為使用。
yum 換源
下載阿里雲
[root@localhost ~]# wget -O /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum 常用命令
yum install -y httpd #安裝軟體包
yum update httpd #升級軟體包,改變軟體設定和系統設定,系統版本核心都升級
yum install upgrade #升級軟體包,不改變軟體設定和系統設定,系統版本核心都升級
yum info httpd #查詢包
yum provides /usr/bin/find #查詢命令屬於哪一個包
yum remove -y httpd #解除安裝
yum search httpd #按關鍵字搜尋包
yum clan all #清除快取
yum makecache #生成快取
yum repolist #檢視可用的yum源
yum grouplist #列出可用組
Linux網路設定
配置網路服務
nmtui 圖形化配置工具
[root@atopos ~]# nmtui
通過網絡卡配置檔案修改
[root@atopos ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=7cb2fd3e-61dd-4856-87fa-c6db7ec0169b
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.91.128
PREFIX=24
GATEWAY=192.168.91.2
DNS1=114.114.114.114
DNS2=114.114.115.115
解釋 | 引數 |
---|---|
裝置型別 | TYPE=Ethernet |
地址分配模式 | BOOTPROTO=static(靜態)/dhcp |
網絡卡名稱 | NAME=ens33 |
是否開機自動啟動 | ONBOOT=yes |
IP地址 | IPADDR=192.168.91.128 |
子網掩碼 | NETMASK=255.255.255.0 |
字首長度 | PREFIX=24 |
閘道器地址 | GATEWAY=192.168.91.2 |
DNS地址 | DNS1=114.114.114.114 |
- 配置完成以後,需要重啟網絡卡才可以生效
[root@atopos ~]# systemctl restart network
nmcli 工具詳解
nmcli命令是redhat7或者centos7之後的命令,該命令可以完成網絡卡上所有的配置工作,並且可以寫入 配置檔案,永久生效
- 檢視介面狀態
[root@atopos ~]# nmcli device status
DEVICE TYPE STATE CONNECTION
ens33 ethernet connected ens33
ens37 ethernet connected Wired connection 1
docker0 bridge connected docker0
lo loopback unmanaged --
- 檢視連結資訊
[root@atopos ~]# nmcli connection show
NAME UUID TYPE DEVICE
docker0 ca6db5d5-a1a1-478d-8592-112d5283069d bridge docker0
ens33 122f2554-8762-40c0-8fb7-f92275a6b358 ethernet ens33
Wired connection 1 1099d5fd-29be-3f24-92d3-5f47c981fbae ethernet ens37
- 啟動/停止介面
[root@atopos ~]# nmcli connection up ens33
[root@atopos ~]# nmcli connection down ens33
- 建立連結
[root@atopos ~]# nmcli connection add type ethernet con-name dhcp_ens33
ifname ens33
- 刪除連結
[root@atopos ~]# nmcli connection delete dhcp_ens33
成功刪除連線 'dhcp_ens33'(37adadf4-419d-47f0-a0f6-af849160a4f7)。
net-tools
- 預設路由
預設路由:
route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.1.2