Linux应用心得(一)

目前的开源软件盛行,很多的README文档都是以英文的形式出现,很多懒人不愿意去读此类的文章,所以遇到问题也不会知道怎么去解决。

在这之前,《linux宝库》的站长陈绪先生的《linux一句话》已经概括得很经典,而我追求的是linux中的FAQ形式,只要你有心,没有解决不了的问题。

如果你对太多的 A、Q 不知所措,可以Ctrl+F查找你所需要的问题。

Q00001:
当修改/etc/fstab文件时,因为修改错误而无法启动,这时进入的急救模式只是可读状态,该怎么解决此类问题?
A00001:
使用mount重载系统分区,使其挂载为可写状态,然后修改/etc/fstab文件,具体挂载方式为:

fdisk -l
mount -o mount,rw /dev/hda1 /mnt

mount -o file_mode=0777,dir_mode=0777

Q00002:
有时候换了环境或者网络,发现sendmail与sm_client邮件发送系统启动很慢,虽然能启动成功,但是启动的速度实在让人受不了,怎么sendmail和sm_client服务解决启动慢的问题?
A00002:
类似这样的应该是/etc/hosts文件出现解析问题,不排除其他文件有问题,这里/etc/hosts文件的原始内容如下:

# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost localhost.localdomain

Q00003:
在有些播放器上,有时候发现播放列表上的字符是乱码,解决播放列表乱码的问题是否有统一的格式呢?
A00003:
估计各个播放器的字符编码方式不一样,目前很难有统一的字符编码方式来处理这类问题,比如常见的xmms可以采用加载windows字体的方式获取汉字编码解决,具体方法把WINDOWS目录Fonts目录下的simsun这种字体拷贝到LINUX的 这个目录下/usr/share/fonts/zh_CN/TrueType,然后重起字体服务,fedora8版本以下解决方案如下:

service xfs restart
fc-cache -f -v
如果没有xfs服务,请先安装xfs:
yum install xfs xfs-devel
再用右键单击xmms播放工具的任何地方
会看到一个”选项”,然后选择”功能设定”选择”fonts”
然后设置刚才考过来的字体,注销系统再播放机即可正常使用,对于高版本的xmms记得设置字符编码。
对于音质比较好的amarok,需要进行下载一个软件包mutagen用来解决amarok播放mp3文件名乱码问题,具体方法如下:
安装必要的软件
>sudo apt-get install python-mutagen
or
>yum search mutagen
>sudo yum install python-mutagen -y
把存在NTFS分区上的音乐文件软连接到ext2或ext3分区
>ln -s /u/music /sun/music
转换标签格式,运行mid3iconv命令:
>cd /u/music
>find . -iname “*.mp3″ -execdir mid3iconv -e GBK {} ;

Q00004:
不知道有人使用过在linux下的无线上网”业务”没有?在以前,还没有GUI的界面驱动的时候,常常使用./configure来make install,而随着rpm和deb的盛行,安装变简单了,虽然简单,但是无线仍然不好使,老是激活不了,针对IPW2200的网卡和FC系列的操作系统,我这里给几种解决办法:
A00004:
首先在ipw2200.sourceforge.net下载相关驱动:
使用shell激活:

#!/bin/bash

iwlist=(‘Cnangel’);
iwpasslist=(’1234567890′);

dev=’eth1′;
n=1;
i=0;

while [ $i -lt $n ];
do
iwname=${iwlist[$i]};
iwpass=${iwpasslist[$i]};
if [ "`ps -ef |grep dhclient|grep $dev`" != "" ];then
echo “$dev is up”;
break;
fi

if [ "`iwlist $dev scanning|grep $iwname`" ];then
/sbin/iwconfig $dev essid $iwname
/sbin/iwconfig $dev key $iwpass
echo > /var/lib/dhcp/dhclient-$dev.leases
echo > /var/run/dhclient-$dev.pid
/sbin/dhclient -1 -q -lf /var/lib/dhcp/dhclient-$dev.leases -pf /var/run/dhclient-$dev.pid $dev
fi
((i++))
done

