作者:Grey
原文地址:Linux學習筆記
說明
本文中Linux基於CentOS 7,主要是日常學到的一些筆記,所以內容相對零散。
/目錄下文件夾主要作用
[root@linux /]# ll /
total 16
lrwxrwxrwx. 1 root root 7 Aug 17 02:40 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Sep 13 22:03 boot
drwxr-xr-x. 20 root root 3200 Sep 13 21:58 dev
drwxr-xr-x. 74 root root 8192 Sep 13 22:03 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 home
lrwxrwxrwx. 1 root root 7 Aug 17 02:40 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Aug 17 02:40 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Apr 11 2018 media
drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt
drwxr-xr-x. 2 root root 6 Apr 11 2018 opt
dr-xr-xr-x. 109 root root 0 Sep 13 21:58 proc
dr-xr-x---. 2 root root 151 Sep 13 21:59 root
drwxr-xr-x. 25 root root 740 Sep 13 22:03 run
lrwxrwxrwx. 1 root root 8 Aug 17 02:40 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Apr 11 2018 srv
dr-xr-xr-x. 13 root root 0 Sep 13 21:58 sys
drwxrwxrwt. 8 root root 172 Sep 13 22:58 tmp
drwxr-xr-x. 13 root root 155 Aug 17 02:40 usr
drwxr-xr-x. 19 root root 267 Aug 17 02:45 var
其中:
/boot
系統啟動相關的文件,如內核,initrd,以及grub(bootloader)
/dev
設備文件
/etc
配置文件
/home
用戶的家目錄,每一個用戶的家目錄通常默認為:/home/USERNAME
/root
管理員的家目錄
/lib
庫文件
/media
掛載點目錄,移動設備
/mnt
掛載點目錄,額外的臨時文件系統
/opt
可選目錄,第三方程序的安裝目錄
/proc
偽文件系統,內核映射文件
/sys
偽文件系統,跟硬件設備相關的屬性映射文件
/tmp
臨時文件,/var/tmp
/var
可變化的文件,比如:日志文件,數據文件
/bin
可執行文件,用戶命令
/sbin
管理命令
文件系統相關命令
df
顯示磁盤的使用情況
du
顯示文件系統的使用情況
ls
顯示目錄
Linux中的文件類型
-
普通文件
d
目錄文件
b
塊設備文件(block)
c
字符設備文件
l
符號鏈接文件(symbolic link file)
p
命令管道文件(pipe)
s
套接字文件(socket)
文件基本信息說明
掛載/卸載
/boot目錄的加載和卸載
在/下:
umount /dev/sda1
mount /dev/sda1 /boot
通過掛載實驗來演示塊設備
第一步,通過以下命令生成100m的空img文件,其中dd
命令可以用於硬盤的互相拷貝。
dd if=/dev/zero of=mydisk.img bs=1048576 count=100
第二步,使用losetup將磁盤鏡像文件虛擬成塊設備
losetup /dev/loop0 mydisk.img
第三步,通過mke2fs命令用於建立ext2文件系統。
mke2fs /dev/loop0
第四步,掛載
mkdir /mnt/myos
mount -t ext2 /dev/loop0 /mnt/myos
查看/dev/loop0
信息,它就是一個塊設備
[root@linux /]# ll /dev/loop0
brw-rw----. 1 root disk 7, 0 Sep 14 01:15 /dev/loop0
繼續完善/mnt/myos
目錄,首先,拷貝bash到myos的bin目錄中
mkdir /mnt/myos/bin
cd /mnt/myos
cp /bin/bash ./bin
查看bash需要的依賴
ldd /mnt/myos/bin/bash
linux-vdso.so.1 => (0x00007ffd88ba5000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fb19c6ca000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fb19c4c6000)
libc.so.6 => /lib64/libc.so.6 (0x00007fb19c0f8000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb19c8f4000)
模擬bash的依賴結構,我們建立好對應的依賴存放目錄
mkdir /mnt/myos/lib64
將系統中bash的所有依賴拷貝到這個目錄
cp /lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} /mnt/myos/lib64/
啟動myos下的bash
cd /mnt/myos
chroot ./
注:chroot 命令把根目錄換成指定的目的目錄。
使用echo和重定向測試bash
[root@linux myos]# chroot ./
bash-4.2# echo "d" > /abc.txt
退出bash,並在/mnt/myos目錄下,
[root@linux myos]# cat /mnt/myos/abc.txt
d
文件描述符操作實驗
第一步,創建一個文件,並寫入一些內容。
vi abc.txt
寫入一些內容
dfasdfasdfasdfa1
asdfasdfasd2
sadfasdfasd3
將abc.txt讀入4號文件描述符
exec 4< abc.txt
查看當前進程所有文件描述符
ll /proc/$$/fd
[root@linux data]# ll /proc/$$/fd
total 0
lrwx------. 1 root root 64 Sep 14 02:44 0 -> /dev/pts/0
lrwx------. 1 root root 64 Sep 14 02:44 1 -> /dev/pts/0
lrwx------. 1 root root 64 Sep 14 02:44 2 -> /dev/pts/0
lrwx------. 1 root root 64 Sep 14 02:46 255 -> /dev/pts/0
lr-x------. 1 root root 64 Sep 14 02:46 4 -> /data/abc.txt
查看當前進程打開的文件
lsof -p $$
[root@linux data]# lsof -p $$
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
....
bash 1252 root 4r REG 253,0 84 34172896 /data/abc.txt
....
將abc.txt第一行讀出來
[root@linux data]# read a 0<& 4
[root@linux data]# echo $a
sdfasdfasdfasdfasdfasdfasdfasd
文件偏移量實驗
每個進程的偏移量互不影響,每個fd會單獨維護一個seek(指針)
查看文件偏移量
lsof -op $$
可以看到,一開始偏移量(OFFSET字段):0t31
[root@linux data]# lsof -op $$
COMMAND PID USER FD TYPE DEVICE OFFSET NODE NAME
....
bash 1252 root 4r REG 253,0 0t31 34172896 /data/abc.txt
....
重新打開一個,並再次查看文件偏移量,0t0。
exec 4< /data/abc.txt
[root@linux data]# lsof -op $$
COMMAND PID USER FD TYPE DEVICE OFFSET NODE NAME
....
bash 1252 root 4r REG 253,0 0t0 34172896 /data/abc.txt
....
模擬socket實驗
模擬和baidu建立tcp連接
cd /proc/$$/fd && exec 8<> /dev/tcp/www.baidu.com/80
[root@linux fd]# ll
total 0
lrwx------. 1 root root 64 Sep 14 05:54 0 -> /dev/pts/0
lrwx------. 1 root root 64 Sep 14 05:54 1 -> /dev/pts/0
lrwx------. 1 root root 64 Sep 14 05:54 2 -> /dev/pts/0
lrwx------. 1 root root 64 Sep 14 05:55 255 -> /dev/pts/0
lrwx------. 1 root root 64 Sep 14 05:58 8 -> socket:[21649]
可以看到建立了一個socket連接
使用lsof
查看對應的文件描述符信息
[root@linux fd]# lsof -op $$
COMMAND PID USER FD TYPE DEVICE OFFSET NODE NAME
....
bash 1275 root 8u IPv4 21834 0t0 TCP 192.168.118.136:40794->183.232.231.172:http (ESTABLISHED)
....
標准輸入/輸出/錯誤輸出,以及重定向
設備 | 設備名 | 文件描述符 | 類型 |
---|---|---|---|
鍵盤 | /dev/stdin | 0 | 標准輸入 |
顯示器 | /dev/stdout | 1 | 標准輸出 |
顯示器 | /dev/stderr | 2 | 標准錯誤輸出 |
輸入重定向符號: <
read var < /path/to/a/file
輸出重定向 >
>>
2>
&>
清空輸入
echo 123 > /path/to/a/file
追加
echo 123 >> /path/to/a/file
錯誤輸入
echo 12343 2> /path/to/a/file
全部輸入
echo 122 &> /path/to/a/file
示例1:其中/asdfasdfasdf目錄不存在,所以執行ls會報錯
[root@sec ~]# ls ./ /asdfasdfasdf 1>ls01.out
ls: cannot access '/asdfasdfasdf': No such file or directory
[root@sec ~]# cat ls01.out
./:
abc.txt
anaconda-ks.cfg
cat.out
ls01.out
ls.out
由於1
表示標准輸出,所以ls01.out中只記錄了非錯誤的信息,即ls ./
的內容
如果要保存錯誤信息,可以通過如下方式:
[root@sec ~]# ls ./ /asdfasdfasdf 1>ls01.out 2>ls03.out
[root@sec ~]# cat ls03.out
ls: cannot access '/asdfasdfasdf': No such file or directory
# 或者這樣
[root@sec ~]# ls ./ /asdfasdfasdf 1> ls04.out 2>& 1
[root@sec ~]# cat ls04.out
ls: cannot access '/asdfasdfasdf': No such file or directory
./:
a
abc.txt
anaconda-ks.cfg
cat.out
ls01.out
ls02.out
ls03.out
ls04.out
ls.out
父子進程
當前進程的id號
echo $$
父進程PID是1275
再啟動一個bash
/bin/bash
再次查看當前進程號
echo $$
子進程PID為1820
在子進程中查看父子進程關系, 先安裝pstree
yum install psmisc -y
用pstree指令可以查看進程的父子關系
也可以通過
ps -ef |grep 1275
查看父子進程的關系
父進程中定義的變量和子進程中定義的變量是互相隔離的,如果需要子進程訪問父進程的變量,父進程要執行export
命令。
管道
示例1:查詢abc.txt中的第五行數據
head -5 abc.txt | tail -1
示例2:管道會開辟兩個子進程,並且左邊輸出銜接到右邊輸入,所以a=9是在子進程中執行的,父進程中a還是等於1
$$
的優先級比管道高
$BASHPID
優先級比管道低
[root@linux /]# { echo $BASHPID; read x; } | { cat; echo $BASHPID; read y;}
1953
1953是子進程ID
[root@linux /]# { echo $$; read x; } | { cat; echo $$; read y;}
1275
1275是父進程ID
Linux中的內部命令和外部命令
什么是Shell?
bash shell,就是一個程序,就是Linux系統安裝的一個軟件,用戶通過用戶名密碼登錄操作系統后,直接進入bash shell軟件
如果平時退出不了某個程序,可以復制一個ssh對話,用ps -ef找到那個進程,用kill -9 退出即可
Shell 命令分為外部命令和內置命令:
比較 | 內置命令 | 外部命名 |
---|---|---|
定義 | Bash Shell 自帶的命令 | Linux 系統中的應用程序 |
執行效率 | 高 | 低 |
執行過程 | 調用當前 Shell 進程的一個函數 | 觸發磁盤 I/O,fork 出一個單獨的進程,執行完成后退出 |
內部命令(Shell自帶的命令)
查看cd
命令
type cd
顯示:cd is a shell builtin
說明cd
命令是shell自帶的命令
通過
help -d
可以查看所有內置命令
外部命令(不是Shell自帶的命令,由用戶安裝的)
比如ifconfig
命令
type ifconfig
顯示:ifconfig is /usr/sbin/ifconfig
使用file
命令查看命令是一個什么類型的文件
file /usr/sbin/ifconfig
顯示:
/usr/sbin/ifconfig: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=22d5b3be8d3ce3c71cad5b982581ede262397b56, stripped
使用whereis
查看某個命令在哪個位置
whereis ifconfig
顯示
ifconfig: /usr/sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
此外:
-
內部命令的幫助用help指令,外部命令的幫助用man指令
-
bash shell在執行命令的時候,做了兩步優化:1. 通過PATH來(echo $PATH) 2. 通過hash來,hash查看,hash -r(清空hash)
編寫腳本時候, 如需要執行,要賦予該文件執行權限chmod u+rx filename
如果bash執行,不需要賦予執行權限
bash ./filename.sh
./filename.sh
以上兩種執行方式都是新開一個進程
source ./filename.sh
.filename.sh
這種方式執行不會產生新的子進程
變量賦值
a=123
let a=10+2
l=ls
let c=$(ls -l /etc)
let c=`ls -l /etc`
變量值有空格等特殊字符可以包括在"" 或 ``中
可以通過echo ${變量名}
查看變量的值
變量的導出使用export
命令,讓子進程獲得父進程的變量值
變量的刪除使用unset
命令
stat和touch 組合使用,可以增量監控數據改變的時間
Linux的進程優先級
Linux采用了兩種不同的優先級范圍,一種是用nice值,它的范圍從-20 ~ +19, 默認為0;越大的nice值意味着更低的優先級,在Mac OS X中,進程的nice值代表分配給進程的時間片的絕對值;而Linux系統中,nice則代表時間片的比例。ps el
命令中的NI列就是該進程的nice值。
另一種范圍是實時優先級,其值是可以配置的,默認情況下它的變化范圍是從0到99,與nice值相反,越高的實時優先級數值意味着優先級越高。任何實時進程的優先級都高於普通進程。可以通過ps -eo state,uid,ppid,rtprio,time,comm
查看,RTPRIO
列即為實時優先級,如果顯示-
,則說明它不是實時進程。
時間同步
第一步,安裝ntpdate工具
yum -y install ntp ntpdate
第二步,設置時間為阿里服務器的時間
ntpdate ntp1.aliyun.com
第三步,將系統時間寫入硬件時間
hwclock –systohc
使用screen
Screen是一款由GNU計划開發的用於命令行終端切換的自由軟件。用戶可以通過該軟件同時連接多個本地或遠程的命令行會話,並在其間自由切換。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了統一的管理多個會話的界面和相應的功能。在Screen環境下,所有的會話都獨立的運行,並擁有各自的編號、輸入、輸出和窗口緩存。用戶可以通過快捷鍵在不同的窗口下切換,並可以自由的重定向各個窗口的輸入和輸出。
新建一個叫yourname的session
screen -S yourname
列出當前所有的session
screen -ls
回到yourname這個session
screen -r yourname
遠程detach某個session
screen -d yourname
結束當前session並回到yourname這個session
screen -d -r yourname
軟硬鏈接
硬鏈接
ln /data/x.txt /data/b.txt
通過stat查看兩個文件的信息:
stat x.txt
stat b.txt
Innode號一致,修改任何一個,另外一個都可以同步修改,刪掉任何一個,不會影響另外那個
軟連接
ln -s /data/x.txt /data/b.txt
Innode號不一致,刪掉x.txt個,b.txt的鏈接會丟失
拒絕用戶登錄
Linux用戶管理之使用/bin/false和/usr/sbin/nologin拒絕用戶登錄及其功能分析(轉)
參考資料
Linux預習資料 提取碼:7w30
CentOS6.x升級到CentOS7.x的注意事項視頻 提取碼: yhfd