I am LAZY bones ? all linux

分类: '故障分析' 的归档

IPv6路由错误引起的怪异问题

我那Ubuntu源服务器(u.srt.cn),最近出现了一些很诡异的错误。
比如:之前设置的crontab同步linux.deepin.org的iso镜像,已经有一段时间没有成功过了,手工执行rsync,却发现连的似乎是自己,因为banner都出来“Thanks for using SRT ubuntu mirror.”了,但是ping linux.deepin.org 却又能得到正确的结果。
再比如之前我设置了用公钥可以ssh登录另外一台机器,但是现在却提示我输入密码。
排查了许久之后,发现了一个问题,很多(但不是全部)公网的域名虽然ping的时候对应了正确的ip,但是正在使用(比如上面的rsync或ssh)的时候,好像都指到本地了。
再后来,无意之中,发现用ping6 去ping那些有问题的域名,返回的都是 localhost(::1),于是终于知道怎么回事了:系统用IPv6去访问那些域名了,而那些域名的IPv6解析不正确。
为了验证这点,只需要把系统的IPv6彻底禁用再试试就成了,但是服务器也是ubuntu,而ubuntu最新的版本都已经把IPv6编译进内核了,不能通过rmmod来禁用IPv6了,要完全禁用需要修改grub的配置,给内核传参数才行(方法见这里)。
这显然太麻烦了,其实暂时禁用一下还是有方便的办法的,就是这样:

echo 1 | sudo tee /proc/sys/net/ipv6/conf/all/disable_ipv6

执行完以后,可以执行

ip a | grep inet6

来确认已经禁用成功了,如果这命令没有输出就OK了。
然后现在再用ping6的话,会提示connect: Network is unreachable
再去试试之前的rsync和ssh,果然都正常了。

现在我担心的是:IPv4地址不都已经枯竭了吗?接下来该怎么办呢?

gnome-panel 消失解决办法

2010年的最后一天,打开自己的blog看了一眼,最后一个月居然什么都没留下了,觉得这样实在不太好,于是趁最后时刻,写点什么。
想了一下有什么值得一写的,发现还真不多,因为近来实在是少有时间去折腾,就拿这个来充数吧,如果能帮到有同样现象的朋友,也算不错。
我的gentoo在某次升级以后,gnome-panel就突然消失不见了,我的环境是蛮正常蛮标准的gnome+compiz,我的compiz开了窗口阴影,在屏幕最上方,本来是panel的地方,阴影还是有的。ps看了一下进程,gnome-panel也在。杀掉重启,或者执行 gnome-panel –replace 都无效。看起来就是面板的高度变成了0像素。
查了任何可查的日志,也没有发现什么异常。于是google了一把,发现有人说把 .gconf 删掉就可以恢复了,于是先把整个xdm停掉,把 .gconf 改名,再启动gnome,发现面板果然正常了。当然副作用就是我的大部分设置都丢了,这是我不能接受的。
当然到了这一步,就比较好办了,虽然我的办法很土,但是有效:继续用类似二分法的办法缩小.gconf里面的影响范围,当然,由于gconfd每次都会随gnome启动,所以每做一次范围确认都得停掉gnome,再打开。呵呵,虽然麻烦,但是还是很快早到了元凶,那就是: ~/.gconf/desktop/gnome/interface/%gconf.xml 一个主管界面和字体设置的配置文件,于是,干脆把它删掉,重新在系统-首选项-外观 那里设置一下字体,我的gnome-panel就这么回来了。
可能我这个问题是因为我的ubuntu和gentoo共用一个 /home 引起的,但是奇怪的是ubuntu下面板一切正常,自是gentoo有问题。
好了,问题解决了,最后一句俗却真诚的话:新年快乐!

gentoo下的pppoe拨号

