2009年2月11日星期三

磁盘对倒迁移

贝壳的本本坏了。
Acer的质量真不怎么的,只是正常使用而已,买来不到一个月就返修。费时费力不说,还差点因为IWT的问题无法修理而要付钱。结果刚刚过保半年,总共买了一年半后,坏了。
趁机问老板要了一台ThinkPad,虽说联想的做工不如IBM,不过依旧非常舒服,不愧是商务王者。但是,贝壳原来在笔记本上配置的复杂到死的系统,要是在新机器上一一重装的话,费力先不说,项目肯定是无法按期完工了。
贝壳修旧机器的时候,拆下了硬盘和电池。这里顺便提醒送修笔记本的同志们,记得拆下硬盘和电池。硬盘是你机要数据的所在,将来要恢复系统就全靠他了。而电池——到时候要是发现电量少了,这种东西谁都说不清楚。所以还是拆下来的好。那么,最低限度的,要从旧硬盘上读出数据,否则很多东西完全无法运作了。所以——贝壳找人借了一个移动硬盘盒。嘿嘿,这种东西可以将笔记本的SATA转换成USB使用,从而在新电脑上直接读取旧电脑数据。
为了不重装电脑,贝壳决定在新电脑上直接使用旧电脑的系统。将旧电脑的数据整个复制到新电脑上,就是俗称的磁盘对倒。下面是一个关键的问题,是重建文件系统,然后复制数据好呢?还是直接镜像整个系统?如果是复制数据,相对的数据清晰干净,但是容易发生一些莫名其妙的错误。如果是整个镜像,对了错一并带入新系统。贝壳在这里选择比较保守的方案,镜像整个磁盘。
首先贝壳从U盘启动(刚刚做了U live debian,冲着拯救去的系统,不知道是说幸运呢,还是乌鸦嘴呢),而后删除原有磁盘的所有分区,输入dd if=/dev/sdc of=/dev/sda,将整个磁盘复制到新电脑上。这里注意,贝壳没有设定区块大小,因此速度比较慢,正确的设定大小有助于加速复制。贝壳的数据是 120G(因此向公司申请的电脑最低是120G硬盘),复制速度是10M/s多一点,复制时间大约是3小时15分钟。从晚上9点一刻一直到晚上12点半。在完成复制后,直接重启,从硬盘启动Linux,成功!
在几乎没有任何干预的情况下,Linux就可以开机成功,不得不说这给了我很大信心。然后我去启动windows——不动。
贝壳被迫回到了Linux,仔细调试驱动,设法最快的弄出一个可用的系统。下面详细记录了ThinkPadT61上安装Debian的全过程,有兴趣的可以看看。至于六牙四皂和某猫小姐就可以跳过了。
首先贝壳调整了复制后的硬盘上的分区。由于分区表是按照120G的时候计算的,因此新硬盘上的分区使用不足。启动gparted调整大小后,sda6占用了全部新增空间,暴增到200G。而后贝壳开始查看pci设备和驱动。