注意:目前的无线密钥驱动好像不支持WPA-PSK和WPA2,如,仅仅支持WEP,所以选择密钥的时候一定要注意。
另外,驱动也可以找NetworkManager来进行更加方便的GUI管理,安装方法如下:
yum install NetworkManager -y
yum install NetworkManager-gnome -y

Q00005:

Eugene M. Minkovskii wrote:

> I’m use vim on FreeBSD 5.3 now. I trying bouth vim6.3 whitout
> patchs and vim6.3 whith patch 1-62.
> I type:
>
> bash-3.00$ export EDITOR=vim
> bash-3.00$ crontab -e
>
> and after saving crontab changes, I’ll get following error:
>
> crontab: temp file must be edited in place
>
> About this we see in man crontab following:
>
> -e Edit the current crontab using the editor specified by the VISUAL
> or EDITOR environment variables. The specified editor MUST edit
> the file in place; any editor that unlinks the file and recreates
> it cannot be used. After you exit from the editor, the modified
> crontab will be installed automatically.
>
> Hmm. I’ll try to remove my .vimrc and crontab install correctly,
> but when I use empty .vimrc, crontab broken again.
>
> Have you any ideas?

A00005:

Set ‘backupcopy’ to “yes”. “:help crontab”.

You can tune a file system, but you can’t tuna fish
– man tunefs
Cnangel注:希望能看明白,主要针对crontab用的时候发生”crontab: temp file must be edited in place”错误的时候的解决办法。

Q00006:
当vim一个文件内容显示一团乱码的时候,你会不知所措,根本不知道采用了什么编码,这时候我们利用我们聪慧的头脑去大胆尝试,一切问题会迎刃而解。
A00006:
首先,判断Vim的默认打开编码,进入命令行模式:

:echo &enc
发现为utf8,把终端的字符编码和vim编码格式弄成一种类型;
vim文件,发现内容仍然是一团糟,尝试使用:
:set encoding=utf8
然后,vim文件,文件内容仍然是乱码,强制指定:
:edit ++enc=utf8
vim文件发现一切明了。

fileencodings 参数是告诉 vim 尝试解码的多种可能编码,vim 会一个一个试着解码,直到试对为止,然后会将试出来的编码记录到 fileencoding 里面,可以显示 fileencoding 就能知道现在 vim 用什么来解码这个文件了。如果想将文件用另外一种编码”另存为”,可以修改fileencoding 然后 :w 。
termencoding 参数是Vim 所工作的终端(或者Windows 的Console 窗口) 的字符编码方式。
注意:freebsd中文一般使用cp936,而linux部分机器可使用gbk字符集
我目前使用的vim配置如下:(~/.vimrc)

” Multi-encoding setting, MUST BE IN THE BEGINNING OF .vimrc!

if has(“multi_byte”)
” When ‘fileencodings’ starts with ‘ucs-bom’, don’t do this manually
“set bomb
set fileencodings=ucs-bom,utf-8,chinese,taiwan,japan,korea,latin1
” CJK environment detection and corresponding setting
if v:lang =~ “^zh_CN”
” Simplified Chinese, on Unix euc-cn, on MS-Windows cp936
set encoding=chinese
set termencoding=chinese
if &fileencoding == ”
set fileencoding=chinese
endif
elseif v:lang =~ “^zh_TW”
” Traditional Chinese, on Unix euc-tw, on MS-Windows cp950
set encoding=taiwan
set termencoding=taiwan
if &fileencoding == ”
set fileencoding=taiwan
endif
elseif v:lang =~ “^ja_JP”
” Japanese, on Unix euc-jp, on MS-Windows cp932
set encoding=japan
set termencoding=japan
if &fileencoding == ”
set fileencoding=japan
endif
elseif v:lang =~ “^ko”
” Korean on Unix euc-kr, on MS-Windows cp949
set encoding=korea
set termencoding=korea
if &fileencoding == ”
set fileencoding=korea
endif
endif
” Detect UTF-8 locale, and override CJK setting if needed
if v:lang =~ “utf8$” || v:lang =~ “UTF-8$”
set encoding=utf-8
endif
else
echoerr ‘Sorry, this version of (g)Vim was not compiled with “multi_byte”‘
endif