最近,无线路由坏了,所以只能先用自己的电脑拨adsl了。
其实这本也没什么,我的win7和ubuntu都只要稍微设置一下就OK了。
这里再稍微提一下ubuntu的pppoe设置:记得以前的版本(应该是6.xx的时候吧),NetworkManager是不直接支持pppoe的,还要自己手工设置,然后执行pon/poff来拨号,但是现在进步了,直接在NM里输一下用户名和密码就可以上了。
但是我的gentoo是用wicd来管理网络的,而wicd至今都还不支持pppoe,于是只能用原始的命令行来拨号了。
于是eix一搜,发现有个net-dialup/rp-pppoe,安上,看到有 pppoe-setup、pppoe-start、pppoe-stop。啥都不用说了,先pppoe-setup,再pppoe-start,本以为会很顺利,但是几次尝试都在最后一步出错了,而且提示的错误都没啥价值,不知道从何查起~
正当我无计可施,想妥协安个NetworkManager的时候,忽然灵感一现,发现了可能的错误原因,那就是──内核模块。原来,之前我的gentoo内核基本上也是按需配置的,以前我一直都有路由器拨号,所以没有在内核选项里打开ppp的支持,才导致了这一郁闷的结果,哈哈,既然发现了可能的原因,那就好办了,make menuconfig 里面选上 Device Drivers —>Network device support —>PPP (point-to-point protocol) support 下面的所有项,编译完再重启。再 pppoe-start ,果然看到了 Connected!

记一下我的ubuntu升级到10.04时遇到都问题

今天,为了测试一下阿里拼音,很难得地进了一次ubuntu,后来发现居然还是9.10的版本,看不下去了,就顺手升级了一下。
本以为这种升级历史上已经做过很多次,应该不会有什么问题的,但是今天还是遇到问题了,就在这里记一下吧。
我升级的思路比较老土,就是先

sudo sed 's/karmic/lucid/g' -i /etc/apt/sources.list

再apt-get update,再一直交替进行upgrade和dist-upgrade,直到完全没有错误,再重启。如果中间遇到某个包有问题,一般是先卸载这个包,升级完成以后再给安装上就好了。
但是今天遇到一个无法先卸载的包,到某步的时候,出来这样一个错误:

E: Could not perform immediate configuration on ‘util-linux’.Please see man 5 apt.conf under APT::Immediate-Configure for details. (2)

很明显,这个是 util-linux 包出问题了,但是这个包太底层了,如果卸了这个,整个ubuntu就差不多没了,我可不敢保证我还能给折腾回去。
解决问题的思路:
先试着手工dpkg安装这个包:

sudo dpkg -i /var/cache/apt/archives/util-linux_2.17.2-0ubuntu1_i386.deb
dpkg:对于含 util-linux 的文件 .../util-linux_2.17.2-0ubuntu1_i386.deb 来说,有预依赖(pre-dependency)方面的问题:
 util-linux 预依赖于 libc6 (>= 2.11)
  已安装了 libc6,不过安装的版本是 2.10.1-0ubuntu17。
dpkg:处理 /var/cache/apt/archives/util-linux_2.17.2-0ubuntu1_i386.deb (--install)时出错:
 预依赖(pre-dependency)问题 - 将不安装util-linux
在处理时有错误发生:
 /var/cache/apt/archives/util-linux_2.17.2-0ubuntu1_i386.deb

看来其实是libc6这个包版本有问题,于是查到这个包及其依赖包的deb,手动下载并安装:

wget http://security.ubuntu.com/ubuntu/pool/main/e/eglibc/libc6_2.11.1-0ubuntu7.2_i386.deb
wget http://security.ubuntu.com/ubuntu/pool/main/e/eglibc/libc-bin_2.11.1-0ubuntu7.2_i386.deb
sudo dpkg -i libc6_2.11.1-0ubuntu7.2_i386.deb libc-bin_2.11.1-0ubuntu7.2_i386.deb

这样成功以后,就比较好办了,虽然直接dist-upgrade仍然不行,但是执行

sudo apt-get dist-upgrade -f

就可以成功解决此问题了。

现在分析看来应该是由于我的sources.list里面没有security部分造成的,如果在里加上

deb http://security.ubuntu.com/ubuntu lucid-security main restricted universe multiverse
deb-src http://security.ubuntu.com/ubuntu lucid-security main restricted universe multiverse

应该就不会错了吧~

都说ubuntu的大版本升级比较折腾,看来还真是,呵呵。幸好咱也算老手了,不然遇到这种问题,还不被整成重装啊?