# lspci -nn
00:00.0 Host bridge [0600]: Intel Corporation Mobile PM965/GM965/GL960 Memory Controller Hub [8086:2a00] (rev 0c)
00:02.0 VGA compatible controller [0300]: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller [8086:2a02] (rev 0c)
00:02.1 Display controller [0380]: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller [8086:2a03] (rev 0c)
00:19.0 Ethernet controller [0200]: Intel Corporation 82566MM Gigabit Network Connection [8086:1049] (rev 03)
00:1a.0 USB Controller [0c03]: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #4 [8086:2834] (rev 03)
00:1a.1 USB Controller [0c03]: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #5 [8086:2835] (rev 03)
00:1a.7 USB Controller [0c03]: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #2 [8086:283a] (rev 03)
00:1b.0 Audio device [0403]: Intel Corporation 82801H (ICH8 Family) HD Audio Controller [8086:284b] (rev 03)
00:1c.0 PCI bridge [0604]: Intel Corporation 82801H (ICH8 Family) PCI Express Port 1 [8086:283f] (rev 03)
00:1c.1 PCI bridge [0604]: Intel Corporation 82801H (ICH8 Family) PCI Express Port 2 [8086:2841] (rev 03)
00:1c.2 PCI bridge [0604]: Intel Corporation 82801H (ICH8 Family) PCI Express Port 3 [8086:2843] (rev 03)
00:1c.3 PCI bridge [0604]: Intel Corporation 82801H (ICH8 Family) PCI Express Port 4 [8086:2845] (rev 03)
00:1c.4 PCI bridge [0604]: Intel Corporation 82801H (ICH8 Family) PCI Express Port 5 [8086:2847] (rev 03)
00:1d.0 USB Controller [0c03]: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #1 [8086:2830] (rev 03)
00:1d.1 USB Controller [0c03]: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #2 [8086:2831] (rev 03)
00:1d.2 USB Controller [0c03]: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #3 [8086:2832] (rev 03)
00:1d.7 USB Controller [0c03]: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #1 [8086:2836] (rev 03)
00:1e.0 PCI bridge [0604]: Intel Corporation 82801 Mobile PCI Bridge [8086:2448] (rev f3)
00:1f.0 ISA bridge [0601]: Intel Corporation 82801HBM (ICH8M-E) LPC Interface Controller [8086:2811] (rev 03)
00:1f.1 IDE interface [0101]: Intel Corporation 82801HBM/HEM (ICH8M/ICH8M-E) IDE Controller [8086:2850] (rev 03)
00:1f.2 SATA controller [0106]: Intel Corporation 82801HBM/HEM (ICH8M/ICH8M-E) SATA AHCI Controller [8086:2829] (rev 03)
00:1f.3 SMBus [0c05]: Intel Corporation 82801H (ICH8 Family) SMBus Controller [8086:283e] (rev 03)
03:00.0 Network controller [0280]: Intel Corporation PRO/Wireless 4965 AG or AGN [Kedron] Network Connection [8086:4230] (rev 61)
15:00.0 CardBus bridge [0607]: Ricoh Co Ltd RL5c476 II [1180:0476] (rev b6)

下面我们可以看到,我们需要驱动的设备主要有有线网卡,无线网卡,声卡,显卡。下面我们针对这些设备一一查看。

# lspci -s 00:02 -v
00:02.0 VGA compatible controller: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller (rev 0c) (prog-if 00 [VGA controller])
Subsystem: Lenovo T61
Flags: bus master, fast devsel, latency 0, IRQ 16
Memory at f8100000 (64-bit, non-prefetchable) [size=1M]
Memory at e0000000 (64-bit, prefetchable) [size=256M]
I/O ports at 1800 [size=8]
Capabilities: [90] Message Signalled Interrupts: Mask- 64bit- Queue=0/0 Enable-
Capabilities: [d0] Power Management version 3
Kernel modules: intelfb

00:02.1 Display controller: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller (rev 0c)
Subsystem: Lenovo T61
Flags: bus master, fast devsel, latency 0
Memory at f8200000 (64-bit, non-prefetchable) [size=1M]
Capabilities: [d0] Power Management version 3

# lspci -s 00:00 -v
00:00.0 Host bridge: Intel Corporation Mobile PM965/GM965/GL960 Memory Controller Hub (rev 0c)
Subsystem: Lenovo T61
Flags: bus master, fast devsel, latency 0
Capabilities: [e0] Vendor Specific Information
Kernel driver in use: agpgart-intel
Kernel modules: intel-agp

# lspci -s 00:1b -v
00:1b.0 Audio device: Intel Corporation 82801H (ICH8 Family) HD Audio Controller (rev 03)
Subsystem: Lenovo ThinkPad T61
Flags: bus master, fast devsel, latency 0, IRQ 17
Memory at fe020000 (64-bit, non-prefetchable) [size=16K]
Capabilities: [50] Power Management version 2
Capabilities: [60] Message Signalled Interrupts: Mask- 64bit+ Queue=0/0 Enable-
Capabilities: [70] Express Root Complex Integrated Endpoint, MSI 00
Capabilities: [100] Virtual Channel
Capabilities: [130] Root Complex Link
Kernel driver in use: HDA Intel
Kernel modules: snd-hda-intel

# lspci -s 00:19 -v
00:19.0 Ethernet controller: Intel Corporation 82566MM Gigabit Network Connection (rev 03)
Subsystem: Lenovo ThinkPad T61
Flags: bus master, fast devsel, latency 0, IRQ 1272
Memory at fe000000 (32-bit, non-prefetchable) [size=128K]
Memory at fe025000 (32-bit, non-prefetchable) [size=4K]
I/O ports at 1840 [size=32]
Capabilities: [c8] Power Management version 2
Capabilities: [d0] Message Signalled Interrupts: Mask- 64bit+ Queue=0/0 Enable+
Kernel driver in use: e1000e
Kernel modules: e1000e