“环境变量 LANG(使用的语言)
“环境变量 LC_CTYPE(使用的内部编码)
“Vim 选项 encoding(Vim 的内部编码)
“Vim 选项 termencoding(Vim 在与屏幕/键盘交互时使用的编码)
“Vim 选项 fileencoding(Vim 当前编辑的文件在存储时的编码)
“Vim 选项 fileencodings(Vim 打开文件时的尝试使用的编码)
“Vim 选项 ambiwidth(对“不明宽度”字符的处理方式;Vim 6.1.455 后引入)
syntax on

set fileencodings=ucs-bom,utf-8,gbk,big5,latin1
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8

“缩进
set backspace=2
set autoindent
“set expandtab
“set cindent shiftwidth=2
“set autoindent shiftwidth=2

“空格代替tab
set shiftwidth=4
set softtabstop=4
set tabstop=4
set cindent shiftwidth=4

“行号
set number

“标尺
set ruler

set incsearch
set showmode
“打开文件时自动回到上次编辑位置
set showcmd
“置粘贴模式,这样粘贴过来的程序代码就不会错位了。
set paste

“设置帮助信息
set helplang=cn

“界面字体
set gfn=Courier_New:h10:cANSI
“set guifont=SimSun 12

“搜索关键字高亮
set hls

“搜索是对不全区分大小写
“set ic

“但现在要区分
“set noic

“设置不备份
“set nobackup
“set nowritebackup

“默认备份文件目录
“set backupdir=/usr/local/backup

“设置配色方案,colorscheme可以设置,但我总提示找不到
“source $VIMRUNTIME/colors/slate.vim
“colorscheme nightflight
“colorscheme desert
highlight Comment ctermfg=Lightred

“默认是插入模式
“set insertmode

“设置vim控制鼠标滚动
“set mouse=a

“设置 Ctrl+x + Ctrl+f 选择路径时,去除不是文件名的特殊字符
set isf=@,48-57,/,.,-,_,+,#,$,%,~

“设置Crontab为可用状态
set backupcopy=yes

“设置使用screen vim时,因为错误的按键使屏幕不再闪烁
set vb t_vb=

“设置折叠模式
set foldcolumn=4
“光标遇到折叠,折叠就打开
set foldopen=all
“移开折叠时自动关闭折叠
set foldclose=all
“zf zo zc zd zr zm zR zM zn zi zN
“依缩进折叠
“set foldmethod=indent
“依标记折叠
“set foldmethod=marker

map <F6> a<C-R>=strftime(“%c”)<CR><Esc>
map <F7> :w<CR>:!sh -x %<CR>
map <F8> :w<CR>:!perl -c %<CR>
map <F9> :w<CR>:!perl %<CR>

最后谢谢谢宇恒同学给予的帮助。
后补:关于vim编译
建议使用vim7.0或以上版本,源码编译时参数可以选择,比如:
./configure –prefix=/usr –enable-multibyte
配置选项的含义:
–enable-multibyte
我们强烈推荐你启用该选项(虽然它是可选的),因为它使得 Vim 可以支持使用多字节字符编码的文件,在一个使用多字节字符集的 locale 上,这是必需的

Q00007:
利用mail命令发送附件,真的很难么?
A00007:
不难,需要你的服务器端支持uuencode编码就可以。比如利用mail命令发送一个压缩包

tar cf – Hash.lst | gzip | uuencode Hash.lst.tar.Z | mail -s ‘sdas’ xxxx@xxxxc.com即可完成.
可以man uuencode,发现有这么一条:
tar cf – src_tree | compress | uuencode src_tree.tar.Z | mail sys1!sys2!user

Q00008:
怎么利用date获得昨天的日期?
A00008:
在BSD平台上:

date -v-1d “+%Y%m%d %T”
在Linux平台上:
date -d “-1 day” “+%Y%m%d %T”
其他方法,并不一定通用,只是一些有特色思路

date +%Y%m%d -d “-1 day”
date -d yesterday +%C%y%m%d
export TZ=”TAIST+16″ && date|awk ‘{print $2,$3}’ && export TZ=”TAIST-8″
echo |gawk ‘ {print strftime(“%Y%m%d” ,systime()-86400*4) ;exit }’
date -r $(($(date “+%s”)-86400))
date -d “3 days ago” +%Y%m%d

Q00009:
怎么使用ssh密钥而不用输入密码登陆远程机器?
A00009:
假如本地机器是localhost,远程机器是remotehost,要访问远程机器,使用ssh-keygen来生成密钥,一般以 rsa key为例 :
Linux上的sh-keygen:

ssh-keygen -t rsa
FreeBSD上的sh-keygen:
ssh-keygen -P ” -t rsa1
早期的sh-keygen:
ssh-keygen -f id_rsa -P ”
原文如下:
If your version of ssh-keygen does not understand the -t option, try: ssh-keygen -f keyname-identity -p ”
然后将id_rsa.pub放到远程机器的~/.ssh/目录下,运行:

chmod 644 ~/.ssh/authorized_keys
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

这样,在localhost上使用scp以及ssh可以直接登陆remotehost,而不用输入密码了。
注意:
1,.ssh权限最好设置为0711权限,而密钥所在文件是0400权限。
2,如果指定要freebsd不使用identity.pub的公钥,而要使用id_dsa.pub的公钥,除了 -i 指定私钥办法解决外,还可以使用 -oProtocol=2 来解决问题,特别scp的时候。

Q00010:
我在linux下可以使用命令查看通讯进程,如果发现有死锁的进程,我可以使用kill命令杀掉,但是我如果不得不工作的windows平台下,怎么杀掉一个进程呢?比如我想杀掉占用80端口的进程怎么办呢?
A00010:
长期在linux下工作的朋友,对Windows也非常陌生,对于刚接触到windows的朋友来说,不知道什么进程是占用了什么端口是个非常痛苦的事情,尽管windows任务管理器提供了比较丰富的功能,但是习惯于命令式的人实在是觉得“拗手”吧!查看80端口PID号码:

netstat -ano
查出Local Address列的80端口对应的PID是多少
Active Connections

Proto Local Address Foreign Address State PID
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 3880
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1880
TCP 0.0.0.0:2804 0.0.0.0:0 LISTENING 956
TCP 0.0.0.0:3260 0.0.0.0:0 LISTENING 1640
TCP 0.0.0.0:3261 0.0.0.0:0 LISTENING 1640
TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 520
TCP 0.0.0.0:8000 0.0.0.0:0 LISTENING 3804
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 2676

从上面我们运行命令(不会不知道windows的命令从哪入口吧?msdos)知道80端口的PID是3880,于是杀掉这个端口,也就是关闭80这个端口号,运行命令:
ntsd -c q -p 3880
即可以关闭80端口了。

Q00011:
经常使用Linux机器,发现mail功能不好使,进入/etc/init.d目录,发现根本没有此目录,使用:

which sendmail
确定系统已经安装上mail,但是我怎么将mail作为守护进程运行呢?
A00011:
如果要sendmail处理发送来的信件,必须有一个守护进程在运行。sendmail守护进程就是带有特殊标志位的sendmail程序。这个守护进程是被/etc/init.d/mail脚本在系统启动的时候自动启动的。
在此脚本中用来启动sendmail的命令如下:
/usr/lib/sendmail -bd -q15m
-bd标志是使sendmail作为一个守护程序运行。-q15m标志使sendmail fork出一个子守护进程来每隔15分钟处理一次消息队列。
如果没有对应的目录,我相信写一个mail的守护进程应该不成问题了吧。

Q00012:
我的本子的显卡型号是ATI MOBILITY RADEON X700,每次尝试一个Linux发行版,都为显卡驱动的安装伤脑筋,这里整理笔记如下,希望能给遇到类似的同学一点点小帮助。
A00012:
首先是去http://www.ati.com下载你计算机专用显卡型号的驱动,比如我的显卡驱动为:ati-driver-installer-8.40.4-x86.x86_64.run,32位机器或者64位机器通用这个显卡驱动,所以不必要担心自己下错了。
再次,需要xorg和相关驱动,一般发行版本自带,老的发行版本没有的话,自己google一下。
接着,安装ati驱动,直接运行可能会找不到相关的内核,所以需要以下形式安装:

./ati-driver-installer-8.40.4-x86.x86_64.run –listpkg
找到我的对应的发行版本:Fedora/F7
紧接着:
./ati-driver-installer-8.40.4-x86.x86_64.run –buildpkg Fedora/F7
若没有错误,则ati驱动安装完成了。
检测阶段:startx,发现黑屏,按Ctrl+Alt+F1,看到提示错误,libstdc++5.0.0不存在,不能装载flgrx.so文件,这个很容易,找一个compat-libstdc++-33包安装就可以了。
yum install compat-libstdc++-33 -y
如果还有错误,根据错误信息处理就ok了。

Q00013:
在Linux下使用了Windows的丰富的字体,发现在宽屏下,用firefox使用windows的字体看英文字体比较虚,我选择的是宋体,16号大小,如果选择12号,倒是看上去不是很虚,但是字体太小了,有点累眼睛 :) 怎么使用好看一点的字体又不会影响效果呢?
A00013:
对于独立显卡的机器,首先配置好机器显示的分辨率,我这里宽屏配置的分辨率是1280×800,首先在gnome下字体并没有问题,只是我以前改动过firefox的配置,针对firefox的问题解决如下:
1,打开firefox首选项,选择内容项,找到“字体&颜色”;
2,默认字体选择“sans-serif”,大小选择合适的高度,我选择16号大小,其实“Courier New”也不错,根据情况选择;
3,高级选项可以自己选择,比如serif字体,Times New Roman以及Arial字体也不错。
当然这些都是在windows字体点阵足够的情况下,如果仍然看上去虚,把字体由16号变小,直到看清楚为止,也可以找一些比较高点阵的字体,google一下,注意有些字体是要收费的哟。

Q00014:
在unix下运行perl程序时,发现错误提示为“: bad interpreter: No such file or directory”,而程序没有任何错误,解释器路径也正确,为何会出现这种没有这个文件或者目录的情况呢?
A00014:
这种原因一般是由于0×10和0×13,简单点说是windows系统的换行和回车导致问题,一般在linux或者unix下的换行不包括回车符,所以需要使用dos2unix工具将perl程序转换成为unix可识别的文字就可以了。

Q00015:
怎么在Linux下使用Windows下的字体呢?例如:Fedora8
A00015:
在Fedora官方的FAQ上,写得很清楚,这里不累述了,原文如下:

Yes, you can. Here’s how you install fonts:

1. Under the “System” menu in the tray, choose “Preferences” and then “Fonts.”
2. Click on the “Details…” button.
3. Click on “Go to font folder.”

Now simply drag & drop your fonts into the “Fonts” window to add them. You may have to log out and log in again to see them actually show up in that folder.

If you have any programs open, you will need to close then and then open them again, to have the new fonts show up in those programs.