vsftpd只能匿名登录,本地用户出现530错误的一个实例

网上很多教程,在介绍vsftpd的本地用户的配置的时候,大意都是这样的:

建立一个xxx用户,家目录为/yyy/zzz,并把这个用户的shell(/etc/passwd里对应行的最后一列)设置成/sbin/nologin或者是/bin/false,再设置一个密码。
然后修改vsftpd的配置文件,一般是/etc/vsftpd.conf,加上:

local_enable=YES
write_enable=YES
local_umask=022

然后重启vsftpd就可以了。

对于出现530 Login incorrect. 的解释一般是两种:
1. xxx用户对 /yyy/zzz 没有权限。
2. xxx用户被加到 /etc/vsftpd.user_list 列表里了。
但是我今天的操作中,这个新建的用户并没有发现以上两种现象,仍然出现了可恶的530错误,但是匿名用户正常登录。
折腾半天以后,发现用一个shell是/bin/bash的用户却是可以登录ftp的。于是,试着把xxx用户的shell也改成/bin/bash,果然也可以登录了。但是这样显然还没有解决我的问题,因为这样一来,xxx这个用户都可以通过ssh登录服务器了,安全就没有保障了。
于是再找更详细的原因,终于发现了:
其实vsftpd对本地用户鉴权的过程中是可以检查用户shell的合法性的,而且默认就启用了。虽然你可以在配置文件中通过添加

check_shell=NO

来取消vsftpd对shell的检测,但是这个配置项要生效却有个前提:编译的时候不能包含PAM特性(一种*nix系统中的插件式身份鉴别模块),而ubuntu等发行版的二进制包并不能满足这点,所以除非你是自己编译的vsftpd,这个配置项是没有多少用的。
要解决这个问题,还得继续问:vsftpd是怎么检查一个shell是否合法呢?其实这个答案很简单,vsftpd读取 /etc/shells 这个文件,如果用户的shell在这个文件里存在,就认为合法,否则即使你输入了正确的密码,仍然会给你一个530,哈哈。
所以,解决办法就是:把 /sbin/nologin 或者是 /bin/false 加到 /etc/shells 中去!

grub故障一例

昨天,心血来潮进了一下许久没有使用过的ubuntu,然后顺手给它升级了一下,发现这个把月已经有200多M的更新了,其中也包括内核在内。
于是开开心心地dist-upgrade完了,也没啥异常。但是到了昨晚,再开机的时候,发现机器没有正常显示grub菜单,而是直接进入了GRUB>这样的命令行。幸好我还记得几个grub的命令,瞎蒙地还算是启动了我的gentoo,然后上网一google,发现这个问题和我之前把文件系统全面升级到ext4有关:在升级了文件系统以后,再升级内核的话,就会导致grub找不到某些文件而无法正常工作。
解决办法就是在gentoo里chroot到ubuntu的/分区(因为我的grub是在ubuntu下安装的),然后执行:

grub-install --recheck /dev/sda

如果没报什么错误的话,那恭喜你,你的grub又回来了。
当然,有人会问:如果我硬盘上没有gentoo或者记不住grub命令无法启动的话,怎么办呢?其实很简单,你只要随便找个linux的LiveCD,或者U盘系统之类的,启动以后,就一样可以chroot了。
哈哈,linux很灵活,所以基本是不死的(当然你要对它有足够了解才行)~

lafilefixer

前几天,对gentoo进行常规升级的时候,就有个别包没有编译过去,这对gentoo来说本不算什么的(谁让咱用的是 ~x86 呢),也就没太在意,但是近来越来越多的不同的包都出现了同一个错误:
报缺少 /usr/lib/libGL.la 文件,revdep-rebuild 也不能解决问题,甚至 revdep-rebuild 的过程中也有这个错误。
于是到sir里搜了一下,发现已经有人问过了,也得到了解决。
解决办法就是装上 lafilefixer ,运行一下

lafilefixer --justfixit

其实,la文件本身就是一个记录同名动态库或者静态库文件信息的一个文本文件。而lafilefixer也仅仅是一个bash脚本,它把需要更新的la文件都重写了一遍,哈哈。

