Linux基礎(二)

Linux基礎相關知識點

1. Linux的系統目錄

1.1 查看Linux發行版的系統相關性信息及查看系統目錄

1.1.1 查看系統相關信息

顯示系統內核版本

[flamenca@localhost ~]$ uname -r
3.10.0-1062.el7.x86_64

顯示操作系統的發行版本

[flamenca@localhost ~]$ cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

顯示主機名

[flamenca@localhost ~]$ hostname
localhost.localdomain

1.1.2 查看目錄信息

通過命令tree來查看對應目錄的全貌,我們要查看系統目錄,所以按如下輸入:

[flamenca@localhost ~]$ man tree
# 先看看用法
NAME
       tree - list contents of directories in a tree-like format.

SYNOPSIS
       tree  [-acdfghilnpqrstuvxACDFQNSUX]  [-L  level  [-R]]
       # 這裏有個 -L 選項,只顯示層數,我們不需要將系統整個目錄鋪開,只想看根目錄/下的第一層系統目錄。

所以,我們應該在命令行輸入:tree -L 1 /

[flamenca@localhost ~]$ tree -L 1 /
/
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

19 directories, 0 files

那麼這些目錄到底是有什麼用呢?爲啥是這樣定義目錄的捏?

請看下一小節

1.2 LInux系統目錄名稱規律及相關用途

你知道FHS(Filesystem Hierarchy Standard 文件系統層次結構標準)嗎?

不知道的話看補充吧,多數Linux發行版遵從FHS標準並且聲明其自身政策以維護FHS的要求。

/
# 文件系統從根目錄下開始,用"/"表示

    /bin # 所有用戶可用的基本命令程序文件

    /sbin # 提供系統管理使用的工具程序

    /boot # 引導加載器必須用到的各種靜態文件:kernel、initramfs、grub等

    /dev # 存儲特殊文件或設備文件:
    	# 設備有兩種類型:字符設備(線性設備,有順序)、塊設備(隨機設備);

    /etc # 系統程序的配置文件,只能爲靜態

    /home # 普通的家目錄的集中位置:一般每個普通用戶的家目錄默認爲此目錄下雨用戶名同名的子目錄。
    	/home/USERNAME

    /root # 管理員的家目錄,可選;

    /lib # 爲系統啓動或根文件系統上的應用程序(/bin, /sbin)提供共享庫,以及爲內核提供內核模塊
        libc.so.* # 動態鏈接C庫
        ld* # 運行時鏈接器/加載器
        modules # 用於存儲內核模塊的目錄

    /lib64 # 64位系統特有的存放共享庫的路徑:

    /media # 便攜式設備掛載點,cdrom ,floppy等;

    /mnt # 其他文件系統的臨時掛載點

    /opt # 插件的安裝位置 Add-on application,第三方應用程序

    /srv # 當前主機爲服務提供的數據,不具有通用型

    /tmp # 臨時文件,幾乎所有程序都會用到的目錄,可供所有用戶執行寫入操作,有特殊權限

    /usr # /usr Hierarchy,全局共享只讀數據路徑,
        bin,sbin
        lib,  lib64
        include # C程序的頭文件
        share # 命令手冊頁和自帶文檔等架構特有的的文件的存儲路徑位置
        local # 另一個層級目錄
        X11R6 # X-Window程序的安裝目錄
        src # 程序源碼文件的存儲位置

    /usr/local # local hierarchy,讓系統管理員安裝本地應用程序:也通常用於安裝第三方程序

    /var # variable data files, 存儲經常發生變化的數據目錄:
        cache # Application cache data 應用緩存數據
        lib # Variable state information 可變狀態信息


    /proc # 基於內存的虛擬文件系統,內核和進程存儲其相關信息,他們多爲內核參數,例如:net.ipv4.ip_forward, 虛擬爲net/ipv4/ip_forward,存儲於/proc/sys/下,因此完整路徑爲/proc/sys/net/ipv4/ip_forward


    /sys # sysfs虛擬文件系統提供了一種比 proc 更爲理想的訪問內核數據的途徑,比/proc更新,更靈活
                # 爲管理LInux設備提供了一種同一模型的接口

