在运维工作中随着我们积累的经验不断增多,不知你是否遇到过以下几个场景:
下面我就来具体介绍下我的处理方式吧。
在Linux中对于删除大量小文件或删除大文件,我们一般会通过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_tmp2. 需要清空的目标目录 /del_dest3. 如果目标目录下有大量的小文件,清空目录下文件 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】时,意思是删除该目录下的所有文件,使其变为空目录;
Vsphere虚拟机新添加硬盘进行LVM扩容,此时需要重启刷新文件系统,否则无法识别新添加的硬盘。重启服务器这对于生产环境来说是不允许的,那么有什么方法能够实现在线刷新文件系统呢?
在此有两种方法:
第一种方法
没有新增硬盘前的SCSI设备参数如图
如果新添加的硬盘为“Direct-Access”类型,因此我们需要执行命令,将Id+1后将是新磁盘的Id号:echo 'scsi add-single-device 2 0 1 0' > /proc/scsi/scsi
其中:
增加硬盘后的SCSI设备参数如图
第二种方法:
# 刷新SCSI,需要根据hosts数量确认刷新次数。# 如果系统有3个scsi host,则需要刷新3次echo "- - -" > /sys/class/scsi_host/host0/scanecho "- - -" > /sys/class/scsi_host/host1/scanecho "- - -" > /sys/class/scsi_host/host2/scan
以上两种方式都可以实现在不重启服务器的情况下识别到新添加的硬盘,请根据实际情况进行选择。
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,删除此目录不会产生任何影响。
不同Linux服务器之间的共享,我们一般通过NFS来实现。但是有一次同事在进行迁移ELK时,使用了sshfs命令快速基于ssh协议快速实现了数据的共享。
SSHFS(Secure SHell FileSystem)是一个客户端,可以让我们通过 SSH 文件传输协议(SFTP)挂载远程的文件系统并且在本地机器上和远程的目录和文件进行交互。
具体使用如下:
# 1.安装 SSHFSyum install sshfs# 2.创建 SSHFS 挂载目录mkdir /mnt/data# 3.使用 SSHFS 挂载远程的文件系统sshfs test@x.x.x.x:/home/test/ /mnt/data如果SSH有密钥授权,我们也可以使用公钥实现挂载sshfs -o IdentityFile=~/.ssh/id_rsa test@x.x.x.x:/home/test/ /mnt/data
正如你所看到的,通过sshfs命令我们快速实现了挂载,相对于NFS非常方便。
对于Linux操作系统,我们一般使用usermod命令来调整用户分组,但是在使用过程中是有痛点的。
# 1.新增3个用户# useradd test1uid=508(test1) gid=508(test1) groups=508(test1)# useradd test2uid=509(test2) gid=509(test2) groups=509(test2)# useradd test3uid=510(test3) gid=510(test3) groups=510(test3)# 2.调整test1 附加组# usermod -G test2 test1uid=508(test1) gid=508(test1) groups=508(test1),509(test2)# usermod -G test3 test1uid=508(test1) gid=508(test1) groups=508(test1),510(test3)# usermod -G test2,test3 test1uid=508(test1) gid=508(test1) groups=508(test1),509(test2),510(test3)
通过以上命令,我们可以看到以下痛点:
那么是否有命令可以让我们在不必提前知道原来的分组信息的情况下而直接更新分组呢?gpasswd就可以解决我们的痛点问题,它是Linux下工作组文件/etc/group和/etc/gshadow管理工具,用于将一个用户添加到组或者从组中删除。
# 1.将test1添加到test2分组# gpasswd -a test1 test2uid=508(test1) gid=508(test1) groups=508(test1),509(test2)# 2.将test1添加到test3分组# gpasswd -a test1 test3uid=508(test1) gid=508(test1) groups=508(test1),509(test2),510(test3)
我们一般不会遇到用户同时隶属于多个分组的情况,但是在做文件共享,因权限分离需求才会用到,此时我们通过gpasswd命令会方便很多。