各种升级崩溃

20130821之滚挂(grub)

唉 一提两行泪本来是看到news说二进制文件移动到/usr/bin需要人工干预 是六月的 那时正在忙复习考试 之后紧接着就去了意呆利 然后就回家了 知道昨天想着 更新下系统 得写作业了 还要把意呆利游记写一下

然后点开了升级的新闻:

做第一步pacman -Qqo的时候 出现了几个 其中包括sysvinit+initscripts 跑去问仙子 仙子很吃惊问我还没有切换到systemd吗 好吧orz于是去切

另外先pacman -Syuw了 只下不安 下了一晚上

切换到systemd参考:

以及douban 里面提到的修改内核参数之类的kernel_parameters

改好之后呢 -Qqo还剩下lilo和某个东西 都卸掉 装grub

结果这里傻逼了没先看一下说明 直接pacman -S了 然后重启 妈妈咪呀 进不了系统了 直接给的grub>提示符 于是只好缠住仙子一步一步解决 再次感谢仙子TAT

应该用 grub-install+grub-mkconfig的 叫你手贱不看看公告就重启

找了下以前整grub的 试了试root (hd0,1)setup (hd0)木有反应 又问仙子 思路貌似也没太大错 于是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
	root (hd0, 1)
kernel /vmlinuz-linux root=/dev/sda1 ro
#其中第二项也可以写成 root=LABEL=xxx 或 root=UUID=yyy的形式 是后面先没写这项出错后又加的
initrd /initramfs-linux.imgboot
#其中有个神马必须pid为1的提示 于是查看shell的pid命令:
echo $$ #返回就是1啊摔
```
只好用U盘救,好在之前仙子提醒 找了个U盘做了个救援,于是用上了U盘

进去后居然说 ERROR: '/dev/disk/by-label/ARCH_201308' device did not show up after 30 seconds... Falling back to interactive prompt

于是:
```shell
mkdir /dev/disk/by-label
#这是做链接的时候报错没有such文件或目录
ln -s /dev/sdb1 /dev/disk/by-label/ARCH_201308
```
然后可以退出了 Ctrl-d

进入了 好激动TAT 耶诶

于是把本机系统挂载到/mnt
```shell
mount /dev/sda1 /mnt
mount /dev/sda2 /mnt/boot
mount /dev/sda4 /mnt/home
```
挂载好以后进入
```shell
arch-chroot /mnt
```
进去后就先升级吧
```shell
pacman -Su --ignore filesystem,bash
```
开始终于松了一口气 喝了口水过来一看居然关机了 我想是过热吧 又试了一次又关了 把冰箱里的冻粽子拿出来垫底下还过热于是查了查 /var/log/pacman.log 和everything.log 发现就是过热 于是仙子教我用cpupower
```shell
cpupower -c all frequency-set -g powersave #调到最低
cpupower -c all frequency-info #查看当前cpu频率信息
watch -n1 grep MHz /proc/cpuinfo #查看cpu频率 ctrl-c退出
```
于是一边更新一边狂扇 终于更新完了
```shell
pacman -Q grubgrub 2.00.5086-1grub-install /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg
```
于是reboot终于可以进去了 泪流满面

但是startx又不行了 ver lostS] Kernel modesetting enabled./home/xxx/.xinitrc: line 68: exec: ck-launch-session: not foundxinit: connection to X ser...
于是打开.xinitrc 注释掉ck-launch-session那行把exec xfce4打开好了TAT

认识仙子真是太好了

麻麻我更加没法换电脑了肿么办




# ipv6 设置


```shell
sudo pacman -S miredo

改DNS:

1
sudo vim /etc/resolv.conf

添加上:

1
2
3
4
5
nameserver 8.8.8.8

nameserver 8.8.4.4

nameserver 2001:470:20::2

改Hosts文件:

1
sudo vim /etc/hosts

列表在这里

重启网络:

1
sudo /etc/init.d/networking restart

执行以下命令锁定 /etc/resolv.conf 文件,使得它不能每次重启被覆盖:

1
sudo chattr +i /etc/resolv.conf

又一次升级问题

高高兴兴升级了pacman后忽然升不了级了真是令人抓狂啊 原来是因为用了GnuPG密钥签名机制

解决见此篇:

http://liujs.blogspot.com/2012/01/pacman-40-and-not-enough-random-bytes.html

但是没有解决orz

实际可行的解决在此:

https://bbs.archlinux.org/viewtopic.php?id=128378

This fixed that problem for me:

1
2
3
4
5
sudo mv /etc/pacman.conf /etc/pacman.conf.old

sudo mv /etc/pacman.conf.pacnew /etc/pacman.conf

sudo pacman-key --init

另一次喜闻乐见的滚挂

查了一下是因为某些驱动和libgl冲突的bug 解决如下:

https://bbs.archlinux.org/viewtopic.php?pid=1078658

简单地说就是libgl不升级就行了

在/etc/pacman.conf 里加上 IgnorePkg=libgl

无线网卡因为一直没用就没管 现在要用的话需要如下步骤:

网卡是 intel ipw2200 内核完全支持,但需要安装额外的固件。可以通过标准wpa_supplicant和iwconfig工具配置

根据芯片组型号,安装软件包 ipw2200-fw 重启计算机或者以root运行

 $sudo rmmod ipw2200

$sudo modprobe ipw2200

$sudo rmmod ipw2200

$sudo modprobe ipw2200 rtap_iface=1 #启用radiotap接口(root)

启用LED

大部分笔记本有LED灯指示状态,在 /etc/modprobe.d/ipw2200.conf中加入:

options ipw2200 led=1

启动接口:

$sudo ip link set eth1 up
#其中接口用iwconfig可见 我的小电上是eth1

可以用ip link来查看接口是否被创建

用networkmanager来管理网络:

$sudo /etc/rc.d/networkmanager start 
#另有 stop和restart等命令可供使用

又一次

估计是哪个包下的不完整

$ cd /var/cache/pacman/pkg                                                     $ ls *.part*
ttf-dejavu-2.33-3-any.pkg.tar.xz.part
#就是你这货!
$ rm *.part 
rm: remove write-protected regular file ‘ttf-dejavu-2.33-3-any.pkg.tar.xz.part’? y
rm: cannot remove ‘ttf-dejavu-2.33-3-any.pkg.tar.xz.part’: Permission denied
$ sudo rm *.part                                                              Password: 
$ ls *.part*    
zsh: no matches found: *.part*
$ ~                                                                       1 ↵
$ sudo pacman -Syu        
#搞定

用linux这几年了 完全没有好好学习 全都是遇到问题搜索解决 感觉好羞愧orz

txt 乱码

原因是 linux下用的编码一般是utf-8 windows 一般是gb2312 那么只需要简单的转换下就可以正常显示了。

iconv -f gb2312 -t utf-8 test.txt> testutf8.txt
(-f 就是源编码,-t 转换目标编码,test.txt源文件,testutf8.txt生成目标编码文件)

vim的配置加:

set fenc=utf-8 " default fileencoding
set fencs=utf-8,gb18030,gbk,gb2312,cp936,ucs-bom,euc-jp

glibc

这倒霉的包我从给九妹安编译环境的时候就认识了 一会儿这个和这个依赖 一会儿版本又冲突 依赖偏逢包冲突 屋漏偏逢连夜雨 折腾得我好不痛苦

话说每次看到吃豆人君要升级我就心有戚戚焉 太容易傲娇了 好在这次没什么问题

/lib目录已经存在的报错

解决如下:

https://bbs.archlinuxcn.org/viewtopic.php?id=1019

http://www.archlinuxcn.org/lib-%E7%9B%AE%E5%BD%95%E6%94%B9%E4%B8%BA%E6%8C%87%E5%90%91-usrlib-%E7%9A%84%E8%BD%AF%E9%93%BE%E6%8E%A5/

绝对不能用force 幸亏人家从来不喜欢强迫妹子233

pacman -Syu --ignore glibc 
pacman -Su

修改时区

先查一下时区:

$ grep ^TIMEZONE /etc/rc.conf

在 /usr/share/zoneinfo/ 可以找到时区列表,从中找到一个所在时间的城市

Archlinux下仅在/etc/rc.conf里把TIMEZONE设成”Asia/Shanghai”是不够的,还要在/etc/localtime做个软链接给具体的zoneinfo:

$ sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

把硬件时钟再同步回系统来,

$ sudo hwclock --hctosys

用NTP(Network Time Protocol)进行同步

装个openNTPD

$ sudo pacman -S openntpd

$ sudo /etc/rc.d/openntpd start

将openntpd加在/etc/rc.conf的DAEMONS里面,@openntpd

又一次glibc

唔 是这样的 有天早上起来 我想 啦啦啦要不就升个级吧

然后呢 我遇到一个fontconfig的错误 一串串都是字体 应该是更新字体造成的吧 so 我就放狗一搜 得到了下面的结论:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
	pacman -Suf fontconfig
```
然后呢 我就高高兴兴地忘掉了要--ignore glibc 直接force了 然后就悲剧了

再输入神马东西都没有用了 全部都not found了哦scheisse 理所当然地任何东西都打不开了 只有前面连好的网和打开的浏览器以及一个terminal还能工作 我那个心脏啊跳的吓得一身冷汗 查了一下未果 跑去技术群里问 问了半天得到了以下方法:

首先是老猫的办法:
```shell
export LD_LIBRARY_PATH=/usr/lib
#然后试了下ls等命令 哦耶可以用
/usr/lib/ld-linux.so.2 /bin/ls
/usr/lib/ld-linux.so.2 /usr/bin/pacman -Sy glibc
#但是这一步提示木有权限
/usr/lib/ld-linux.so.2 /bin/su
#但是这里的密码一直输入错误 我觉得木有记错啊从来都是那么进root的 要不就是我一开始忘了初设了?反正就是不行
#然后试sudo
/usr/lib/ld-linux.so.2 /usr/bin/sudo /usr/bin pacman -Sy glibc
#sudo不能用 后来据虫子查 sudo为了安全期间不能这么用 束手无策了