補充:

FHS 文件系統層次結構標準

關於/sys的一些知識

2. 文件的元數據

2.1 什麼是文件的元數據

文件的元數據簡單來說是指文件的屬性、大小、創建時間、訪問時間、屬主屬組等信息。

在linux中我們用stat命令來查看文件的元數據信息

[flamenca@localhost ~]$ stat lovers.txt 
File: ‘lovers.txt’
Size: 82        	Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d	Inode: 102         Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/flamenca)   Gid: ( 1000/flamenca)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2020-02-24 17:30:08.449000473 +0800
Modify: 2020-01-07 15:37:45.610944099 +0800
Change: 2020-01-07 15:37:45.610944099 +0800
Birth: -

​ 補充:

元數據(Metadata)

其它文件保存信息常常伴隨着文件自身保存在文件系統中。文件長度可能是分配給這個文件的區塊數,也可能是這個文件實際的字節數。文件最後修改時間也許記錄在文件的時間戳中。有的文件系統還保存文件的創建時間,最後訪問時間及屬性修改時間。(不過大多數早期的文件系統不記錄文件的時間信息)其它信息還包括文件設備類型(如:區塊數,字符集,套接口,子目錄等等),文件所有者的ID,組ID,還有訪問權限(如:只讀,可執行等等)。

2.2 三個時間戳

在上面我們看到了一個文件的元數據信息,在信息的下方,有三行帶時間的信息,我們將其稱之爲時間戳(Timestamp):

Access: 2020-02-24 17:30:08.449000473 +0800
# Access 是 Access time的意思,表示文件的訪問時間,簡寫爲 atime ,當讀寫文件內容時,更新 atime
Modify: 2020-01-07 15:37:45.610944099 +0800
# Modify 是 Modify time的意思,表示文件的修改時間,簡寫爲 mtime ,當文件內容或數據發生改變,更新 mtime
Change: 2020-01-07 15:37:45.610944099 +0800
# Change 是 Change time的意思,表示文件的改變時間,簡寫爲 ctime ,當文件的元數據發生改變時,更新 ctime

補充:

時間戳 Timestamp

時間戳(Timestamp)是指在一連串的數據中加入辨識文本,如時間或日期,用以保障本地端(local)數據更新順序與遠程(remote)一致。

2.3 修改時間戳

我們可以使用touch命令來修改時間戳,那麼如何修改?我們先看一下touch的相關說明:

[flamenca@localhost ~]$ man touch
NAME
       touch - change file timestamps

SYNOPSIS
       touch [OPTION]... FILE...

DESCRIPTION
       Update the access and modification times of each FILE to the current time.
       # 使用該命令更新文件的訪問和修改時間爲當前時間
		...
		
		-a     change only the access time
		# 只更新訪問時間
		
		-m     change only the modification time
		# 只更新修改時間
       	-t STAMP
              use [[CC]YY]MMDDhhmm[.ss] instead of current time
        # 使用格式化的時間文本來替代默認的當前時間
        # CC	表示世紀
        # YY	表示年
        # MM	表示月
        # DD	表示日
        # hh	表示小時
        # mm	表示分鐘
        # ss	表示秒
        # 其中世紀(CC)、年(YY)、秒(ss)在中括號[]中,代表其爲可選項。
        # 例如:202002241850.30	代表:2020年02月24日18時50分30秒

現在我們實踐一下吧!

[flamenca@localhost ~]$ stat lovers.txt 
  File: ‘lovers.txt’
  Size: 82        	Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d	Inode: 102         Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/flamenca)   Gid: ( 1000/flamenca)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2020-02-24 17:30:08.449000473 +0800
Modify: 2020-01-07 15:37:45.610944099 +0800
Change: 2020-01-07 15:37:45.610944099 +0800
 Birth: -
# 上半部分是原先‘lovers.txt’文件的元數據,三個時間戳更新前的樣子
[flamenca@localhost ~]$ touch lovers.txt 
# 使用touch命令更新時間戳
[flamenca@localhost ~]$ stat lovers.txt 
  File: ‘lovers.txt’
  Size: 82        	Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d	Inode: 102         Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/flamenca)   Gid: ( 1000/flamenca)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2020-02-24 18:37:58.945143949 +0800
Modify: 2020-02-24 18:37:58.945143949 +0800
Change: 2020-02-24 18:37:58.945143949 +0800
Birth: -
# 更新後的時間戳


#######################################################################

[flamenca@localhost ~]$ touch -a lovers.txt 
# 使用-a選項只更新 atime
[flamenca@localhost ~]$ stat lovers.txt 
  File: ‘lovers.txt’
  Size: 82        	Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d	Inode: 102         Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/flamenca)   Gid: ( 1000/flamenca)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2020-02-24 18:41:14.582078349 +0800	
# atime 變成當前時間
Modify: 2020-02-24 18:37:58.945143949 +0800
Change: 2020-02-24 18:41:14.582078349 +0800
# ctime 隨 atime 而變化
Birth: -

########################################################################
[flamenca@localhost ~]$ touch -m lovers.txt 
# 使用 -m 選項只更新 mtime
[flamenca@localhost ~]$ stat lovers.txt 
  File: ‘lovers.txt’
  Size: 82        	Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d	Inode: 102         Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/flamenca)   Gid: ( 1000/flamenca)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2020-02-24 18:41:14.582078349 +0800
Modify: 2020-02-24 18:43:28.536351251 +0800
# mtime 更新爲當前時間
Change: 2020-02-24 18:43:28.536351251 +0800
# ctime 隨 mtime 而變化
Birth: -

#########################################################################
[flamenca@localhost ~]$ touch -t 202002241851.30 lovers.txt 
# 用 -t 的選項更新 atime、mtime
[flamenca@localhost ~]$ stat lovers.txt 
  File: ‘lovers.txt’
  Size: 82        	Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d	Inode: 102         Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/flamenca)   Gid: ( 1000/flamenca)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2020-02-24 18:51:30.000000000 +0800
# atime 更新爲設定好的時間
Modify: 2020-02-24 18:51:30.000000000 +0800
# mtime 更新爲設定好的時間
Change: 2020-02-24 18:55:57.055288317 +0800


3. 硬鏈接和軟鏈接

對於一個文件的信息,在Linux上被分成兩部分:數據(data)與元數據(matadata)。

數據,即指文件的數據內容是存放在文件對應的數據塊中的,數據塊是記錄文件真實內容的地方,而元數據則是文件的附加屬性,元數據中的inode是個整數,它纔是用來區分每一個不同文件的唯一標識,而非文件名,inode類似於我們的身份證號,每個文件都有一個唯一的inode。而文件名僅僅是用來方便人們的記憶和使用,系統尋找文件是通過文件的inode號來尋找正確的文件數據塊。

爲了解決文件共享的問題,Linux中引入了兩種鏈接:硬鏈接(hard link)和軟鏈接(soft link,又稱爲符號鏈接:symbolic link) ,鏈接不僅實現了linux系統共享,還帶來了隱藏文件路徑、增加權限安全及節省存儲等好處,具體實現方法可以通過ln創建鏈接文件

ln [OPTION]...[-T] TARGET LINK_NAME
# TARGET 指需要創建鏈接文件的目標文件
# LINK_NAME 指生成的鏈接文件名

# ln 命令常用選項說明:
-b # 覆蓋以前先備份
-d , -F , --directory # 允許超級用戶製作目錄的硬鏈接,系統如果限制則可能出錯
-f , --force # 強制執行
-i , --interactive # 交互模式
-n , --no-dereferenc # 把符號鏈接視爲一般目錄
-s , --symbolic # 軟鏈接(符號鏈接)
-v , --verbose # 顯示詳細處理過程
-S , --suffix=SUFFIX # 指定備份的文件後綴
--help # 顯示幫助信息
--version # 顯示版本信息