By the way, there’s also a very easy way to install all of the common Windows fonts on Linux. This can sometimes make web pages display more nicely:

1. Open a Terminal.
2. Become root:

su -
3. Download the MS Core Fonts Smart Package File:

wget http://corefonts.sourceforge.net/msttcorefonts-2.0-1.spec
4. Make sure that the rpm-build and cabextract packages are installed:

yum install rpm-build cabextract
5. Build the Core Fonts package:

rpmbuild -ba msttcorefonts-2.0-1.spec
6. Install the Core Fonts package:

yum localinstall –nogpgcheck /usr/src/redhat/RPMS/noarch/msttcorefonts-2.0-1.noarch.rpm

Q00016:
针对Fedora8(这里又说F8,@_@ ),为什么和以前安装Fedora7、fedora6等等不一样了呢,在插入启动光盘的时候一直sbinloader… …中或者一直halt,或者无缘无故的怪毛病?
A00016:
笔者在安装fedora8的时候也出现过这样的问题,刚开始以为自己的可擦写盘坏掉了,后来又用dvd刻了一个dvd盘,依旧loader,去官方查没有结果,后来还是搜索给出了答案,原来是硬件配置和现有版本冲突的问题,不知道为什么fedora8这么仓促发布?不把一些环境测试好了在发布,这个问题后来已经反应到redhat的官方网站并且提交上去。笔者机器是acpi冲突,安装时,编辑安装选项(按”e”编辑),后面加上

clocksource=acpi_pm
由于笔者本本的驱动在fedora8中没有集成,所以得自己从官方ati中下载驱动,不过官方的ati驱动又出现了bug,不过整整还能用,安装时候只能在后面加上:
text
这样安装完成了。不过现在笔者已经很满意了,在fc3的时候,官方还没有成型的ati显卡驱动,fedora core3没有自己集成ati驱动,每次都是和flgrx以及xorg重新编译,然后再和内核一起加载,这样才解决,现在方便多了,关于怎么去安装显卡看Q00012。

Q00017:
关于rpm安装的mysql,在日志文件/var/log/mysqld.log会出现:

[ERROR] Fatal error: Can’t open privilege tables: Can’t find file: ‘./mysql/host.frm’ (errno: 13)
或者:
[ERROR] Fatal error: Can’t open privilege tables: Table ‘mysql.host’ doesn’t exist
的字样,而自己编译的mysql没有这个方面的问题(除非你不按照INSTALL文件的说明去做),究竟该怎么解决呢?
A00017:
这个问题来源于操作系统安装mysql时,都是以root身份安装rpm,实际上是mysql的rpm包的bug,导致数据存放目录权限是root权限导致,正确的解决方法是把mysql_install_db的数据库目录更改所属权限即可,以默认安装的路径为例:
chown -R mysql:root /var/lib/mysql/mysql

Q00018:
在x64位机器编译GD库时,发现在编译freetype源码时出现如下错误:

/usr/bin/ld: /usr/local/lib/libz.a(compress.o): relocation R_X86_64_32can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libz.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
其中zlib版本为:zlib-1.2.2
libpng版本为:libpng-1.2.23
libjpeg版本为:jpeg-6b
freetype版本为:freetype-2.3.5
GD版本为:2.0.34
不能通过编译。
A00018:
错误原因:zlib安装问题
解决方法:重新编译zlib文件,步骤如下:
# tar -zxvf zlib-1.2.3.tar.gz
# cd zlib-1.2.3
#./configure
#vi Makefile
找到 CFLAGS=-O3 -DUSE_MMAP
在后面加入-fPIC,即变成CFLAGS=-O3 -DUSE_MMAP -fPIC
#make
# make install
及可正确完成zlib在x64位机器上的安装。
注意:在x64位机器上编译一些软件,其实很多都需要在优化编译选项上加上 -fPIC 这个参数,否则编译会通不过,笔者在这里吃过很大的亏。

 

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>