显示标签为“linux”的博文。显示所有博文
显示标签为“linux”的博文。显示所有博文

2009年8月19日星期三

kdemod4.3 升级小记

KDE走到4.3后,arch官方也开始拆包了,似乎给kdemod带来了一些麻烦。一般来说,竞争会使消费者受益,但如果不是在一个标准下,那就叫添乱,国内钱3强分立就是这种状况。虽然只有一个标准,但对手之间有一个把持标准,那其他人就只有给他打工的份了,微软就这样干成了世界五百强,不知道五百小强里还有没有其它软件企业?官方说不愿作微软,我想kdemod的家伙们肯定感到胸闷。

扯远了。

升级很简单
sudo pacman -Syu
mv .kde4 .kdemod4
kdemod-fix-configs
安装新软件包时会有提示,建议运行上面最后一条命令来迁移配置文件。

照例会遇到一些问题,这一点我要表扬一下超女,人家每次都能让你提前知道谁会出问题,谁会被淘汰,不像kdemod,每次都防不胜防。

中文翻译不全?

无法手动安装中文语言包,说一些文件已存在,经查是与旧版语言包冲突,先卸载旧版就能顺利安装了。

桌面图标信任

桌面快捷方式上多了个感叹号,我又没得人流感,要感叹号干什么?点击图标需要确认是否信任方才启动程序。其实就是将快捷方式(如Firefox.desktop)的权限改为700

我怎么还有.kde4文件夹?

经查.kde4文件夹下是nepomuk的数据,找到nepomuk的配置文件.kdemod4/share/config/nepomukserverrc,发现问题就在这里。不知道kdemod-fix-configs都作了些什么

dolphin和konqueror呢?

是的,它们没在系统中,还有phonon也没有了(所以系统设置中的多媒体打不开了),总之是因为依赖关系被删除了。需要的话自己手动安装吧。pacman -Q | grep kdemod查看下来,总共安装了没几个包,对系统有洁癖的我,这也算“因祸得福”吧

2009年7月27日星期一

忍把xfs 换了ext4

换掉xfs可谓蓄谋已久,我再也无法忍受pacman -Syu时的龟速。现在ext4已经正式进入内核,移动硬盘也已回来,终于可以开工了。

想不到xfs出于绝望,竟然提前自杀了。最后一次halt报xfs出错,强行关机后分区已经不能mount。我暂时不想重装系统,准备修复:
  1. 启动到移动硬盘上新装archlinux系统。顺便说一下最新版的grub4dos(grub4dos-0.4.4-2009-06-20.zip)支持ext4,我是装好后才想起来的,也算是个惊喜。
  2. 运行xfs_repair /dev/sda1,提示要正常挂载/卸载一次,或使用-L参数。
  3. 遵医嘱xfs_repair -L /dev/sda1,顺利修复,lost+found里多了几个文件,文件名为纯数字,都是二进制文件。
  4. 进入本地系统,开启X四处看了一下,没发现什么问题。用pacman -Scc清理了本地下载的软件包。
回到移动硬盘上的系统,开始备份:
sudo mount /dev/sda1 /mnt
sudo tar jcvf sysback.tar.bz2 /mnt
由于还是不放心lost+found里文件,这里没有排除任何文件,我的备份文件只有718M。接下来格式化/dev/sda1:
sudo mkfs.ext4 /dev/sda1
为保险起见,我还是重启了一下,应该是没必要,不过最近运气差,小心驶得万年船。现在恢复系统:
sudo tar jxvf sysback.tar.bz2 -C /
这里要注意/dev/sda1要仍旧mount到备份时mount的目录上,这里是/mnt

下面还要调整一下系统。
  1. 由于格式化会改变分区的uuid(参见/dev/disk/by-uuid),请修改fstab、grub的menu.lst中相关uuid的内容。
  2. 别忘了重新生成kernel26.img,因为涉及到启动时加载ext4驱动。
  3. sudo chroot /mnt
    mkinitcpio -k 2.6.30-ARCH -c /etc/mkinitcpio.conf -g /boot/kernel26.img
重启进入本地系统,全面更新一下,哈,就象抛掉了xfs的破自行车,开上了法拉利

2008年12月4日星期四

Synaptics及其他:xorg.conf一些新旧设置

Archlinux的xorg-server升级到1.5.3了,最大的变化是默认启用了hotplugging,简单说就是支持输入设备的热插拔了。各位可以去wiki看看,有很清楚的说明。

反映到xorg.conf就是所有的InputDevice都不需要了,扔这儿吧:

Section "InputDevice"
Identifier "Keyboard0"
Driver "keyboard"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbModel" "pc105"
Option "XkbLayout" "us"
Option "XkbVariant" ""
EndSection

Section "InputDevice"
Identifier "Serial Mouse"
Driver "mouse"
Option "Protocol" "Microsoft"
Option "Device" "/dev/ttyS0"
Option "Emulate3Buttons" "true"
Option "Emulate3Timeout" "70"
Option "SendCoreEvents" "true"
EndSection
Section "InputDevice"
Identifier "PS/2 Mouse"
Driver "mouse"
Option "Protocol" "auto"
Option "ZAxisMapping" "4 5"
Option "Device" "/dev/psaux"
Option "Emulate3Buttons" "true"
Option "Emulate3Timeout" "70"
Option "SendCoreEvents" "true"
EndSection

Section "InputDevice"
Identifier "USB Mouse"
Driver "mouse"
Option "Device" "/dev/input/mice"
Option "SendCoreEvents" "true"
Option "Protocol" "IMPS/2"
Option "ZAxisMapping" "4 5"
Option "Buttons" "5"
EndSection
Section "InputDevice"
Driver "synaptics"
Identifier "Touchpad"
Option "Device" "/dev/input/mouse1"
Option "Protocol" "auto-dev"
Option "LeftEdge" "1700"
Option "RightEdge" "5300"
Option "TopEdge" "1700"
Option "BottomEdge" "4200"
Option "FingerLow" "25"
Option "FingerHigh" "30"
Option "MaxTapTime" "180"
Option "MaxTapMove" "220"
Option "VertScrollDelta" "100"
Option "MinSpeed" "0.06"
Option "MaxSpeed" "0.12"
Option "AccelFactor" "0.0010"
Option "SHMConfig" "on"
# Option "Repeater" "/dev/ps2mouse"
Option "CircularScrolling" "on"
Option "CircScrollTrigger" "0"
EndSection
当然,别忘了删除ServerLayout字段中的相关内容。

触摸板synaptics驱动需要安装xf86-input-synaptics,老的不知在哪一次升级的时候被卸掉了,害我折腾了一会儿,也怪我没重新看一下wiki。以下是我的新配置文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
<device>
<match key="info.capabilities" contains="input.touchpad">
<match key="info.product" contains="SynPS/2 Synaptics TouchPad">
<merge key="input.x11_driver" type="string">synaptics</merge>
<!-- Arbitrary options can be passed to the driver using
the input.x11_options property since xorg-server-1.5. -->
<!-- EXAMPLE:
<merge key="input.x11_options.LeftEdge" type="string">120</merge>
-->
<merge key="input.x11_options.Protocol" type="string">auto-dev</merge>
<merge key="input.x11_options.LeftEdge" type="string">1700</merge>
<merge key="input.x11_options.RightEdge" type="string">5300</merge>
<merge key="input.x11_options.TopEdge" type="string">1700</merge>
<merge key="input.x11_options.BottomEdge" type="string">4200</merge>
<merge key="input.x11_options.FingerLow" type="string">25</merge>
<merge key="input.x11_options.FingerHigh" type="string">30</merge>
<merge key="input.x11_options.MaxTapTime" type="string">180</merge>
<merge key="input.x11_options.MaxTapMove" type="string">220</merge>
<merge key="input.x11_options.VertScrollDelta" type="string">100</merge>
<merge key="input.x11_options.MinSpeed" type="string">0.06</merge>
<merge key="input.x11_options.MaxSpeed" type="string">0.12</merge>
<merge key="input.x11_options.AccelFactor" type="string">0.0010</merge>
<merge key="input.x11_options.SHMConfig" type="string">true</merge>
<merge key="input.x11_options.CircularScrolling" type="string">on</merge>
<merge key="input.x11_options.CircScrollTrigger" type="string">0</merge>
<merge key="input.x11_options.TapButton1" type="string">1</merge>
<merge key="input.x11_options.TapButton2" type="string">2</merge>
<merge key="input.x11_options.TapButton3" type="string">3</merge>
</match>
<match key="info.product" contains="AlpsPS/2 ALPS">
<merge key="input.x11_driver" type="string">synaptics</merge>
</match>
<match key="info.product" contains="appletouch">
<merge key="input.x11_driver" type="string">synaptics</merge>
</match>
<match key="info.product" contains="bcm5974">
<merge key="input.x11_driver" type="string">synaptics</merge>
</match>
</match>
</device>
</deviceinfo>
默认配置是/usr/share/hal/fdi/policy/10osvendor/11-x11-synaptics.fdi,复制到/etc/hal/fdi/policy/,再把老的配置项添加进去。型号(如SynPS/2 Synaptics TouchPad)可以用以下命令查到(参见wiki):
hal-device|grep -B 15 input.x11.driver
如我的机器上显示是这样的:
--
input.x11_options.MaxTapMove = '220' (string)
input.x11_options.VertScrollDelta = '100' (string)
input.x11_options.MinSpeed = '0.06' (string)
linux.sysfs_path = '/sys/class/input/input8/event8' (string)
linux.device_file = '/dev/input/event8' (string)
input.x11_options.MaxSpeed = '0.12' (string)
info.parent = '/org/freedesktop/Hal/devices/platform_i8042_i8042_AUX2_port' (
string)
input.x11_options.AccelFactor = '0.0010' (string)
input.x11_options.SHMConfig = 'true' (string)
input.x11_options.CircularScrolling = 'on' (string)
input.x11_options.CircScrollTrigger = '0' (string)
input.device = '/dev/input/event8' (string)
input.x11_options.TapButton1 = '1' (string)
input.product = 'SynPS/2 Synaptics TouchPad' (string)
input.x11_options.TapButton2 = '2' (string)
input.x11_driver = 'synaptics' (string)


论坛上也有一些配置(15楼)可以参考。

另外,再附送一个小脚本,可以快速开关Synaptics,我把它绑定到了Fn+1:
#!/bin/bash

