您的位置:首页 > 运维架构 > Linux

[置顶] Linux回收站建立

2015-03-20 10:25 169 查看
误删除是很多运维人员比较恐怖的字眼,如果事前做好准备工作防患未然就会避免此类事情发生。

虽然目前有很多恢复数据的软件,但大多数都操作繁琐,恢复效果并不理想,比如说利用lsof这种形式恢复很难把数据完全恢复回来,testdisk工具也可以恢复删除的数据,但恢复的数据都被重命名了,很难找到删除的文件,而且这种恢复方式耗时长风险大,可以把这种方法当作没有办法的办法。ext3grep也可以恢复删除的数据,但我安装了好几个小时都没安装成功,请恕本人太笨。为了满足Linux操作系统没有回收站的功能,就此运用Linux自带的bashshell
在服务器上建立回收站。

优点:1,风险低,删除的文件会被原封不动的恢复过来。

      2,速度快,只要进入到回收站mv回来就OK。

难点:1,回收站空间的限制,不能让回收站占满磁盘空间,需要分配指定大小的空间。

      2,回收站的管理,不能让回收站空间满,要有自动管理回收站里面数据大小的限制。

      3,不同删除方式的处理。

      4,删除的速度不能太慢。

主体思想:利用mv命令把要删除的数据放到指定目录下。

开始:

         1,创建一个固定大小的分区,挂载到相应目录下,目的是给回收站限额,这里我们用losetup把loop设备映射到一个模拟的分区上。

注意:这里面用dd创建的文件是50G,可以根据自己的需求定制。

#root execute
dd if=/dev/zero of=/home/map/trash/content/data.dbf bs=4k count=13045760
mkdir -p /home/map/trash/bin /home/map/trash/log /home/map/trash/data
chown -R map:map /home/map/trash/content/data.dbf /home/map/trash/bin /home/map/trash/log /home/map/trash/data
losetup /dev/loop1 /home/map/trash/content/data.dbf
mkfs -t ext3 /dev/loop1
mount -t ext3 /dev/loop1 /home/map/trash/data
</span>
上面的代码我就不解释了,不懂的话可以百度一下,这是部署脚本之前的准备工作,没有什么难度。

         2,创建删除脚本,该脚本包含了删除数据的一系列命令,超过10G的数据直接删除,大家可以根据数据量的大小来自我定制。

cat ~/trash/bin/rm.sh

#!/bin/bash
recycle_dir=~/trash/data
recycle_bin=~/trash/bin
recycle_log=~/trash/log/rm.log
function func_mv()
{
ls $1 1>/dev/null 2>/dev/null
if [ $? != 0 ];then
continue
fi

content=`du -sm $1 | awk '{print $1}'`
cur_time=`date +%Y%m%d%H%M%S`
if [[ $content -gt 10240 ]] || [[ -L $1 ]];then
/bin/rm -rf $1
else
file=${1##*/}
if [ -z $file ] ;then
file=`echo $1 | awk -F'/' '{ print $(NF-2) }'`
fi
mv $1 $recycle_dir/$cur_time\_$file
if [[ $? -ne 0 ]] ;then
sh $recycle_bin/clean.sh
mv $1 $recycle_bin/$cur_time\_$file
fi
fi
}
{
#log print
echo "`date +%Y%m%d%H%M%S`"
echo -e "`who am i` using command:rm $@"

if [ $1 == "-r" ] ;then
shift
elif [ $1 == "-rf" ] ;then
shift
elif [ $1 == "-f" ] ; then
shift
elif [ $1 == "-fr" ] ; then
shift
elif [ $1 == "--help" ] ;then
echo "You can use like this rm data/dir/link"
exit 0
elif [ $1 == "-h" ] ;then
echo "You can use like this rm data/dir/link"
exit 0
elif [[ $1 == -* ]] ;then
echo "Invalid option You can use /bin/rm !"
exit 0
fi

if [[ -z $1 ]] ;then
echo "nothing to do"
exit -1;
fi

array=$@
for data in $array
do
func_mv "$data"
done
} >> $recycle_log</span>
代码我不一一解释,其实里面无非就是几个命令,锻炼一下自我查找问题的能力。

        3,我们要创建自我回收脚本,不能让回收站持续的增长上去,撑满回收站分区的时候会导致删除数据过慢。

cat ~/trash/bin/clean.sh

#!/bin/bash
high_line=400000
low_line=300000
recycle_dir=~/trash/data
cd $recycle_dir
size=`du -sm $recycle_dir | awk '{print $1}'`
if [[ $size -gt $high_line ]] ;then
while [[ $size -gt $low_line ]]
do
ls -t $recycle_dir | grep -v total | head -n 2 | xargs /bin/rm -rf
size=`du -sm $recycle_dir | awk '{print $1}'`
done
fi</span>
 此处我们可以设置定时任务,我每天凌晨1点10分进行清理回收站的内容,当然不是全清,也不是随便清,从最早删除的数据开始清理,直到达到low_line。

crontab -l

10 01 * * * bash /home/map/trash/bin/clean.sh

        4,这时候rm -rf 或者rm -r的时候还是调用系统自带的rm命令,我们可以用alias把rm命令链接到rm.sh脚本上

vi .bashrc

alias rm="/home/map/trash/bin/rm.sh"

在.bashrc里面加alias是某一个用户的设置,如果所有用户都用该脚本的话可以

vi /etc/profile 在底部加上alias rm="/home/map/trash/bin/rm.sh"就行了

如果想在所有用户都用这个回收站功能就要注意以下回收站的权限设置。

删除的数据会被放到~/trash/data/下,可以去查找到被删除的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: