现在的位置: 首页 > 综合 > 正文

减少rm命令带来的危险–写在误删Portage数据库之后

2013年09月03日 ⁄ 综合 ⁄ 共 2187字 ⁄ 字号 评论关闭

    前段时间,为了清理空间,我误删了/usr/livecd/文件夹(#rm -rf /usr/livecd/
),那竟然是Portage的数据库所在(Portage数据库,Gentoo中文手册的解释:Portage将你系统的状态(装了哪些软件包,什么文件属于哪个软件包……)保存在/var/db/pkg。不要手动改变这些文件!它可能破坏Portage对你系统的了解)。
后果就是导致emerge出错,无法安装新的软件(原因后文解释)。在Gentoo的论坛上我发现也有犯相同错误的,而且时间比我早多了(这里
),这就是滥用root权限的后果,我找到了两种解决方法:
    第一,如果你是像我一样从livecd安装Gentoo的,可以使用livecd启动系统,复制/usr/livecd/下的db目录到/var下
    第二,通过日志文件/var/log/emerge.log来恢复Portage数据库,Gentoo论坛上有人编写了这样一个脚本,可以点此处下载

    恢复数据库之后,接下来应该通过emerge来更新系统,来恢复db下的记录(#emerge --update --deep --newuse system
),建议使用system关键字,这样会比较快;然后再搜索相应缺失的库,并且重新emerge相应的包(#revdep-rebuild
)。更新系统发现,Gentoo使用了新的OpenRC来管理配置文件,启动过程由于autoconfig脚本自动配置portmap和dhcp花费了很长时间,于是从我误删了autoconfig脚本(#rm /etc/runlevels/default/autoconfig
),重启之后是快了很多,但是无法进入X window,startx也无法启动,报错提示,大意是agp模块没有加载,于是我手动加载了intel_agp,modprobe intel_agp,再运行startx,可以进入可以进入X window了,就是有点慢(呃,我在命令行倒腾了两天),这是因为没有配置opengl的缘故,进入KDE之后发现,声卡,网卡均工作不正常,lsmod发现是对应的模块没有加载,加载之(#modprobe sky2,snd-hda-intel
)。

 

    到这一步,我才意识到autoconfig的作用,而autoconfig在google project上的介绍也的确是如此(The livecd-tools package is a simple set of tools used to perform
auto-detection
on a Gentoo Linux (or Gentoo-based) LiveCD, particularly those created
with
catalyst.)

    造成其根本原因是我从livecd复制安装的Gentoo,所以/var/db/实际上是/usr/livecd/db的软链接,删除了/usr/livecd目录自然Portage崩溃;同样,livecd需要能在不同硬件上运行,所以每次默认启动都会扫描所有硬件,再使用autoconfig脚本来配置需要加载的模块。所以Linux是可以实现10s开机的,前提是得自己根据硬件信息,选择性编译内核、加载模块,去掉一些不必要的脚本。Gentoo其实就是这么提倡的(还包括不推荐使用genkernel命令。。)

    由此我想的一个问题,如何减少rm命令带来的危险?虽然linux下也有数据恢复软件(例如:Mondo Rescue,TestDisk,safecopy,PhotoRec,ddrescue ),但是用起来很不方便;就算是不使用root用户登陆由于是个人使用,还是知道root的密码,能够删除掉,而且动不动就提示permission denied,麻烦的很。我想到了两个方法,第一是定期备份系统。。。
第二个方法: 利用KDE的回收站——Trash文件夹。在KDE环境下删除文件,默认是会移到到Trash($HOME/.local/share/Trash
)下的,如果在konsole中执行rm,也能把要删除的文件移入Trash下,这样就能减少了rm命令带来的危险了。过一段时间后(例如配置为7天)Trash自动清空。如何做到呢?其实很简单,bash提供了alias的机制,能够让我们更方便的使用命令。
打开.bashrc,添加如下行:
#useful aliases
alias rm="/root/rm.sh"

再在root目录下创建rm.sh,添加如下行:
#!/bin/bash
kioclient move $1 trash:/

如果要手动清空Trash,可以使用ktrash --empty
命令,还原则使用ktrash --restore
命令即可。(而且,对于目录,不需要加-r参数也能移动到回收站下)

    当然了,这是在KDE环境下,使用的也是kioclien和ktrash命令,不过原理是相通的,没有KDE环境也能实现这样的效果:将kioclient move替换为mv命令,自定义一个trash目录(如/var/trash),然后定义一个cron计划任务,定时删除trash目录下的文件,这样也能实现回收站的效果。发现误删文件的时间一般不会间隔很长,通过这样的“定制”rm命令,能减少一定的危险,但是也会造成不便,有利有弊,各自权衡吧。

抱歉!评论已关闭.