天天看點

一些讓人拍案叫絕的運維小技巧

作者:LinkSLA智能運維管家

需求

在運維工作中随着經驗不斷增多,想必這些場景經常遇到:

  • Linux如何快速删除大量檔案?
  • Vsphere如何在不重新開機的情況下識别新添加的iscsi硬碟?
  • Linux中rm指令如何做到防誤删?
  • 不同Linux伺服器之間如何實作快速挂載?
  • Linux中如何将使用者快速添加到附屬組?
  • 細心的人往往會通過自己特有的方式來快速處理,不禁讓人拍手叫絕。

下面我就來具體介紹下我的處理方式吧。

1.Linux如何快速删除大量檔案?

在Linux中對于删除大量小檔案或删除大檔案,我們一般會通過rm指令直接删除,這時你就很有可能會遇到以下問題:

  • rm删除過程耗時很長,效率低下;
  • rm删除完畢後,檔案不存在但是磁盤空間仍未釋放;

其實以上問題都和rm指令有關,因為rm删除内容時,是将目錄的每一個條目逐個删除(unlink),而且需要循環重複周遊很多次;雖然unlink解除,但是程序仍可以讀取已删除的問題件,導緻磁盤不釋放。

在此我們可以使用rsync指令來代替rm。rsync删除内容時,通過建立好新的空目錄替換掉老目錄,不需要進行大量的周遊操作,是以效率會高很多。

rsync提供了一些跟删除相關的參數如下:

rsync --help | grep delete 

     --del                   an alias for --delete-during 

     --delete                delete files that don't exist on the sending side 

     --delete-before         receiver deletes before transfer (default) 

     --delete-during         receiver deletes during transfer, not before 

     --delete-after          receiver deletes after transfer, not before 

     --delete-excluded       also delete excluded files on the receiving side 

     --ignore-errors         delete even if there are I/O errors 

     --max-delete=NUM        don't delete more than NUM files           

快速删除目錄

1. 建立一個空目錄

    mkdir -p /del_tmp

2. 需要清空的目标目錄

    /del_dest

3. 如果目标目錄下有大量的小檔案,清空目錄下檔案

    rsync --delete-before -a -H -v --progress --stats ./del_tmp/  ./del_dest/




選項說明:

–delete-before 接收者在傳輸之前進行删除操作

–progress 在傳輸時顯示傳輸過程

-a 歸檔模式,表示以遞歸方式傳輸檔案,并保持所有檔案屬性

-H 保持硬連接配接的檔案

-v 詳細輸出模式

--stats 給出某些檔案的傳輸狀态           

快速删除檔案

「注意:」當SRC和DEST檔案性質不一緻時将會報錯;當SRC和DEST性質都為檔案【f】時,意思是清空檔案内容而不是删除檔案;當SRC和DEST性質都為目錄【d】時,意思是删除該目錄下的所有檔案,使其變為空目錄;

2. Vsphere 如何在不重新開機的情況下識别新添加的iscsi硬碟?

Vsphere虛拟機新添加硬碟進行LVM擴容,此時需要重新開機重新整理檔案系統,否則無法識别新添加的硬碟。重新開機伺服器這對于生産環境來說是不允許的,那麼有什麼方法能夠實作線上重新整理檔案系統呢?

在此有兩種方法:

第一種方法

沒有新增硬碟前的SCSI裝置參數如圖

一些讓人拍案叫絕的運維小技巧
如果新添加的硬碟為“Direct-Access”類型,是以我們需要執行指令,将Id+1後将是新磁盤的Id号:

echo  'scsi add-single-device 2 0 1 0' > /proc/scsi/scsi           

其中:

  • HOST,主機擴充卡辨別,第一個擴充卡為0,在此新增加硬碟的擴充卡為2;
  • Channel,主機擴充卡上的SCSI通道,第一個通道為00,新增加磁盤的SCSI通道仍為00;
  • ID,裝置的SCSI辨別 ,即硬碟辨別從00開始,新增加磁盤的辨別為01;

增加硬碟後的SCSI裝置參數如圖

一些讓人拍案叫絕的運維小技巧

第二種方法:

# 重新整理SCSI,需要根據hosts數量确認重新整理次數。

# 如果系統有3個scsi host,則需要重新整理3次

echo "- - -" > /sys/class/scsi_host/host0/scan

echo "- - -" > /sys/class/scsi_host/host1/scan

echo "- - -" > /sys/class/scsi_host/host2/scan           

以上兩種方式都可以實作在不重新開機伺服器的情況下識别到新添加的硬碟,請根據實際情況進行選擇。

3.Linux中rm指令如何做到防誤删?

Linux系統中冒号(:)在bash中是一個內建指令,而不單純是一個分隔符,它的主要作用是空指令、參數擴充、重定向、注釋等。我們可以使用其參數擴充特性實作rm的防誤删功能。

格式:${parameter:-test}   

功能:如果parameter沒有設定或者為空,替換為test;否則替換為parameter的值。

指令:rm -rf ${dest:-test}

用法:當變量dest為空時,删除test;當變量dest不為空時,删除test

用例:rm -rf /$dest。當變量dest沒有設定或為空時,則指令變成rm -rf /,這将誤删系統根目錄,導緻系統崩潰。

改進:rm -rf /${dest:-test},當變量dest沒有設定或為空時,會使用test代替,則指令變成rm -rf /test,删除此目錄不會産生任何影響。           

4.不同Linux伺服器之間如何實作快速挂載?

不同Linux伺服器之間的共享,我們一般通過NFS來實作。但是有一次同僚在進行遷移ELK時,使用了sshfs指令快速基于ssh協定快速實作了資料的共享。

SSHFS(Secure SHell FileSystem)是一個用戶端,可以讓我們通過 SSH 檔案傳輸協定(SFTP)挂載遠端的檔案系統并且在本地機器上和遠端的目錄和檔案進行互動。

具體使用如下:

# 1.安裝 SSHFS
yum install sshfs


# 2.建立 SSHFS 挂載目錄
mkdir /mnt/data


# 3.使用 SSHFS 挂載遠端的檔案系統
sshfs [email protected]:/home/test/ /mnt/data


如果SSH有密鑰授權,我們也可以使用公鑰實作挂載
sshfs -o IdentityFile=~/.ssh/id_rsa [email protected]:/home/test/ /mnt/data           

正如你所看到的,通過sshfs指令我們快速實作了挂載,相對于NFS非常友善。

5.Linux中如何将使用者快速添加到附屬組?

對于Linux作業系統,我們一般使用usermod指令來調整使用者分組,但是在使用過程中是有痛點的。

# 1.新增3個使用者

# useradd test1

uid=508(test1) gid=508(test1) groups=508(test1)

# useradd test2

uid=509(test2) gid=509(test2) groups=509(test2)

# useradd test3

uid=510(test3) gid=510(test3) groups=510(test3)




# 2.調整test1 附加組

# usermod -G test2 test1

uid=508(test1) gid=508(test1) groups=508(test1),509(test2)

# usermod -G test3 test1

uid=508(test1) gid=508(test1) groups=508(test1),510(test3)

# usermod -G test2,test3 test1

uid=508(test1) gid=508(test1) groups=508(test1),509(test2),510(test3)           

通過以上指令,我們可以看到以下痛點:

  • 每次usermod附加組調整,會覆寫原來的分組
  • usermod調整多個分組時,必須将所有分組一并添加,否則會覆寫原來分組

那麼是否有指令可以讓我們在不必提前知道原來的分組資訊的情況下而直接更新分組呢?gpasswd就可以解決我們的痛點問題,它是Linux下工作組檔案/etc/group和/etc/gshadow管理工具,用于将一個使用者添加到組或者從組中删除。

# 1.将test1添加到test2分組

# gpasswd -a test1 test2

uid=508(test1) gid=508(test1) groups=508(test1),509(test2)

# 2.将test1添加到test3分組

# gpasswd -a test1 test3

uid=508(test1) gid=508(test1) groups=508(test1),509(test2),510(test3)           

我們一般不會遇到使用者同時隸屬于多個分組的情況,但是在做檔案共享,因權限分離需求才會用到,此時我們通過gpasswd指令會友善很多。

總結

在運維過程中我們通過正常操作就可以解決大多數問題,但是在處理過程中可能會存在效率不高、操作麻煩等問題。

個人的經驗總是有限的,學習他人技巧同樣可以快速進步呀~