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扩容,此时需要重启刷新文件系统,否则无法识别新添加的硬盘。重启服务器这对于生产环境来说是不允许的,那么有什么方法能够实现在线刷新文件系统呢?
在此有两种方法:
第一种方法
如果新添加的硬盘为“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,需要根据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 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非常方便。
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命令会方便很多。