# lspci -s 03:00 -v
03:00.0 Network controller: Intel Corporation PRO/Wireless 4965 AG or AGN [Kedron] Network Connection (rev 61)
Subsystem: Intel Corporation Device 1010
Flags: bus master, fast devsel, latency 0, IRQ 1273
Memory at df3fe000 (64-bit, non-prefetchable) [size=8K]
Capabilities: [c8] Power Management version 3
Capabilities: [d0] Message Signalled Interrupts: Mask- 64bit+ Queue=0/0 Enable+
Capabilities: [e0] Express Endpoint, MSI 00
Capabilities: [100] Advanced Error Reporting
Capabilities: [140] Device Serial Number e3-9e-03-ff-ff-e0-1d-00
Kernel driver in use: iwl4965
Kernel modules: iwl4965

仔细看看,其实显卡已经被默认驱动了,无法启动X是因为xorg,暂时不去理他。声卡驱动正常,有线和无线都正常。所以,贝壳首先接上了有线——果然,系统可以联网了。
而后,贝壳设置无线上网,但是——不起作用。经过仔细的查找,贝壳发现这么一件事情。虽然系统中有无线网卡驱动,但是还需要一个firmware来驱动网卡工作。这个包的名字叫做firmware-iwlwifi,安装后,系统就可以正确的使用无线了。
当然,其中还要修改一些系统配置,例如,贝壳原来的网络设备名称叫做ath0,现在叫做wlan1。首先是因为iwl驱动和madwifi的命名规则不一样。但是之所以叫做1,是因为udev的关系。打开/etc/udev/rules.d/70-persistent-net.rules,里面有很多网络设备的MAC和名称,删除后就重命名了。贝壳删除了记录,而后/etc/init.d/networking restart。系统成功的修改了名字。
下面是显卡和声卡,贝壳先搞显卡问题。打开/etc/X11/xorg.conf,删除其中指定的驱动名称,fglrx,换成intel。系统就可以成功的引导到X下面,而贝壳的系统DRI库高于7。0(testing),于是设定了以下两个项目。
Option "RenderAccel" "on"
Option "DRI" "true"
进入X后声音还是不对,贝壳运行了一次alsaconf,问题解决。
而后,贝壳仔细查找了系统驱动模块,发现kvm-intel和k8-temp没有正常加载。经过查找,k8-temp的替代模块叫做acpi- cpufreq,已经被自动识别和加载。使用cpuinfo可以看到系统经处于节能模式,速度800MHZ。而kvm-intel则是原来kvm-amd 的替代模块,用于加速kvm(qemu)的运行速度。这个软件经常被贝壳用来虚拟windows。经过贝壳的查找,是BIOS中关闭了虚拟化的关系。此时可以在系统中看到如下内容,但是虚拟化无法执行。

# grep vmx /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr lahf_lm ida
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr lahf_lm ida

去BIOS中,打开虚拟化设置(默认关闭),重启,再试?没用!
原因是,这个选项修改后,必须彻底关机才能启用。仅仅重启是没有用的,奇怪吧?无论如何,关机,拔电源,接上,开机,系统可以正确的虚拟windows了,速度很快。
==,windows不是不能启动么?经过贝壳的实验,这次最奇怪的事情来了,windows可以在虚拟机上跑,但是无法在实际机器上跑——这还是个实际的windows,生产环境——
经过贝壳多次测试,还是如此。。。
下面贝壳说说一些细节问题。虽然系统正常的启动了,但是很多功能还是有问题。例如功能键不起效,亮度无法调节等等。下面一一说明怎么处理。
睡眠和待机的按钮一直起效,触摸板关闭需要添加以下一项。

Section "InputDevice"
Identifier "Synaptics Touchpad"
Driver "synaptics"
Option "SendCoreEvents" "true"
Option "Device" "/dev/psaux"
Option "Protocol" "auto-dev"
Option "HorizScrollDelta" "0"
Option "SHMConfig" "true"
EndSection

注意最后一项SHMConfig,开启后可以用Fn+F7关闭触摸板。
而后安装hotkey-setup,很多功能键都可以了。剩下两个最主要的功能,音量和亮度。音量贝壳用自定义热键来调整了Win+Down->aumix -v-10,Win+Up->aumix -v+10。而亮度,贝壳自己做了一个小程序解决。

# cat /usr/local/bin/brightness
---------------------/usr/local/bin/brightness-----------------------
#!/bin/bash

LCD_DEVICE=/proc/acpi/video/VID1/LCD0/brightness

