如何在Linux下挂载带分区的镜像文件

之前一直有折腾ChromeOS,一位叫hexxeh的朋友一直有提供nightly build的镜像,所以免去了自己编译的烦恼。下载下来后,我打算修改一些东西后,再写入到U盘上,因为ChromeOS的映像文件是带有GPT分区的镜像,所以不能直接mount,需要在mount的时候的提供offset参数,即提供需要挂载的这个分区是从哪里开始的。像这样:

# sudo mount -o offset=xxx xxx.img /MOUNT/TO/DIR/

那么,如何得到这个offset的参数呢?我们可以用fdisk等工具来列出相关信息得到。不过,还有一个更NB的工具叫parted,一般可以在源里面找到。
继续阅读 »

Debian VPS 在更新内核报错的问题

今天在Debian VPS上更新内核时碰到了问题,报错为

Setting up linux-image-2.6.32-5-686-bigmem (2.6.32-31) ...
Running depmod.
Running update-initramfs.
update-initramfs: Generating /boot/initrd.img-2.6.32-5-686-bigmem
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 2.6.32-5-686-bigmem /boot/vmlinuz-2.6.32-5-686-bigmem
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 2.6.32-5-686-bigmem /boot/vmlinuz-2.6.32-5-686-bigmem
Searching for GRUB installation directory ... found: /boot/grub
warning: grub-probe can't find drive for /dev/xvda1.
grub-probe: error: cannot find a GRUB drive for /dev/xvda1. Check your device.map.
run-parts: /etc/kernel/postinst.d/zz-update-grub exited with return code 1
Failed to process /etc/kernel/postinst.d at /var/lib/dpkg/info/linux-image-2.6.32-5-686-bigmem.postinst line 799,  line 2.
dpkg: error processing linux-image-2.6.32-5-686-bigmem (--configure):
subprocess installed post-installation script returned error exit status 2

之前在给公司的VPS作配置的时候也遇到了一样的问题,都是Xen的VPS,装的是Debian的系统,当时就只是把kernel的更新给keep了。今天自己碰到了一样的问题就细细琢磨了一下。看报错的情况是在更新Kernel的时候,没有找到装有GRUB的设备。下面是我解决的步骤:
继续阅读 »

open_basedir restriction in effect: eAccelerator与open_basedir

今天在查阅apache的错误日志时发现有很多的warning,都跟open_basedir有关,如:

2011/09/25 21:27:54 [error] 3927#0: *146 FastCGI sent in stderr: “PHP Warning: require(): open_basedir restriction in effect. File() is not within the allowed path(s): (/srv/http/:/home/:/tmp/:/usr/share/pear/) in /srv/http/xxx.php on line 913″ while reading upstream, client: x.x.x.x, server: example.com, request: “GET / HTTP/1.1″, upstream: “fastcgi://unix:/var/run/php-fpm/php-fpm-kelltan.sock:”, host: “example.com”, referrer: “http://example.com/”

检查php.ini的配置也没发现什么问题,google一番也没有有用的信息,只好自己动手找原因。重新查看了日志,发现这个警告出现在我安装eAccelerator之后,所以觉得这个错误应该跟eAccelerator有关。

在阅读了eAccelerator的wiki,然后又做了一番研究后发现,默认的eAccelerator编译选项跟open_basedir是不相容的,根据wiki上介绍,只要在编译的时候加上参数“ –without-eaccelerator-use-inode”,便可解决这个问题:

$ cd /PATH/TO/eaccelerator-0.9.6.1
$ make clean
$ ./configure --without-eaccelerator-use-inode
$ make
# make install

好了,重新编译完后,记得删掉eAccelerator之前产生的文件,然后重新启动apache:

# rm -rf /var/cache/eaccelerator/*
# /etc/rc.d/httpd restart

好了,一切重归宁静。

用TestDisk找回丢失的分区表

TestDisk

本来想把一ISO镜像dd写入到U盘里的,结果忘记我把移动硬盘也插在电脑上,直接”dd if=xx.iso of=/dev/sdb”了,而这个sdb正好是移动硬盘,于是iso全部被写入到了移动硬盘上@.@。好在移动硬盘上的分区都还挂载着,先把重要的数据都转移后,拨下移动硬盘,果然一个分区也认不出来了,应该是分区表已经被损坏,崩溃。

决定试着找回一下分区表,在网上找到了这篇:介绍一个 GPL 的分区表修复工具 TestDisk,Arch的源也面也正好有testdisk,下载安装,并看了一遍TestDisk的WIKI