Status=$(synclient -l | grep TouchpadOff | tr -d [:blank:])

eval $Status

if [ "$TouchpadOff" = "0" ]
then
synclient TouchpadOff=1
elif [ "$TouchpadOff" = "1" ]
then
synclient TouchpadOff=0
fi
另外,好象已经可以不用xorg.conf了,但我的还不行,不知是否没装开源ati驱动的缘故(只有fglrx)。

KDE快捷键与keyboard layout的问题

近日arch的xorg-server升级到1.5.3,默认使用hotplugging。问题是方向键等许多按键失灵了,论坛上说需要在KDE系统设置->地区和语言->键盘布局中使用键盘布局"Evdev-managed keyboard",一试之下,果然好多了。只是系统的一些快捷键依旧无法使用,比如无须确认注销。

系统设置->键盘和鼠标->键盘快捷键重新设置一下,又可使用了。想起这个问题以前配置xmodmap时就碰到过。简单测试一下后,可以确认,键盘布局(映射)必须在KDE启动之前应用,否则就会出现这种情况。虽然有一些其他的考虑,如键盘布局切换后,按键都变了,原来的快捷键可能不是你需要的。但我依然认为这是个Bug(我已经去官网确认了),我们需要全局快捷键机制(比如用于快速切换键盘布局,有人就遇到了麻烦),每个键盘布局也应该可以有自己的快捷键,而不是象现在这样直接罢工。

解决很简单,在上述系统设置中禁用键盘布局,而把它放到.xinitrc中,下面是我的配置:

# SCIM
export LC_ALL=zh_CN.utf8
export XMODIFIERS=@im=SCIM
export GTK_IM_MODULE="scim"
export QT_IM_MODULE="scim"
scim -d

# 键盘设置
xmodmap ~/.Xmodmap

# 关闭触摸板
synclient TouchpadOff=1

# 键盘绑定
xbindkeys &

setxkbmap -keycodes evdev -model evdev

exec startkde

2008年11月17日星期一

Archlinux上编译自己的QT

Arch更新频繁,为了保持稳定和可控,决定自己编译该死的QT。

首先chroot到移动硬盘上的测试系统

sudo chroot /mnt/ /bin/su - foo
qt的源码包比较大(99M),建议单独用下载工具下载,下载PKGBUILD,修改以符合自己需要,我这里去掉了几个快捷方式(desktop文件)以及安装(make install)后的处理,同时编译demos、examples和docs:
# $Id$
# Maintainer: Pierre Schmitz

pkgname=qt
pkgver=4.4.3
pkgrel=2
_qtcopyver=880178
pkgdesc="The QT gui toolkit."
arch=('i686' 'x86_64')
url="http://www.trolltech.com/products/qt"
license=('GPL3')
options=('!libtool' '!docs')
depends=('libpng' 'libxi' 'mesa' 'fontconfig' 'libxrandr' 'glib2' 'libtiff' 'libmng' 'sqlite3' 'dbus' 'libxcursor' 'libxinerama')
optdepends=('postgresql-libs' 'libmysqlclient' 'unixodbc')
makedepends=('inputproto' 'postgresql-libs' 'mysql' 'unixodbc' 'cups' 'libxfixes')
provides=("qt4=${pkgver}")
replaces=('qt4')
conflicts=('qt4')
_pkgfqn=qt-x11-opensource-src-$pkgver
# svn export -r -${_qtcopyver} svn://anonsvn.kde.org/home/kde/trunk/qt-copy/patches/ qt-copy-patches-${_qtcopyver}
source=("ftp://ftp.trolltech.com/qt/source/${_pkgfqn}.tar.bz2"
"ftp://ftp.archlinux.org/other/qt/qt-copy-patches-${_qtcopyver}.tar.bz2")
md5sums=('00e00c6324d342a7b0d8653112b4f08c'
'd3a40d783528a86174b62ecfc136b031')