補充:

Make links between files

3.1 硬鏈接

硬鏈接本質就是對一個文件起多個文件名。所以表現爲其中一個inode號可以對應多個文件名。換言之,就是對一個文件使用了多個別名,這些別名的inode號相同。

[flamenca@localhost ~]$ ln lovers.txt Dove.txt
# 對lover.txt 文件創建硬鏈接 Dove.txt
[flamenca@localhost ~]$ ls -li
total 12
     ...
      102 -rw-rw-r--. 2 flamenca flamenca   82 Feb 24 18:51 Dove.txt
	...
      102 -rw-rw-r--. 2 flamenca flamenca   82 Feb 24 18:51 lovers.txt
	...
# 此時我們得到了硬鏈接 Dove.txt


那麼如何驗證其指向的文件是相同的?

驗證方法:我們向原 lover.txt 文件中寫入數據,如果查看 Dove.txt 中數據也發生變化,證明指向文件相同

[flamenca@localhost ~]$ echo lovers to Dove > lovers.txt 
# 寫一句話覆蓋原 lovers.txt 中的內容
[flamenca@localhost ~]$ cat lovers.txt 
lovers to Dove
# 查看 lovers.txt 內容已發生改變
[flamenca@localhost ~]$ cat Dove.txt 
lovers to Dove
# 查看 Dove.txt 內容已發生改變

由於硬鏈接是有着相同 inode 號僅文件名不同的文件,因此硬鏈接存在以下特點:

  1. 文件有相同的inode以及data block

  2. 只能對已有的文件進行創建(區別於軟鏈接)

  3. 不能跨分區創建硬鏈接

  4. 不能對目錄進行創建,只可對文件創建

  5. 刪除一個硬鏈接文件並不影響其他有相同 inode 號的文件

3.2 軟鏈接

軟鏈接與硬鏈接不同,當文件數據塊中存放的內容是另一個文件的路徑指向的話,則這個文件就是軟鏈接。

其實軟鏈接就是一個普通文件,只是他對應的數據塊內容有點特殊。

軟鏈接有着自己的inode號以及數據塊,所以創建軟鏈接沒有與硬鏈接類似的諸多限制

其特點如下:

1. 軟鏈接有自己的文件屬性及權限
2. 可對不存在的文件或者目錄創建軟鏈接(區別於硬鏈接)
3. 軟鏈接可跨分區創建
4. 軟鏈接可對文件或目錄創建
5. 創建軟鏈接時,鏈接計數不會增加
6. 刪除軟鏈接並不影響被指向的文件,但若被指向的文件被刪除,則相關軟鏈接被稱爲死鏈接,若被指向路徑文件被重新創建,死鏈接可恢復爲正常的軟鏈接

我們用ln -s命令來創建軟鏈接

[flamenca@localhost ~]$ ln -s lovers.txt lovers.txt.link
[flamenca@localhost ~]$ ls -li
total 12
	...
      102 -rw-rw-r--. 2 flamenca flamenca   15 Feb 24 21:59 lovers.txt
      124 lrwxrwxrwx. 1 flamenca flamenca   10 Feb 24 22:26 lovers.txt.link -> lovers.txt
	...
# 軟鏈接創建成功,創建軟鏈接並不會增加鏈接數


# 使用相對路徑創建軟鏈接 
[flamenca@localhost Music]$ ln -s ../bak/link.txt link.txt.link

# 對目錄或文件路徑創建軟鏈接
[flamenca@localhost Music]$ ln -s dir dir.link

4. Linux上常用的文件管理類命令

4.1 查看文件列表

使用ls命令可以查看文件的列表

