mark archlinux update

更新Archlinux出现lib目录问题鸟

Proceed with installation? [Y/n] y
:: Retrieving packages from extra...
 ghostscript-9.06-1-...    12.0 MiB  3.21M/s 00:04 [######################] 100%
(278/278) checking package integrity               [######################] 100%
(278/278) loading package files                    [######################] 100%
(278/278) checking for file conflicts              [######################] 100%
error: failed to commit transaction (conflicting files)
glibc: /lib exists in filesystem
Errors occurred, no packages were upgraded.

上网看看据说是/lib迁移到/usr/lib引起的
#cd /lib && pacman -Qo *
发现./modules目录不属于glibc
先把glibc略过,升级其他包
#pacman -Syu –ignore glibc
然后在进/lib看看,果然modules目录转移到/usr/lib/里了
接着再升级glibc
#pacman -S glibc
可以正常升级。
arch论坛关于升级glibc的帖子很火。。。
https://bbs.archlinux.org/viewtopic.php?id=145006
https://bbs.archlinux.org/viewtopic.php?id=145795

妹的,又遇到了

error: failed to commit transaction (conflicting files)
filesystem: /etc/profile.d/locale.sh exists in filesystem
Errors occurred, no packages were upgraded.

只需要把这个文件重命名就好了
mv /etc/profile.dlocale.sh /etc/profile.d/locale.sh.old
继续#pacman -Syu –ignore glibc
重试了好几次,最后把locale.sh删除才成功!

 

系统修复

如果你已经不幸使用 –force 升级并挂掉了,那么请参考以下资料进行修复:
方法一 (中文翻译
方法二

新闻

vim切换tab标签快捷键

这几天在学习VIM,在WIN7下装了GVIM,在折腾好配置文件后,就在弄这个
切换标签快捷键的问题。
vim从vim7开始加入了多标签切换的功能,相当于多窗口。
之前的版本虽然也有多文件编辑功能,但是总之不如这个方便啦。
用法

:tabnew [++opt选项] [+cmd] 文件            建立对指定文件新的tab
:tabc       关闭当前的tab
:tabo       关闭所有其他的tab
:tabs       查看所有打开的tab
:tabp      前一个
:tabn      后一个
标准模式下:
gt , gT 可以直接在tab之间切换。
更多可以查看帮助 :help table , help -p

使用alt+数字键来切换tab (vim7+)

不过用gt,gT来一个个切换有点不方便, 如果用:tabnext {count}, 又按键太多. 加入以下代码后, 可以用 alt+n来切换,
比如alt+1切换到第一个tab,alt+2切换到第二个tab。

把以下代码加到vimrc, 或者存为.vim文件,再放到plugin目。

function! TabPos_ActivateBuffer(num)
    let s:count = a:num
    exe "tabfirst"
    exe "tabnext" s:count
endfunction

function! TabPos_Initialize()
for i in range(1, 9)
        exe "map <M-" . i . "> :call TabPos_ActivateBuffer(" . i . ")<cr>"
    endfor
    exe "map <M-0> :call TabPos_ActivateBuffer(10)</cr><cr>"
endfunction

autocmd VimEnter * call TabPos_Initialize()

上面的看上去太复杂了,来个简单的。

:nn <M-1> 1gt
:nn <M-2> 2gt
:nn <M-3> 3gt
:nn <M-4> 4gt
:nn <M-5> 5gt
:nn <M-6> 6gt
:nn <M-7> 7gt
:nn <M-8> 8gt
:nn <M-9> 9gt
:nn <M-0> :tablast</cr><cr>

把这个放进_vimrc配置文件里。
继续阅读“vim切换tab标签快捷键”

Nginx+Apache有效提高服务器负载能力-LNAMP

之前流行过一段时间的Nginx+以fastCGI方式运行的PHP来搭建Web站点的方法。但是经过一段时间考量之后,大家经常发现会出现一些502的错误。其实一般是Nginx+fastCGIPHP的形式不太稳定造成。于是尝试了牛人推荐的一种是用Nginx做前端转发PHP请求给Apache的方法来进行服务器平台建设。这种方法有效的避免了Apache在应付大并发时候的些许不足和Nginx配合fastCGIPHP不太稳定的弊端。同时又在一定程度上利用了Nginx速度上的优势。说白了就是一些静态文件有Nginx来处理,PHP请求转发给后端Apache来处理。但是在效率上或者内存等资源占用上不如Nginx+fastCGI方式。

在PHP页面处理使用了suPHP,关于suPHP各位可以参照这里。suPHP其实现在被应用在很多空间租用商的服务器上。主要功能为了使用目录所有者的权限来执行特定位置的PHP页面,不是使用Apache默认Apache或者wwwdata或者nobody用户。

这样的好处主要有两点:
1.空间租用者(使用者)不需要在设置复杂权限了,在自己空间中PHP拥有完全权限。
2.空间租用者(使用者)存放网站文件的目录更安全,不需要开启Apache,wwwdate或者nobody之类权限对于自己站点,避免了777这样的高危权限。但是suPHP要求在编译安装PHP的时候必须编译为PHP-CGI形式才能是用,也就是不能使用平时我们所使用的CLI启动方式。

简单原理如下: CLI传统模式的图解:PHP是作为Apache一个模块存在,就像Apache的一个功能一样。

Apache_Mod-PHP-CLI

suPHP模式图解:suPHP作为Apache一个模块,在需要的时候以特定用户权限来启动PHP-CGI,从而实现以目录所有者权限执行PHP的功能。

Apache_Mod-suPHP_PHP-CGI

最终原理图大致如下:由Nginx接受全部目的端口为80的Web请求,根据请求内容的不同进行过滤。静态文件例如:MP3、GIF、JPG、JS等文件 由Nginx处理,其他PHP Web请求转发到后端Apache服务器上。Apache服务器利用suPHP模块按照目录所有者权限运行PHP程序从而返回页面给客户端。稍加改动就可 以实现跨越多台计算机的群集功能。

我们操作系统平台为CentOS5.5,姑且称呼他为:Nginx+Apache+MySQL+suPHP
Nginx-Apache-MySQL-suPHP

一、升级系统安装必须软件

yum update
yum install gcc gcc-c++ bison patch unzip mlocate flex wget automake \
autoconf gd cpp gettext readline-devel libjpeg libjpeg-devel libpng \
libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib \
zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel \
ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel \
libidn libidn-devel openldap openldap-devel openldap-clients \
openldap-servers nss_ldap expat-devel libtool libtool-ltdl-devel \
kernel-devel autoconf213 vim-common vim-enhanced diff*

继续阅读“Nginx+Apache有效提高服务器负载能力-LNAMP”

Ubuntu12.04无法使用vim系统剪贴板解决方法

以前一直是用鼠标来复制和粘贴网页里复制的文字,还有使用Ctrl+Shift+C/V.也查过在vim里怎么使用复制粘贴,只学会了用dd和p这两个。哎,笨呐。
今天终于理解了vim里多个剪贴板的使用。:reg查看VIM里所有剪贴板的文件。但是我这个Ubuntu12.04就没+和×。解决方法是安装以下这几包。我是又重装了一下vim。

1 问题来源

用 apt-get install安装的vim不能使用系统剪贴板,即复制:”+y,和粘贴”+p不能用;用:reg 命令查看没有”+寄存器

2 软件版本

操作系统:ubuntu 12.04;vim版本 7.3.429

3 安装过程

3.1 安装相关软件包

$ sudo apt-get install build-essential
$ sudo apt-get install ncurses-dev
$ sudo apt-get install xorg-dev
$ sudo apt-get install libgtk2.0-dev

3.2 安装vim

sudo apt-get install vim vim-scripts vim-gnome vim-gtk
sudo apt-get install exuberant-ctags cscope

设置映射:

let mapleader = “,”
let g:mapleader = “,”

map c “+y
map p “*p

请现在使用一下“:reg”命令(先按ESC 键,退出编辑模式,然后按:进入命令模式,然后输入reg回车),看到了?屏幕上的输出结果!是不是特别眼熟,对了!就是您之前复制过的所有内容!也许这 时候您还发现,VIM的剪切板原来有这么多个,按照数字还有符号一个一个的区分开的,这里举一个编号的例子——”5,看到了吗?是以”开头的。还有!有没 有看到编号为”+的剪切板?里面的内容是不是刚才你在浏览器里复制的那段文字啊?呵呵……没错了!系统剪切板的编号就是”+。

好了, 这时候您已经知道了如何查看之前的所有剪贴板内容,我们现在就试着把某一个特定剪切板的内容复制进我们正在编辑的文件中。我们知道,vi的粘贴指令是 “p”,但是如果要粘贴一个特定的剪贴板,只是用p就不行了,那怎么办?简单!把剪贴板的编号带上不就可以了?现在先按ESC,退出编辑模式,然后一词 按”+p这三个字符(怎么按?不会吧!”和+怎么按?用Shift啊!),好了!你看看,之前在浏览器中复制的这段文本,是不是被粘贴进文档中了?

如何将系统剪切板里的内容复制进VIM当中,您已经清楚了。那如何将ViM中复制的字符粘贴到其他地方呢?很简单,我们只需要把要复制的文字,复制 进”+剪切板不就可以了?(”+剪切板是系统剪切板,忘记了?)在VIM中,复制的指令是y(在非编辑模式下按y就可以了),那要将文本复制进指定的剪切 板,和粘贴指定剪切板内容的方法一样,只需要加上剪切板的编号就可以了。举个例子,我们希望把VIM中的一段文本复制下来,然后粘贴到浏览器的地址栏中: 第一步,现把需要复制的文字选中(非编辑模式下),然后在键盘上依次按”+y这三个字符,OK!已经复制下来了,现在用:reg命令看看,是不是在”+剪 切板中了?

Linux下vi和vim不正常的解决方法

用vi编辑文件遇到各种说不出的问题,按i插入移动一下光标,中文字就变乱码鸟,反正是各种不正常。以为是vi的问题,卸载重装了还是一样,那就是编码的问题了,因为我上传的都是UTF-8的文件,在其它linux上都是好的。

用在我这台的解决方法是:
编辑/etc/vimrc文件:

vim /etc/vimrc
set encoding=utf-8
set langmenu=zh_CN.UTF-8	
language message zh_CN.UTF-8

上面的意思是使vi同时支持GBK和UTF-8编码

操作系统语言是英文,显示中文字符

编辑/etc/sysconfig/i18n,修改为如下内容:

LANG="zh_CN.UTF-8"

继续阅读“Linux下vi和vim不正常的解决方法”

解决end_request I/O error on device fd0,sector 0 Buffer I/O error on device fd0,logical block 0

以前刚装好Archlinux的时候就发现了,切换到tty1 2 3 4 下面就一直出现下面两行的error提示
end_request I/O error on device fd0,sector 0
Buffer I/O error on device fd0,logical block 0
后来一直也没管它,偶尔开机后还会卡住gonme进不去,我还一直以为是我的USB摄像头的问题呢!

今天下定决心要把它搞定。用心google了一把,问题出现在fd0上面,也就是floppy上面,这个floppy也就是软驱,话说从我开始玩电脑起就没用过这玩意。虽然表哥送的电脑有软驱。
查看是否加载了floppy模块:

#lsmod | grep -i floppy

如果显示像下面这行说明加载了floppy模块。

floppy                 95465  0

在ArchWiKi里查到禁用软驱模块的方法有几种:
Kernel modules (简体中文)
黑名单
对内核模块来说,黑名单是指禁止某个模块装入的机制。当对应的硬件不存在或者装入某个模块会导致问题时很有用。

有些模块作为 initramfs 的一部分装入。

mkinitcpio -M 会显示所有自动检测到到模块:要阻止 initramfs 装入某些模块,可以在 /etc/modprobe.d/modprobe.conf 中将它们加入黑名单。

运行 mkinitcpio -v 会显示各种钩子(例如 filesystem 钩子, SCSI 钩子等)装入的模块。如果要禁用这些模块,记得在配置完成后重新生成 initramfs。
使用 /etc/modprobe.d/ 中的文件
/etc/modprobe.d/ 中创建 .conf 文件,使用 blacklist 关键字屏蔽不需要的模块,例如如果不想装入 pcspkr 模块:

/etc/modprobe.d/nobeep.conf
# Do not load the pcspkr module on boot
blacklist pcspkr
注意: blacklist 命令将屏蔽一个模板,所有不会自动装入,但是如果其它非屏蔽模块需要这个模块,系统依然会装入它。

要避免这个行为,可以让 modprobe 使用自定义的 install 命令,直接返回导入失败:

/etc/modprobe.d/blacklist.conf
...
install MODULE /bin/false
...

这样就可以 “屏蔽” 模块及所有依赖它的模块。
使用内核命令行
同样可以通过内核命令行(位于 GRUBLILOSyslinux)禁用模块:

modprobe.blacklist=modname1,modname2,modname3

或者:

modname.disable=1

当某个模块导致系统无法启动时,可以使用此方法禁用模块。
使用 GRUB 的示例

/boot/grub/menu.lst
...
kernel /vmlinuz-linux root=/dev/sda1 modprobe.blacklist=pcspkr,ipv6 ro
...
/boot/grub/menu.lst
...
kernel /vmlinuz-linux root=/dev/sda1 pcspkr.disable=1 ipv6.disable=1 ro
...

我使用的方法是在/boot/grub/menu.lst里面加上modprobe.blacklist=floppy
打开编辑/boot/grub/menu.lst文件

vim /boot/grub/menu.lst
...
kernel /vmlinuz-linux root=/dev/sda1 modprobe.blacklist=floppy ro ...
...

修改完保存重启系统

# reboot

CentOS DNS resolv重起无效的解决方法

上上个星期重装安装了一台CentOS 6.2手动分配了一下ip地址,在/etc/resolv.conf这里设置好了DNS。之后可以上网鸟。重起机子后无后ping能网站了,打开/etc/resolv.conf发现又变回没测试之前的。

原来直接修改/etc/resolv.conf不行。必须要在/etc/sysconfig/network-scripts/ifcfg-eth0里面最后加上dns的设置。要不然,重启后,肯定使用eth0设置中没有设dns的相关信息,使/etc/resolv.conf恢复到原来的状态。

vim /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=none
HWADDR=00:xx:19:xx:xx:xx
ONBOOT=yes
TYPE=Ethernet
USERCTL=no
IPV6INIT=no
PEERDNS=yes
NETMASK=255.255.255.0
IPADDR=xxx.xxx.xxx.xxx
GATEWAY=xxx.xxx.xxx.xxx
DNS1=202.96.209.5 #上海dns,根据实际情况更换
DNS2=202.96.209.133 #上海dns,根据实际情况更换

这样设置后/etc/resolv.conf里面根本就不需要设置。
service network restart后,可以发现/etc/resolv.conf里面就有两个dns的解析ip了。

cat /etc/resolv.conf

Generated by NetworkManager
nameserver 202.96.209.5
nameserver 202.96.209.133
search localdomain

DNS解析设置成功。
在此要强调一点的是,直接修改/etc/resolv.conf这个文件是没用的,网络服务重启以后会根据/etc/sysconfig/network-scripts/ifcfg-eth0来重载配置,如果ifcfg-eth0没有配置DNS,那么resolv.conf会被冲掉,重新变成空值。

哎,不知道为啥以前装的系统没有出现这样的情况呢?

修改host文件
打开host文件

/etc/hosts

添加你需要的项,格式如下:

格式:

<IP> <HOSTNAME>.<DOMAIN> <ALIAS>

示例:

216.239.37.99 www.google.com

编辑后,你需要重新启动一下你的网络。

/etc/init.d/networking restart

use expect SSH Auto login

一、要安装这两个东东。
CentOS下

1
yum install tcl
tcl.x86_64 1:8.5.7-6.el6
2
yum install expect
expect.x86_64 0:5.44.1.15-2.el6

ArchLinux下

1
pacman -S tcl
2
pacman -S expect

自动登了ssh脚本

vim sshlogin.exp

 

#!/usr/bin/expect -f
#auto ssh login

set timeout 20
spawn ssh -qTfnN -D 7070 你的登录用户@服务器ip地址

expect "*password:"
send "you passwd\r"
interact

chmod +x sshlogin.exp
二、实现开机自动登录到tty4。
以下是在ArchLinux上操作的,其它系统也差不多。
1、安装自动登录tty的软件

pacman -S mingetty

mingetty-1.08-3-x86_64

vi /etc/inittab

找到关于tty4的,在Archlinux里是c4:2345:respawn:/sbin/agetty…这样的一行改成

c4:23:respawn:/sbin/mingetty --autologin javasboy tty4

把javasboy换成你要登录的用户,且能运行上面脚本的权限。
2、在javasboy用户下的~/.bashrc里面加上:

tty | grep -q tty4 && /home/javasboy/bin/sshlogin.exp

这样tty4就能开机运行这个命令了。

还可以通过crond定时检测7070端口和ssh进程是否运行来重新启动,这样就能实现断线自动重连的功能了。
在此感谢SUN的无私帮助。

博客顺利转入laird提供的空间

博客成功转入laird提供的空间,小弟是十分的感激啊。还有教我学perl。嗯这个必须要学会!
转到这个空间还有遇到点小问题的,就是wordpress不能上传文件和安装插件和主题,大部分原因是权限问题导致的。
而我转入的时候权限都设置好了,原因是nginx和php-cgi所运用的用户不一至。
改成统一的就OK了。

wordpress rewrite写法

        rewrite ^/wp-admin$ /wp-admin/ permanent;

        if (-f $request_filename/index.html){
                        rewrite (.*) $1/index.html break;
                }
        if (-f $request_filename/index.php){
                        rewrite (.*) $1/index.php;
                }
        if (!-f $request_filename){
                        rewrite (.*) /index.php;
                }
    }

svn启动脚本-subversion for linux

花了两天多时间才把公司SVN大概的安装完成,哎默认安装完后没有启动脚本,所以在网上找了一下。

1:编写如下脚本”svnd”放到/etc/rc.d/init.d/目录下

vi /etc/rc.d/init.d/svnd
#!/bin/bash
# Init file for Svn server daemon
#
# chkconfig: 2345 80 25
# description: SVNserver server daemon
#
# processname: svnd

SVN_HOME=/usr/bin
SVN_REPOS=/data/www/svn
if [ ! -f "$SVN_HOME/svnserve" ]
then
echo "svnserver startup: cannot start"
exit
fi
case "$1" in
start)
echo "Starting svnserve..."
$SVN_HOME/svnserve -d -r $SVN_REPOS
echo "Finished!"
;;
stop)
echo "Stoping svnserve..."
killall svnserve
echo "Finished!"
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: svn { start | stop | restart } "
exit 1
esac

2:赋予执行权限

chmod 755 /etc/rc.d/init.d/svnd

3:加入chkconfig,并设置开机启动。

[root@javasboy init.d]# chkconfig --add svnd
[root@javasboy init.d]# chkconfig svnd on
[root@javasboy init.d]# chkconfig --list svnd
svnd            0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

nginx 301跳转到带www域名方法rewrite

首先一、得在你的域名管理里面定义 test.comwww.test.com指向你的主机ip地址,我们可以使用nslookup命令测试:
直接输入 nslookup test.com和nslookup www.test.com 都有指向ip的A记录即可。

第二、我们才能在nginx里面配置rewrite规则。
打开 nginx.conf文件找到你的server配置段:

server
{
listen 80;
server_name www.test.com test.com;
if ($host != 'www.test.com' ) {
    rewrite ^/(.*)$ http://www.test.com/$1 permanent;
}
........

这样就是用户直接访问test.com直接跳转的www.test.com。
即让不带www的域名跳转到带www的域名。

办法2:在配置文件里面写两个server,第一个里面把不带www的域名去掉

server
 {
  listen       80;
  server_name www.test.com;

在配置文件的最下面添加上,这样就可以了。

server {
                server_name test.com;
                rewrite ^(.*) http://www.test.com/$1 permanent;
        }

如果有多个不同的域名都绑定在同一个目录下不带3W的301到带3W的方法和上面的一样
在vhost的完整配制里后面加上

server {
server_name test1.com;
rewrite ^(.*) http://www.test1.com$1 permanent;
}

server {
server_name test2.com;
rewrite ^(.*) http://www.test2.com$1 permanent;
}

server {
server_name test3.com;
rewrite ^(.*) http://www.test3.com$1 permanent;
}

301永久跳转,当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息中的状态码的一种,表示本网页永久性转移到另一个地址。
302临时跳转,也是状态码的一种,意义是暂时转向到另外一个网址。
二者的区别主要是,一句话,302容易被搜索引擎视为spam,301则不会。
permanent代表301永久跳转,改为redirect则为302临时跳转。
nginx官方rewrite文档:传送门

默认的情况下,Nginx 在进行 rewrite 后都会自动添加上旧地址中的参数部分,而这对于重定向到的新地址来说可能是多余。
虽然这也不会对重定向的结果造成多少影响,但当你注意到新地址中包含有多余的“?xxx=xxx”时,心里总还是会觉得不爽,也可能会导致你的网站统计数据不准确。

例如:
把 http://example.com/test.php?para=xxx 重定向到 http://example.com/new

若按照默认的写法:
rewrite ^/test.php(.*) /new permanent;
重定向后的结果是:

http://example.com/new?para=xxx

如果改写成:
rewrite ^/test.php(.*) /new? permanent;
那结果就是:

http://example.com/new

所以,关键点就在于“?”这个尾缀。
假如又想保留某个特定的参数,那又该如何呢?可以利用Nginx本身就带有的$arg_PARAMETER参数来实现。

例如:
把 http://example.com/test.php?para=xxx&p=xx 重写向到 http://example.com/new?p=xx
可以写成:
rewrite ^/test.php /new?p=$arg_p? permanent;

总结如下:

rewrite  ^/test.php  /new  permanent;       //重写向带参数的地址
rewrite  ^/test.php  /new?  permanent;      //重定向后不带参数
rewrite  ^/test.php   /new?id=$arg_id?  permanent;    //重定向后带指定的参数

linux 修改MySQL root密码方法之一

如果 MySQL 正在运行,首先结束mysql进程:

service mysql stop
or 
ps aux | grep mysql
killall mysqld

#启动 MySQL (非正常方式起动):

mysqld_safe --skip-grant-tables &

这样就可以不需要密码进入 MySQL :

mysql -u root -p #要求输入密码时直接回车即可
mysql> use mysql
mysql> UPDATE user SET Password=PASSWORD ('新密码') where USER='root';
mysql> flush privileges;
mysql> quit;

重新结束进程:

service mysql stop
or 
ps aux | grep mysql
killall mysqld

用正常方式启动 MySQL :

service mysql start