build() {
# 按源码的INSTALL文件,其实不需要为编译设置变量
unset QMAKESPEC
export QT4DIR=$srcdir/$_pkgfqn
export PATH=${QT4DIR}/bin:${PATH}
export LD_LIBRARY_PATH=${QT4DIR}/lib:${LD_LIBRARY_PATH}

cd $srcdir/$_pkgfqn
for i in $srcdir/qt-copy-patches-${_qtcopyver}/*; do
echo "applying $i"
patch -p0 -i $i || return 1
done

# remove unwanted mkspecs
cd mkspecs/
find . -maxdepth 1 -regextype posix-egrep -type d ! -regex "./linux.*|./common|./features|./qws" -exec rm -rf "{}" \;
cd qws
find . -maxdepth 1 -regextype posix-egrep -type d ! -regex "./linux.*" -exec rm -rf "{}" \;
cd ../../

sed -i 's|-cp -P -f|-cp -L -f|' qmake/Makefile.unix
sed -i "s|-O2|$CXXFLAGS|" mkspecs/common/g++.conf
# fix postgres build
sed -e '/pg_config --libs/d' -i configure
# do not compile demos, examples and docs

# prefix很重要,qt严重依赖,且以后不能更改
./configure -confirm-license \
-prefix /home/foo/qt4.4.3 \
-no-exceptions \
-plugin-sql-{psql,mysql,sqlite,odbc} \
-system-sqlite \
-dbus-linked \
-webkit \
-no-separate-debug-info \
-assistant-webkit \
-system-libpng \
-system-libjpeg \
-system-zlib \
-openssl-linked \
-cups \
-reduce-relocations \
-xinerama \
-xcursor \
-xfixes \
-optimized-qmake || return 1

make || return 1
make INSTALL_ROOT=$pkgdir install || return 1
}
开始编译:
makepkg -s -r
人品不好,一开始就报错
/dev/null: Permission Denied
knoppix的wiki上有详细的说明,简单说就是,mount的时候需要dev参数:
mount -o remount,dev /dev/hda1
接下来,就一切顺利了,2个多小时后,顺利生成qt-4.4.3-2-i686.pkg.tar.gz,你可以使用pacman -U安装,不过我是解压后移动到相应目录。

2008年11月9日星期日

Flash的10全9美

Flash Player 10 For Linux推出已经有一段时间了,有人在欢呼“Linux在Flash播放器领域终于成为了主流的操作系统了”,昨日试用之下,优点还没发现,倒是一上优酷就会崩溃,这可是我现在的主力视频站点。其他如56去了一趟火星之后,已经处女膜修复了,tudou速度慢,视频大小也似乎有限制,经常集分上下,youtube也是这个问题。

于是毫不犹豫换回了flash 9.0.124,不过找这个版本可是花费了一段时间,有同样需要的朋友可以看这里,虽然官网上已经找不到链接了,看来文件还在。

Update:再一次Arch升级后,一播放flash video,Firefox就僵死,初以为Firefox或flash player版本问题,遂皆升级到最新版,问题依旧,又一日,在次系统升级后,问题解决。所以现在我也已用上了flash 10.0.15

2008年10月11日星期六

wine成功魔兽争霸

我用的是1.20d绿色免CD版,注意2个问题:

  1. 将Movies文件夹改名或者干脆移除。这里面都是开场动画,Divx格式的,目前wine还不支持(据说Cedega有支持)。如果你运行后发现有声音无画面(黑屏),就是这个原因了。
  2. 如果游戏非常卡,请使用opengl。魔兽争霸默认使用DirectX,这个对wine来说,有点勉为其难了。
    WINEDEBUG=-all wine "C:\\Program Files\\Warcraft III\\Warcraft III.exe" -opengl
    使用该参数还有一个好处,如果你使用的是ATI闭源驱动,KDE4下开启特效也不会屏闪了。
顺便找了几个图标作快捷方式。

2008年2月9日星期六

Kubuntu Hardy Alpha 4 硬盘启动及试用问题

上一次我介绍了怎样通过移动硬盘启动Ubuntu的Live CD,当时,我是拿kubuntu-kde4.0-i386.iso来试的。可事情没有这么简单,如果你使用一周前刚刚发布的Ubuntu 8.04 Hardy Heron Alpha4来测试,会发现每次启动不到一半就挂了。

通过检查initrd.gz,终于发现,原来Hardy Alpha 4要进行启动设备的uuid验证,而如果变量$IGNORE_UUID不是空字符串或者/conf目录下没有uuid.conf文件则会跳过该检验,那个Kde4.0 LiveCD就是后一情况,对于我们来说,最简单的方法就是设置变量IGNORE_UUID,所要做的只是编辑一下syslinux配置文件,给内核传递一个ignore_uuid参数:

append file=/cdrom/preseed/kubuntu.seed boot=casper initrd=/casper/initrd.gz ignore_uuid splash --
如此一番修改后,终于可以成功启动系统了,但最终还是倒在了xorg上,在命令行运行startx、X或者xinit都失败了。还有,对我来说,已经是老问题了,关机时依然不能自动关闭电源。

以上是在我的笔记本上测试的结果,显卡是ATI X1600,在单位的Dell机上测试,运行良好。

2008年2月8日星期五

syslinux应用简介

syslinux是一个轻量级的启动装载器,只用Windows的人可能不明白是什么东西,如果玩过Linux,一定知道lilo和grub,是的,所谓轻量级我想就是跟grub们相比而言的,尤其是grub2。

syslinux有很多变种(都是官方的)适用于各种媒质,如syslinux用于从微软的文件系统fat 16/32引导,isolinux用于从光盘引导,pexlinux用于从网络引导,extlinux用于从ext2/3文件系统引导。

从这也可以看出,syslinux对于各种设备的兼容做的很细致,据grub4dos的人说,用于兼容性方面的代码甚至超过了程序主要功能的实现代码。

Ubuntu的Live CD就是使用isolinux来引导的,如果你不想为了一个Alpha版本而浪费一张光盘,可以将iso镜像文件放在U盘或移动硬盘上,轻松的换用syslinux来引导。

  1. 将iso镜像中的casper和isolinux文件夹拷贝到移动硬盘的fat32分区根目录,这对于引导系统,只想体验一下LiveCD来说已经足够了,如果你还要进行系统安装等,可能还要其它文件。
  2. 将isolinux文件夹改名为syslinux,现在将syslinux文件夹中的isolinux.cfg文件改名为syslinux.cfg。
  3. 安装syslinux到移动硬盘。如果是在Windows下,使用下面的命令:
    syslinux.exe /mfa G:
  4. a表示激活分区,f是force的意思,m是写mbr,G:是移动硬盘分区的盘符。运行后会在根目录生成一个ldlinux.sys的隐藏文件。

    Ubuntu的Live CD使用的isolinux打了gfxboot补丁,如果你使用官方版本的syslinux,启动后就没有菜单以及语言选择等内容。所以建议大家使用同样打了补丁的Ubuntu版本的syslinux:
    sudo aptitude install syslinux mtools
    sudo syslinux -f /dev/sdb1
    需要mtools是因为要修改fat32文件系统上的文件属性。/dev/sdb1是移动硬盘fat32设备的文件名,不需要mount。
好了,现在插上移动硬盘,将电脑设置为从USB设备启动,OK?如果启动失败,很有可能是分区表的原因,想想当初,我将移动硬盘上的第一个分区设为主分区,fat32格式,也许是个英明的决定。

附记:除了gfxboot,syslinux也有自己的菜单系统这里有一个样例配置文件,在它的邮件列表上,说起gfxboot,有人似乎很不屑suse写的代码。

2008年2月7日星期四

Linux flash插件更新及最新sources.list

今天更新了几个软件,发现其中flashplugin-nonfree更新失败

正在设置 flashplugin-nonfree (9.0.48.0.2+really0ubuntu12.1) ...
Installing from local file /var/cache/flashplugin-nonfree/install_flash_pla
yer_9_linux.tar.gz
md5sum mismatch install_flash_player_9_linux.tar.gz
The Flash plugin is NOT installed.
网上搜了一下,原来是个Bug

解决办法是:删除/var/cache/flashplugin-nonfree/目录中的文件,按Bug report中给出的方法“IMPORTANT NOTICE no.2”,清除cache,purge掉flashplugin-nonfree,为了保证源是最新的,我注释掉了cn99的源,使用了archive.ubuntu.com的,重新update后,再全新安装flashplugin-nonfree,一切还算顺利,有个小尾巴是,最后检查的时候发现还是从cn99下的:
apt-cache policy flashplugin-nonfree
flashplugin-nonfree:
已安装:9.0.48.0.2+really0ubuntu12.1
候选的软件包:9.0.48.0.2+really0ubuntu12.1
版本列表:
*** 9.0.48.0.2+really0ubuntu12.1 0
500 http://debian.cn99.com gutsy-updates/multiverse Packages
500 http://debian.cn99.com gutsy-proposed/multiverse Packages
100 /var/lib/dpkg/status
9.0.48.0.2+really0ubuntu12 0
500 http://debian.cn99.com gutsy/multiverse Packages
不清楚是怎么回事。更新是确实的,因为上news.163.com不再崩溃了,为了看“老衲”以及诸位淫才的评论,昨晚还崩溃了一次,呵呵。

另附上我自己使用的sources.list:
# For available mirrors, you can check the url:
# https://launchpad.net/ubuntu/+archivemirrors
deb http://debian.cn99.com/ubuntu/ gutsy main restricted universe multiverse
#deb-src http://debian.cn99.com/ubuntu/ gutsy main restricted universe multiverse
deb http://debian.cn99.com/ubuntu/ gutsy-security main restricted universe multiverse
deb http://debian.cn99.com/ubuntu/ gutsy-updates main restricted universe multiverse
deb http://debian.cn99.com/ubuntu/ gutsy-backports main restricted universe multiverse
deb http://debian.cn99.com/ubuntu/ gutsy-proposed main restricted universe multiverse

# The Official repos, always up-to-date, but slow
# So we comment out it for daily use.
#deb http://archive.ubuntu.com/ubuntu/ gutsy main restricted universe multiverse
#deb http://archive.ubuntu.com/ubuntu/ gutsy-security main restricted universe multiverse
#deb http://archive.ubuntu.com/ubuntu/ gutsy-updates main restricted universe multiverse
#deb http://archive.ubuntu.com/ubuntu/ gutsy-backports main restricted universe multiverse
#deb http://archive.ubuntu.com/ubuntu/ gutsy-proposed main restricted universe multiverse

# wine
deb http://wine.budgetdedicated.com/apt gutsy main
#deb-src http://wine.budgetdedicated.com/apt gutsy main

# skype
#deb http://download.skype.com/linux/repos/debian/ stable non-free

#VirtualBox
deb http://www.virtualbox.org/debian gutsy non-free

#bzr
#deb http://bazaar-vcs.org/releases/debs/feisty ./

2008年1月4日星期五

几个Linux内核模块管理工具

介绍几个Linux内核模块管理的相关工具。

首先是lsmod,我们用它来查看当前加载的模块。

rmmod可以帮我们卸载某个模块,如果该模块被其它模块使用,就会卸载失败,可以查看lsmod输出的第4列来确定模块被哪些模块依赖,先卸载它们,最后卸载被依赖的模块。

modprobe用来加载某个模块,如果该模块依赖其它尚未加载的模块,则一并加载。

depmod用来生成modules.dep文件,modprobe就是通过它来确认模块之间的依赖关系。我们知道,内核和模块都提供了许多符号可供第3方使用,depmod正是依据A模块是否使用了B模块的符号来确定它们的依赖关系的。

depmod -a
Ubuntu中有一些个脚本,如lrm-managerlrm-video,是用来管理版权受限的模块的,lrm的意思是linux restricted modules,如Nvidia的视频驱动。

关于受限驱动模块,你还可以看一下/etc/default/linux-restricted-modules-common文件,在这里可以设定禁止加载哪些模块。

关于启动时哪些模块被加载,或者加载细节等等的一些配置,可以看一下/etc下的modprobe.dmodutils目录和modules文件。

deb文件制作与修改初级

deb文件是Debian/Ubuntu系统的软件包分发格式,就象RedHat/Fedora的rpm。

首先我们来看一下deb包的结构。

随便找一个deb文件,比如说foo.deb:

dpkg -e ../foo.deb
dpkg -x ../foo.deb .
第1条命令在当前路径生成了有一个DEBIAN目录,它是deb包中的控制部分,目录中一般有这么几个文件
  1. control文件中记录了该deb包的元信息,如软件包名,版本,谁打的包,与哪些软件包冲突等等。
  2. md5sums文件中是该软件包要安装到系统中的文件的md5值。
  3. preinst文件是安装之前预处理的脚本。如安装新版本的Apache服务器时可能要先停止正在运行的服务。这个和以下的几个文件都是shell脚本。
  4. prerm文件用于安装前删除一些文件。
  5. postinst文件用于安装后的处理脚本。继续上面的例子,你可以在这里启动新版本的Apache服务。
  6. postrm文件用来在安装后删除一些文件。
第2条命令在当前目录解压了要安装到系统的数据文件,如果以当前目录为根目录,它们的路径就是被安装到系统的路径。

另外再介绍两个解压deb包的命令
ar p ../foo.deb control.tar.gz | tar zxvf -
ar p ../foo.deb data.tar.bz2 | tar jxvf -
这里第1条命令与上面略有不同,它直接将DEBIAN目录下的文件解压到当前目录,而不生成DEBIAN目录,如果你最后还要还原成deb包的话,这会有点不方便。第2条命令的效果则和先前的一样。

你可以按照你的要求,随意增加、删除、修改所有这些文件。如果你要为一个解压即可以运行的软件制作一个deb包,你要做的一般就是安排好目录,添加几个快捷方式。如果是用make;make install自己编译的,我的办法是先用checkinstall生成一个deb包,然后再解开来做一些修改,如果需要的话。

最后再将它们打包成deb文件
cd ..
dpkg -b 待打包目录 软件包名
如上所述,待打包目录形如foo/DEBIAN,foo/usr/bin/... ,这也是为什么上面讲解压时,命令中的deb包都放在上层目录的原因。

2008年1月3日星期四

System.map文件:内核符号-地址转换表

赵炯编译的文章-《System.map文件的作用》 几乎把什么都说了,我就这里做个摘要吧

  1. System.map是在编译内核时自动生成的,由于编译器,内核版本,编译平台等因素,每次编译后的System.map都会不同。
  2. 内核自身并不使用System.map
  3. 所谓内核符号就是变量、函数名等等,它们在内核中的地址可能是这样的:c03441a0
  4. klogd之类的程序使用System.map将内核消息中的地址转换成符号名,以方便人们理解。
  5. /proc/ksyms在2.6内核中换成了/proc/kallsyms,在内核初始化时创建,是当前内核实时的符号-地址表
  6. 应用程序如klogd,会自动在相应目录查找System.map。

initrd.img:内核初始化过程中使用的内存文件系统

initrd.img是一个gzipcpio双重打包的文件,如果你把它解开就会发现,其实它包含了一个微型的根文件系统:

mkdir initrd
cd initrd
cp /boot/initrd.img-2.6.22-14-generic ..
zforce ../*
gunzip ../initrd.img-2.6.22-14-generic.gz
cpio -i -F ../initrd.img-2.6.22-14-generic
ls
其中包含了一些常用的命令,许多脚本,内核模块等等。内核在启动过程中,会将它解压到内存,建立一个临时的用户环境,利用这些工具处理一些必须在这个阶段完成的任务,如加载根设备驱动等等。

重新打包可以这样:
find . | cpio -o -H newc | gzip -9 > ../initrd.gz
Ubuntu上建议用户使用update-initramfs来维护和生成initrd.img,高级用户可以使用mkinitramfs。以前的标准工具mkinitrd似乎不再被使用。其实它们都是一些脚本。
sudo update-initramfs -u -k all
我们可以通过Grub或Lilo给内核传递参数,告诉它应该使用哪一个initrd.img文件:
initrd /boot/initrd.img-2.6.22-14-generic

2007年12月16日星期日

把你的Linux变做网桥

网桥的确是过时了,现在哪个单位没有交换机啊,不过研究研究总是没有坏处的,有人就用它在一台电脑上组建自己的虚拟网络。再说Linux已经超越Windows98了,下一个目标就是WindowsXP,而XP有的功能我们Linux怎么能没有呢?

可以很轻松的在Linux上实现网桥的功能。网桥功能自2.4开始已经集成进内核,不过我们还是要安装一个工具brctl

sudo aptitude install bridge-utils
使用起来也很简单。如果你是Ubuntu,你需要将/etc/network/interfaces配置成这样
auto eth0
iface eth0 inet static
address 0.0.0.0

auto eth1
iface eth1 inet static
address 0.0.0.0

auto br0
iface br0 inet static
address 192.168.1.89
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 192.168.1.1
bridge_ports eth0 eth1
br0就是网桥的名称,它桥接了eth0和eth1。注意eht0和eht1的IP地址都被设为0.0.0.0,如果这台机器你只想把它作为网桥使用,也可以将br0的地址设为0.0.0.0(当然网关,子网掩码之类的也统统不要),那我们就组建了一台透明网桥,它对于网络中的其它机器是不可见的(没有IP)。

顺便帮助理解一下网桥的概念。启用网桥后,可以看做网桥对外代替了被桥接的适配器,如果网络中的机器要与网桥服务器通讯,不管它从哪个适配器进出,使用的是网桥的ip。启用网桥
sudo ifup br0
那么我们安装的工具在哪儿呢?其实这背后的机制就是/etc/network/if-*目录中的bridge文件,我们仔细看看就知道其实它调用了brctl,这就是我们一开始安装的工具。

我们也可以自己手工使用brctl,比如创建和删除一个网桥:
brctl addbr bridgename
brctl delbr bridgename
关于brctl的用法和更多实例可以参见Net:Bridge

2007年12月10日星期一

Linux上的虚拟网卡

有时候,为了服务器测试,或虚拟机应用(VMware就自带了,但VBox没有),我们会需要一个虚拟网卡,这对Linuxer来说真是太简单了

如果使用Ubuntu,安装一条命令就够了

sudo apt-get install uml-utilities
现在,我们可以来创建虚拟网卡了
tunctl -t tap0 -u peter
创建了一个名为tap0的虚拟网卡(就象第一块网卡通常称为eth0),拥有者是用户peter。不过这里的拥有者不是指创建的设备文件/dev/net/tun的拥有者,有些应用可能需要对/dev/net/tun拥有写权限,需要另行处理,一个简单的办法就是把该用户加入uml-net用户组。

删除虚拟网卡tap0可以这样
tunctl -d tap0
我们可以象配置eth0那样配置它:
ifconfig tap0 192.168.0.12 netmask 255.255.255.0
如果需要一开机就自动创建,并且配置好,你可以在/etc/network/interfaces中添加如下内容
auto tap0
iface tap0 inet manual
up ifconfig $IFACE 192.168.0.12 up
down ifconfig $IFACE down
tunctl_user peter
如果你很好奇这一切是怎么创建的,可以查看interfaces的man页,以及/etc/network/if-*目录下的uml-utilities文件。

2007年12月9日星期日

用Linux做一个最简单的网关

你可以用一台淘汰的奔三电脑,装上Linux,做成一个最简单的网关

# iptables forward
echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -A FORWARD -i eth0 -j ACCEPT
# 或者你可以使用网段
#iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
这里eth0(或网段192.168.0.0/24)连接内网,eth1连接外网(另一个局域网,Internet等等)。

2007年11月3日星期六

Samba基本安全配置

创建用户密码

安装samba的时候会自动导入系统中的用户,但密码为空,假设你日常登录的用户名是myname,我们来设置密码:

sudo smbpasswd myname
......
sudo pdbedit -Lwu myname
[sudo] password for myname:
myname:1000:FB085DBF72E92604AAD3B435B51404EE:F62C03CB1000CBF94244057FD4E829F4:[U ]:LCT-472C5667:
如果密码为空,则上面输出中两个长字符串会是两长串X。你可以在这里设置一个和shell登录不同的密码。

没找到pdbedit为已有用户添加密码的方法,据说添加新用户时会要求密码,没试。

smbpasswd通过直接与Samba服务器通讯来管理用户和密码。所以相对于服务器密码后端无关。服务器密码后端即使不是smbpasswd,smbpasswd形式密码到默认的SAM密码转换应该也会由服务器完成。

配置文件

服务器配置文件是/etc/samba/smb.conf,这里主要列出需要添加和修改的部分,其余默认:
[global]
browseable = No
hosts deny = all
hosts allow = 192.168.0.33 127.
security = user
encrypt passwords = true
invalid users = root nobody

[winapps]
comment = Windows Program Files
path = /home/myname/share
writable = yes
valid users = myname
browseable = no
create mode = 0644
directory mode =0755
sync always = Yes
我们主要看global字段的设置:
  • 用户使用smbclientnet view之类的命令查看服务器上有哪些共享的资源时,什么也看不到,这是browseable的功劳
  • 两个host语句则限制了可以访问服务器的ip地址,127.表示127.0.0.1,注意不要省略小数点。这里deny和allow的设置顺序好象并无关系,当两者发生冲突时,hosts allow优先。
  • security保证了访问服务器需要密码,即访问服务器时会有提示输入密码,如果密码为空,可以直接回车,如匿名用户
  • 对密码进行加密
  • 禁止root和匿名用户访问,不过让人迷惑的是你还能看到Anonymous login successful的字样,以及一些关于服务器的信息:Domain=[MSHOME] OS=[Unix] Server=[Samba 3.0.26a],除此之外你什么也看不到,即使只是查询有哪些共享资源,你都会得到一个错误消息。
最后,大家可以参考一下Samba:整合 Windows Network,本文也借鉴了其中的许多内容。

2007年10月31日星期三

升级到Gutsy

流水帐一篇。

第一时间看到Gutsy发布后,先去论坛上看了看,发现现在有了个专门的升级工具do-release-upgrade,试着运行了一下:

sudo do-release-upgrade -d
没想到稀里哗啦的就检查起来,告诉我一个需要删除的软件列表,最后准备好要下载的软件列表时,我取消了。

还是用我习惯的aptitude

升级后果然遇到了device-mapper问题,按说明直接删除了evms包,它也在上述do-release-upgrade建议删除之列。

重启后一进入桌面就重启X,观察进入桌面时屏幕的闪动,似乎启动了Xgl,先删除Xgl再说:
sudo aptitude purge xserver-xgl
终于可以进入桌面了。

刚下载了变形金刚,急切的想看一下播放器是否正常,结果kaffeineMPlayer全部挂掉,kaffeine是直接崩溃,MPlayer只有声音没图像,SMPlayer也是直接崩溃。

首先怀疑显卡驱动,果然发现没使用fglrx,查看了Xorg.logfglrx版本居然是feisty的,在Ubuntu packages上寻求下载的过程中,发现了cn99的源,测试了一下速度很快。

装好驱动后居然还是没用上,查看了一下,linux-image-debug-2.6.22-14-386的目录下没有fglrx模块,重启使用linux-image-2.6.22-14-generic内核,一切正常。386内核通常用于兼容老机器,一般不建议使用,顺手删了。

用上了fglrx,可还是看不了电影。郁闷之下重新安装Xgl+CompizFusion
sudo aptitude install xserver-xgl
sudo aptitude install compiz compizconfig-settings-manager compiz-kde emerald
emerald主要用于窗口主题,也可以不装。

重启后顺利进入桌面,哈,可以看电影了。事后想想,也许是我的xorg.conf原本就是配置来跑Xgl+Beryl的吧,不起用Xgl的话可能要关掉某些设置,不深究了。

配置CompizFusion的过程中遇到了些麻烦,下回再讲。还有安装之前,先彻底删除了以前的Beryl以及kdmXgl登录session文件,因为Gutsy已经使用它做为默认桌面(或许这也是原因)。

K菜单变得混乱无比,原来是个Bug,已经有了两个解决办法,一个是修改kicker.po,我没尝试,还有一个是通过配置面板,选择“只有名称”(默认是“名称-描述”),勉强可以看了。

Kopete不能登录Msn,是klibs中ssl代码的问题,几天后的更新解决了这个问题

总之,一切还算顺利,阿门。

2007年10月8日星期一

Aspell引起的Leo不能启动问题

Leo是一个伟大的工具。我在Ubuntu 7.04上运行时出现了如下错误:

reading settings in /opt/leo/config/leoSettings.leo
reading /home/hero/.leoRecentFiles.txt
@enabled-plugins found in leoSettings.leo
rst3 plugin: SilverCity not loaded
err No word lists can be found for the language "zh_CN".
Traceback (most recent call last):
File "/opt/bin/leo", line 360, in
run()
File "/opt/bin/leo", line 125, in run
c,frame = createFrame(fileName)
File "/opt/bin/leo", line 192, in createFrame
c,frame = g.app.newLeoCommanderAndFrame(fileName=fileName,initEditCommanders=True)
File "/opt/leo/src/leoApp.py", line 575, in newLeoCommanderAndFrame
c.finishCreate(initEditCommanders)
File "/opt/leo/src/leoCommands.py", line 220, in finishCreate
c.frame.log.finishCreate()
File "/opt/leo/src/leoTkinterFrame.py", line 2081, in finishCreate
c.spellCommands.openSpellTab()
File "/opt/leo/src/leoEditCommands.py", line 7949, in openSpellTab
self.handler = spellTabHandler(c,tabName)
File "/opt/leo/src/leoEditCommands.py", line 8029, in __init__
self.loaded = self.init_aspell(c)
File "/opt/leo/src/leoEditCommands.py", line 8049, in init_aspell
self.aspell = AspellClass(c,dictionaryFileName,self.local_language_code)
File "/opt/leo/src/leoEditCommands.py", line 8333, in __init__
self.getAspellWithCtypes()
File "/opt/leo/src/leoEditCommands.py", line 8415, in getAspellWithCtypes
raise Exception('aspell checker not enabled')
Exception: aspell checker not enabled
那是因为 aspell 没有中文字典的缘故,稍作修改如下:
--- leoEditCommands.py.old      2007-09-15 19:41:04.000000000 +0800
+++ leoEditCommands.py 2007-10-06 21:08:08.000000000 +0800
@@ -8401,9 +8401,14 @@
print aspell_config_replace(sc, "lang",self.local_language_code)
print aspell_config_retrieve(sc, "lang")

+ # there is no chinese dictionary for aspell, so we replaced with english language
+ # aspell and aspell-en (dictionary) should be installed
+ if aspell_config_retrieve(sc, "lang") == "zh_CN":
+ aspell_config_replace(sc, "lang", "en")
+
possible_err = aspell.new_aspell_speller(sc)
aspell.delete_aspell_config(c_int(sc))
-
+
# Rudimentary error checking, needs more.
if aspell.aspell_error_number(possible_err) != 0:
print 'err', aspell_error_message(possible_err)
简单说就是把中文改成了英文,从而自动使用英文字典,当然,你得装有aspell和aspell-en (英文字典)。

不过我想更好的办法是可以在配置文件中设定。