大家还说用busybox但是我不会 我也木有安装过 所以自带的那个busybox是动态的 这样调用不了 也不能用orz

最后还是四叶草君也就是大名鼎鼎的百合仙子教我用initramfs修复 过程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#在grub界面的arch entry上按e进入编辑界面
#在“kernel”起头那行的最后空格加上break=y
#然后enter 再按b进入initramfs
#手动mount自己的/分区
mount /dev/sda1 /new_root #这里我的/是挂在第一分区的
#进入
cd /new_root
#搞/lib
rm -rf lib
ln -s /usr/lib lib
#退出
cd /
umount /new_root
#然后按ctrl-d退出

然后呢 很多命令是可以用了 但是pacman提示系统是read-only 用sudo也是 向小草发短信求助 得到:

1
mount -o remount,rw /

这样可以了 于是把前面下好的glibc的包安上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
	pacman -U /home/lain/Downloads/glibc-2.16.0-4-i686.pkg.tar.xz
```
舒了一口气 但是呢 完全打不开X 而且也完全找不到网络接口 弄了半天 小草也要睡觉了 我也没什么进展 只好含泪睡了

然后今天去诺基亚指点我去的computer center去求助 名字是叫Hochschulrechenzentrum 就在应物的楼里结果我就跑去应物的楼里找半天也没看到牌子 只好问人 给我指了进去的门 一问那人也无能为力 说有个叫伊万的会linux 但是1130才会上班 叫我两点再去 所以我只好出来郁闷地逛了会儿超市 买了点东西 还去买了那个french fries的巧克力学长嘴里的传统德国速食 确实是我看到市场上一到饭点就有人排队买 还可以配米饭 今天去的时候注意了一下 那个叫作 currywurst mit pommes 我一进去还说ich möchte...呢老板娘就一眼认出我问...吗?我说是 她就开始做了 做完我说还要杯咖啡 她说了一大堆德语没听懂 向旁边小哥求助 曰 木有给girl的咖啡 只好作罢 回头一想 是因为看不出我是喝黑咖啡的纯爷们吗?

然后下午跑去rechenzentrum 看到了伊万 水灵灵的大眼睛小受啊

他就帮我查 查来查去没啥结果 忽然说 你重新pacman -Su了吗....pacman -Su...我怎么把这个忘掉了啊摔!

所以这下就可以了orz

谢谢小伊万啊

另外我问有没有什么open source club之类的东西 他说没有 还说电脑中心只有俩用linux 他用arch刚换不久 另一个人用ubuntu 我俩都在那说我们都是ubuntu学起的 亲切交换了一下much easier的感想orz

总之小电终于活回来了TAT 谢谢帮忙的诸君





补:

另外进initramfs还有一种看到的方法是加 “break=postmount”

还有一个参考如下:
```shell
1. reboot, edit the line starting with linux(or kernel) in grub, add:

init=/usr/lib/ld-2.16.so /bin/sh

2. remount the disk rw:

/usr/lib/ld-2.16.so /bin/mount -o remount,rw /

3. remove the EMPTY(yes, the error above will leave it empty) /lib folder:

/usr/lib/ld-2.16.so /bin/rmdir /lib

4. ln /usr/lib to /lib:

/usr/lib/ld-2.16.so /bin/ln -s usr/lib /lib

5. press ctrl-alt-del to reboot the machine, and re-install glibc using pacman.

Then everything is back to normal, without using a rescue cd

textlive

###texlive升级为2013出现错误###

这个公告已经挺久之前了,但是我最近没用tex…等等,其实有用,但都是在办公室用,于是完全忽略了,直到我要做dpg的简报,出现了下列错误:

(Fatal format file error; I'm stymied)

官网说上可以由pacman的输出注意到,但是我根本没看嘛。

所以解决的办法是,如果从没改过/etc/texmf, 那就可以覆盖配置文件,用pacman下载的.pacnew来代替旧的。

.pacnew 是下载后备在那里不替换旧配置
.pacsave 是下载后用新的配置而把旧配置存在那个里以便恢复
.pacorig 是软件包被替换的特殊情况

用pacdiff可以overwrite所需配置文件。

然后我傻逼兮兮地在谨慎选o但问题仍在之后给所有配置项目选了o。于是pacdiff完之后我的用户名都消失了,终端很可爱地问我“你是谁”orz

急急查了查也没啥结果,于是想那用root登陆改/etc/passwd吧肯定是因为把那个也覆盖了。果然cat的结果是里面已经没有我的用户名了。

###重新添加用户和挂载/home###

useradd -m -s /bin/bash lain
passwd lain

之后提示说/home/lain已存在所以不cp,我就没管。

好重启,登陆,咦,提示说/home/lain不存在所以进入了/

去/home里找也确实不存在,这真是迷失了回家的方向找不到回家的路了。

lsof | grep 任何我能想起来的存在/home里的文件
没有输出

捉急了会儿想到,至少在那个硬盘里存着呀,不应该没了才对。于是

mount /dev/sda4 /mnt
一看果然在啊
mount /dev/sda4 /home
把盘挂载目录下搞定

但是呢,重启次又是老样子,于是一怒修改/etc/fstab使之永久mount

vim /etc/fstab

/dev/sda4 /home ext4 default 0 0

收工

###最后修复texlive的问题###

fmtutil-sys -all > /dev/null

今天本来要早睡的来着orz

kernel up grade

###问题所在–/etc/fstab里忘了加/boot导致内核升级时新内核没有写到/boot里###

上次因为修改文件全部更新,fstab里什么信息都没了。首先遇到的问题当然是用户找不到了,然后/home没有挂载而找不到家。于是我机智地在fstab里加上了/home的挂载,但糊涂地没有检查下/boot挂了没,因为我的/boot是单独分区的,而实际上误改过fstab后应该再手动加上才对,但是我忘掉加了。

依旧运行没有问题是因为它没挂上/boot后就是从/分区里的/boot/vmlinuz加载的,内核更新后就出现了安装的内核和运行的内核版本不一样的冲突,根本加载不了模块,开机就进入了救急模式。囧

###查问题###

进入之后可以根据提示看journalctl -b来查找问题,但是太长了根本看不出来嘛。不过大致的提示也可以提供关键词,于是在systemd的wiki里跟着它检查问题。

# systemctl --state=failed
查看加载失败的模块

输出:

                               LORD     ACTIVE   SUB   DESCRIPTION
home.mount                  loaded   failed   failed /home
systemd-modules-load.service loaded  failed   failed Load Kernel Modules
systemd-tmpfiles-setup.service loaded failed  failed Create Volatile Files and Directories
syslog.socket               loaded failed failed Syslog Socket

还有一堆别的信息,不过主要的就是这个列表了,好,先看看那个内核为啥没load吧。

# systemctl status systemd-mudules-load
打印出的信息主要有:
code=exited, status=1/FAILURE
Process: 582 ...
main PID: 582 ...

有了进程PID,进一步的具体信息:

# journalctl -b _PID=582
显示:
[时间] [机器名] systemd-modules-load[582]: Failed to lookup alias 'nfs': Function not implemented

于是又去搜这个错误,是看到有些类似的标题但是arch的bbs忽然404了不知为啥,于是只好抓瞎去问仙子了。

在问的过程中我也搜到说内核版本不同的情况,于是发现了问题所在。

# pacman -Q linux
安装的版本:
linux 3.13.7-1
# uname -r
运行的版本:
3.13.6-1-ARCH

就是之前所说版本不一致,找不到内核模块。

# file /boot/vmlinuz-linux
输出
/boot/vmlinuz-linux: Linux kernel x86 boot executable bzImage, version 3.13.7-1-ARCH...
# cat /proc/cmdline
输出
BOOT_IMAGE=/vmlinuz-linux root=UUID=(一长串) rw quiet

其实这里已经可以看出解决之道了,我的grub里的内核是从/vmlinuz-linux加载的,是从独立分区/boot里找的,但因为更新时/boot并没有挂载,所以新装的内核没有写进去。而看/boot/vmlinuz-linux的话,版本号和安装的一致,也就是说新的躲在那里,在/分区下。

这时尝试手动mount下/boot

# mount /dev/sda2 /boot
错误提示
unkown filesystem type 'ext4'
因为我的/分区的文件系统是jfs呢呵呵呵

所以确定了大概真的是更新的时候/boot没挂载,好,改grub进吧。

###修改grub参数重新安装写入内核###

老办法,重启,在grub界面按e进入:

在linux那行前面写上
set root=(hdX,Y) 我的/所在分区是(hd0,1)
linux这行改成
linux /boot/vmlinuz-linux ...

Ctrl-x启动,提示file ‘initramfs-linux.img’ not found

再改:

给initrd那行也加上
initrd /boot/...

这下启动成功,进入登陆,然后手动mount自己的/boot

# mount /dev/sda2 /boot

之后记得把/boot写进/etc/fstab里

然后重装linux:

# pacman -S linux

之后重启

成功