Gentoo换了profile以后,鼠标键盘不能动的解决办法

Gentoo 10.0 的profile出来已经蛮久了,但是我一直都没换,直到昨天才设置成了 default/linux/x86/10.0/desktop ,结果一大堆包需要重新编译了(呃。。好吧,其实我本来就有好几天没更新系统了。。)。
编译完重启就发现问题了:启动到gdm以后,鼠标键盘都动不了了,按什么键都无效,输不了用户名了,包括ctrl+alt+F1都不管用了,但是触摸板却是有效的。
第一个想到的 qlist -I -C x11-drivers/ 里面的几个包重新编译一下,发现无效;然后看elogv,发现hal说要把xorg.conf里的input相关的都删掉,试了也无效。
最后的解决办法是:在 /etc/make.conf 的 INPUT_DEVICES= 里加上 evdev ,然后安装 x11-drivers/xf86-input-evdev 这个包。

使用了ecryptfs的情况下,ssh的publickey登陆无效的解决办法

eCryptfs – Enterprise Cryptographic Filesystem 是linux下一个企业级的磁盘加密系统。
使用这个系统,可以使得用户的文件只有在用户登陆以后才是可见的,这样,即使你的硬盘被人偷走了,只要的你的密码足够安全不被破解,人家也无法读取你的私人文件(CGX真该用这个啊)。
目前,ubuntu 9.04 server 在安装时,已经可以选择用eCryptfs来加密用户的家目录了。
今天我装服务器的时候,觉得这个挺好玩的,就顺便启用了,却导致了一点点小问题,如下:
我在装好服务器openssh-server以后,很自然就把我的公钥复制到服务器上,来减少我输入密码的麻烦。没想到,登出了以后,再登进来时,原本应该不用密码的,却还提示我输入密码。后来还发现,只要有一个用密码登陆成功了以后,其他termianl再登陆的时候,就是正常的。于是想到可能就是 eCryptfs 搞的鬼,放google一搜,果然是的,已经有先例了。
那bug里解决办法也有了,我再贴一下:
方法一:

 $ /sbin/umount.ecryptfs_private
 $ cd $HOME
 $ chmod 700 .
 $ mkdir -m 700 .ssh
 $ chmod 500 .
 $ echo $YOUR_REAL_PUBLIC_KEY > .ssh/authorized_keys
 $ /sbin/mount.ecryptfs_private

这样就可以把你的公钥加到服务器的还未解锁的家目录下了。ssh的鉴权自然也可以顺利通过了。

方法二:
修改服务器的 /etc/ssh/sshd_config 把authorized_keys放到用户家目录以外的地方,以避开此问题。
例如加上:

AuthorizedKeysFile /etc/.ssh/%u/authorized_keys

延伸阅读:另一起SSH服务器端不认RSA公钥的故障

GRUB故障一例

今天一早,MM就打电话来说,她的电脑启动不了了,开机只显示一个GRUB…
当时由于各自在公司,不好处理,于是她先用ubuntu liveCD撑着,下班了,把电脑背了回来~
我打开一看,乖乖,果然只有一个”GRUB “,注意不是”GRUB> “后面跟一个闪动的光标,而是纯粹的GRUB空格后一个不会闪的光标,按任何键都没有用了.
故障肯定是MBR被破坏了,也不知道是不是windows下的病毒干的…
由于这电脑装的是原装的ubuntu+XP,恢复分区也已经在装XP时被我干掉了.之前备份的MBR也不知道去哪了…于是首先尝试用liveCD恢复grub.然而,可能由于之前装的grub2,jaunty liveCD里的grub仍然是老的,所以 grub-install 一直都没能成功.
后来我是在liveCD里这么做才成功的:

sudo mkdir /mnt/sda3
sudo mount /dev/sda3 /mnt/sda3
sudo mount -t proc none /mnt/sda3/proc
sudo mount -o bind /dev /mnt/sda3/dev
sudo chroot /mnt/sda3 /bin/bash
sudo grub-install /dev/sda3
sudo update-grub

这个故事告诉我们,有时候用liveCD修改MBR不成功的话,可以chroot用原来的grub的可执行文件进行修复,成功的概率会高很多~