之前在windows下也用过一些数据恢复的软件,而这个testdisk并不像那些软件有华丽丽的图形界面,只在终端下面提供一个向导,扫描后显示扫描结果,及有可能的分区情况,选择原先正确的分区情况后写入到硬盘,总算找回了所有分区。只是第一个分区似乎真的损坏了,好在这个分区无关紧要,我只在上面装了个移动作业系统,重新格式化这个分区后,一切安好。

继续阅读 »

3P 及 Ruby 的语法对照表

这里有个页面将Perl, Python, PHP及Ruby,作成了一个对照表。
一个简单而又实用的页面,方便查找四者之间的关系及区别。
点击: Scripting Languages: PHP, Perl, Python, Ruby – Hyperpolyglot

Linux下查看某进程的详细状态

Linux下用”ps”命令可以查看进程列表中某一个进程的内存及CPU占用信息,那么,如果想查看某一进程详细的状态信息应该如何去做呢。
其实Linux下进程的详细信息会被记录在/proc/PID/status文件中,其中PID为某个进程的Process ID。现在假设有个程序ID为788,那么我们只要

cat /proc/788/status

就可以看到788这个进程的详细信息了。至于如何得到PID,可以用”ps aux | grep ‘进程名’” 找到pid。
或者干脆用一行流:

cat /proc/`ps ax | grep mysql | awk '{print $1}' | head -1`/status

PHP运行于fcgid模式时,上传大文件抛500错误

我在pma上试图导入一个SQL文件时,pma抛给我一个500错误,看日志后发现错误日志为:

mod_fcgid: HTTP request length 135225 (so far) exceeds MaxRequestLen (131072)

我的php是运行在mod_fcgid模式下的,看上去是因为HTTP的请求长度太长,大于现有的131072最大请求长度。看了fcgid的配置文件后,发现并没有配置过MaxRequestLen的参数。看来这个131072的配置是默认的了。于是在fcgid的配置文件里加入这个配置,15728640是15M,因为我的php.ini中设置的最大POST长度是15M,所以把它们设置长一样的:

  MaxRequestLen 15728640

重启APACHE后,上传,导入,OK~

diff的使用及制作patch

VPS上的LANMP都是自己编译出来的,因为个人比较追求新的发布,所以一有新的版本发布,就会上down下来编译更新。之前都会对源码做些个人化的修改后再编译,就经常要对新的发布版本做一样的修改。经常性地这样手动更改很麻烦,所以就想到了制作patch补丁。

diff工具的使用

diff [OPTION]... FILES

FILES 表示多个文件或目录
说明:该命令告诉使用者,为了使文件,如FILES一致,需要修改它们的哪些行。如果用 “-”表示 FILES,则表示标准输入。如果 FILES 是目录,那么 diff 将使用该目录中的同名文件进行比较。
继续阅读 »

apache2上配置php-fastcgi


一直以来配置LAMP都会让php以apache handler的方式运行,虽然这样的运行模式会非常高效,但一直觉得它很占我VPS的资源,可怜的128M内存。所以尝试将php以fastcgi的模式运行。

安装

首先安装apache的fastcgi模块,apache下的fastcgi模式有两个:fastcgi_module与fcgid_module,比较后发现fcgid_module比较有优势,所以我选择了fcgid的模块,可以从源安装,也可以从官方下载然后自己编译。图方便,我直接从源安装:

apt-get install libapache2-mod-fcgid

接下去安装php-cgi

apt-get install php5-cgi

如果自己编译的话,记得去掉–with-apxs2,并加上–enable-cgi编译选项。
继续阅读 »

php中preg_*函数关于”\”的一个问题

记得之前,我在php中有要写一个正则匹配:要匹配一个字符串中的的一个反斜杠’\',开始写的是

preg_match("%.+\\%",$str);

但却报了No ending delimiter ‘%’ found in Command line code的错误。于是写成了:

preg_match("%.+\\\\%",$str);

程序正常了,当时也没多管它。昨天翻看PHP手册的时候发现preg_replace函数中有说

To use backslash in replacement, it must be doubled (“\\\\” PHP string).

想了下,这里的”\\\\”应该是在php字符串中,”\\\\”先被转义成了”\\”,然后在正则中,”\\”才又被转义成了”\”。

第 2 页,共 39 页12345...102030...最旧 »