選項 :

  • -a顯示所有文件及目錄 (ls內定將文件名或目錄名稱開頭爲"."的視爲隱藏檔,不會列出)
  • -l除文件名稱外,亦將文件型態、權限、擁有者、文件大小等資訊詳細列出
  • -r將文件以相反次序顯示(原定依英文字母次序)
  • -t將文件依建立時間之先後次序列出
  • -A-a,但不列出 “.” (目前目錄) 及 “…” (父目錄)
  • -F在列出的文件名稱後加一符號;例如可執行檔則加 “*”, 目錄則加 “/”
  • -R若目錄下有文件,則以下之文件亦皆依序列出

4.2 查看文件屬性信息

使用stat命令查看文件屬性

選項:

  • -b列出辨識結果,不顯示文件名
  • -c詳細顯示指令執行過程,便於排錯或者分析執行的情形
  • -f FILE指定名稱文件,其內容有一個或多個文件名時,依順序辨識這些文件類型
  • -L直接顯示符號鏈接所指向的文件類別
  • -i輸出文件對應的MIME的類型
  • -v顯示版本信息
  • -z嘗試去解讀壓縮文件的內容

4.3 創建文件

我們使用touch可以設置文件的修改與訪問時間,如果指定的文件不存在,則使用默認權限創建文件。

touch [OPTION]...FILE...

選項:

  • -a表示只更改訪問時間atime

  • -c不新建任何文件

  • -m只更改mtime

4.4 複製文件

使用cp命令來複制文件和目錄

cp [OPTION]... [-T] SOURCE DEST

選項:

  • -a此參數的效果和同時指定"-dpR"參數相同;
  • -d當複製符號連接時,把目標文件或目錄也建立爲符號連接,並指向與源文件或目錄連接的原始文件或目錄;
  • -f強行復制文件或目錄,不論目標文件或目錄是否已存在;
  • -i覆蓋既有文件之前先詢問用戶;
  • -l對源文件建立硬連接,而非複製文件;
  • -p保留源文件或目錄的屬性;
  • -r遞歸處理,將指定目錄下的所有文件與子目錄一併處理;
  • -s對源文件建立符號連接,而非複製文件;
  • -u使用這項參數後只會在源文件的更改時間較目標文件更新時或是名稱相互對應的目標文件並不存在時,才複製文件;
  • -S在備份文件時,用指定的後綴“SUFFIX”代替文件的默認後綴;
  • -b覆蓋已存在的文件目標前將目標文件備份;
  • -v詳細顯示命令執行的操作。

4.5 移動及重命名文件

使用mv命令來實現文件的移動、對文件或者目錄重命名,或者將一個文件從一個目錄移動到另一個目錄,如果該文件已經存在,那麼目標文件內容將會被覆蓋。

選項:

  • -b當文件存在時,覆蓋前,爲其創建一個備份
  • -f直接覆蓋不在提示
  • -i交互式操作,覆蓋前會先提示用戶
  • -u當源文件比目標文件新,或者目標文件不存在時才執行
  • -S --suffix=SUFFIX爲備份文件制定後綴,而不使用默認後綴
  • -t指定源文件要移動到目標目錄

4.6 刪除文件

文件的刪除和目錄的刪除都可以使用rm命令

rm [OPTION]... FILE...

選項:

  • -f強制刪除文件,在刪除時不加確認,並且自動忽略不存在的文件
  • -i在刪除每個文件之前請求確認
  • -d刪除空目錄文件,非空目錄不能刪除
  • -r遞歸刪除
  • -v顯示詳細的執行過程

6. vim基礎設置

6.1 將tab縮進改爲4個字符

首先可以在控制模式下輸入: set tabstop=4

其次我們要修改vim的配置文件.vimrc,文件的位置在~/.vimrc中。

在文件中輸入:set tabstop=4之後保存退出即可。

補充:

每個人在使用vim時都有不同的喜好設置,對於功能強大的vim而言,能設置的東西實在是太多了。所以當我們需要一些vim相對於新手而言較爲友好的設置的話,可以使用其他的配置文件,將其作爲我們自己的vim配置,在github上會有一些大佬分享自己的vim設置,有些對於使用vim的新手來說非常的方便,所以有空的話不妨找一找~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章