CURRENT=$(cat "$LCD_DEVICE" | grep current | sed "s/current: \(.*\)/\1/")
if [ -z $1 ]; then
echo $CURRENT
else
MOVE=$1
let 'TARGET=CURRENT+MOVE'
echo $TARGET > $LCD_DEVICE
fi
-------------------------------end------------------------------------

将这个文件赋予执行权限后,记得让用户可以sudo执行,否则普通用户是无权修改/proc/acpi/video/VID1/LCD0/brightness文件的。
在安装好这个文件后,可以试试看,brightness显示当前亮度。brightness +...增加亮度,brightness -...降低亮度。而后绑定Win+Left->brightness -10,Win+Right->brightness +10。现在就可以用快捷键来修改亮度了。
下面还有一个很容易被忽视的问题,电池充电管理和磁盘抗震,首先,安装hdapsd包,他会自动安装一个内核模块补充。而后将/etc/default/hdapsd中DISK修改为sda(多数都是sda吧?),运行以下指令加载模块。
modprobe tp_smapi
modprobe hdaps
/etc/init.d/hdapsd start
而后,我们可以如下调整电池开始充电电量
echo 40 > /sys/devices/platform/smapi/BAT0/start_charge_thresh
echo 90 > /sys/devices/platform/smapi/BAT0/stop_charge_thresh
这样只有低于40的时候才会充电,充电到90停止。根据IBM的文档,将电池电量保持在30-85%有利于增加电池寿命。贝壳截止在90,是因为会减少电池充放次数,从而很好的保护电池。当然,开始的时候本本电池很好,所以一点电也可以顶很久,于是可以设定低点。后来电池糟糕了,就必须设定高百分比开始充,这样会加速电池损耗。因此电池的寿命是越糟糕消耗的越快的。
另外,磁盘抗震可以通过hdapsd和相应模块来驱动,但是需要下载内核源码,加入补丁才可以真正起效。贝壳不高兴打补丁,而且据说2.6.28内核就会加入这个补丁,因此——等新内核吧。
最后,大家可以加入一个比较好玩的功能,笔记本的指纹识别。首先从http://www.debian.org/distrib/packages搜索 thinkfinger,将libthinkfinger0,libpam-thinkfinger,thinkfinger-tools依次下载安装。而后就可以用tf-tool --acquire来收集指纹。一般来说,普通用户的收集总是失败,可以以root收集了放到普通用户目录中用,只需要运行tf-tool --acquire $USER/.thinkfinger.bir,而后chown就可以了。另外,要使用指纹验证登录机器还需要修改pam模块,修改如下。
将/etc/pam.d/common-auth文件的原本内容注释,修改为以下内容。
auth sufficient pam_thinkfinger.so
auth required pam_unix.so nullok_secure try_first_pass
另外,如果你使用的是xdm,进入系统后发现有些变量缺失的话,可以试试看如下修改(/etc/pam.d/xdm):
# $Id: xdm.pam 189 2005-06-11 00:04:27Z branden $

auth requisite pam_nologin.so
auth required pam_env.so
auth required pam_env.so envfile=/etc/default/locale
session required pam_limits.so

@include common-auth
@include common-account
@include common-session
@include common-password
掉换上下的顺序,事情就OK了。
经过上述的动作后,贝壳可以在新的笔记本上使用老系统的所有东西。除了windows无法在真实机器上启动之外——

参考资料:
[1].Installing Debian Etch Linux on Lenovo Thinkpad T61.http://ejahn.net/Members/eric/stories/t61_etch
[2].Installing Debian Lenny on a ThinkPad T61.http://www.thinkwiki.org/wiki/Installing_Debian_Lenny_on_a_ThinkPad_T61
[3].Etch_on_Thinkpad_T61.http://www.klabs.be/~fpiat/linux/debian/Etch_on_Thinkpad_T61.html
[4].Lenny_on_Thinkpad_T61.http://www.klabs.be/~fpiat/linux/debian/Lenny_on_Thinkpad_T61.html
[5].Linux on the Lenovo T61.http://pdis.rnw.nl/~hansl/linux/T61/T61.html
[6].Tp smapi.http://www.thinkwiki.org/wiki/Tp_smapi#Battery_charge_control_features
[7].debian etch 简要安装指南 2007-1-26.http://www.linuxsir.org/bbs/thread287473.html
[8].Debian/testing简要安装记录.http://hi.baidu.com/airpot/blog/item/7e72b0b4d05de3708bd4b2d9.html
[9].Debian 笔记本驱动安装.http://www.unifiedkernel.com/forum/viewtopic.php?f=5&t=10

没有评论: