Submitted by admin on 2011, July 18, 7:52 PM
ramdisk的制作
2.6内核开始,initrd.img采用cpio压缩,ramdisk.img也一样,使用gunzip解压缩,然后再使用 cpio解包。
1)将ramdisk.img复制其他目录,名称改为ramdisk.img.gz,解压
#gunzip ramdisk.img.gz
//新建一个文件夹ramdisk,进入
#cpio -i -F ../ramdisk.img
这时,可到ramdisk中看看去~
2)修改init.rc,在PATH中加上busybox 路径
//busybox安装在 /data/busybox
## Global environment setup
##
env {
#其中, /data/busybox 为busybox安装路径,bash也是放在其中
PATH /data/busybox:/sbin:/system/sbin:/system/bin
LD_LIBRARY_PATH /system/lib
ANDROID_BOOTLOGO 1
ANDROID_ROOT /system
ANDROID_ASSETS / system/app
ANDROID_DATA /data
EXTERNAL_STORAGE /sdcard
DRM_CONTENT /data/drm/content
HOME / #这个也是新添加环境变量
}
3)重新打包成镜像,并使用新镜像启动emulator
#cpio -i -t -F ../ramdisk.img > list
#cpio -o -H newc -O rd_busybox.img < list
//使用 -ramdisk 参数,指定所使用的镜像文件
#emulator -noskin -ramdisk rd_ramdisk.img
2. 安装busybox及bash
下载地址:http://www.billrocks.org/android_libs/bin/
注:也可自行交叉编译,不过需静态编译。
#adb shell mkdir /data/busybox
#adb push busybox /data/busyobx
#adb push bash /data/busybox
//adb shell,进入android
#cd /data/busyobx
#chmod +x busybox bash
#./busybox --install //将程序安装在当前目录下
//重启emulator,进入bash
bash-3.2# export
declare -x ANDROID_ASSETS="/system/app"
declare -x ANDROID_BOOTLOGO="1"
declare -x ANDROID_DATA="/data"
declare -x ANDROID_ROOT="/system"
declare -x DRM_CONTENT="/data/drm/content"
declare -x EXTERNAL_STORAGE="/sdcard"
declare -x HOME="/"
declare -x LD_LIBRARY_PATH="/system/lib"
declare -x OLDPWD
declare -x PATH="/data/busybox:/sbin:/system/sbin:/system/bin"
declare -x PWD="/data/bin/tst"
declare -x SHLVL="1"
注:在1中修改 init.rc 增加的环境变量及路径已经生效。
android | 评论:0
| Trackbacks:0
| 阅读:1320
Submitted by admin on 2011, July 18, 7:50 PM
有时候希望在启动后做点事情,比如在sdcard上建立目录,修改/data的访问权限等,这些都可以放在init.rc中去完成,那么如何来完成呢,最近由于工作的需要,在这方面进行了一些研究,特写于此,供大家参考。
通过下面的例子来讲述,实现一个功能:在android系统启动后,修改/data的访问权限为770.
共4步:1、解压ramdisk.img 2、用c语言完成要实现的功能 3、修改init.rc,启动c语言可执行程序 4、制作ramdisk.img
1、解压ramdisk.img:
解压、修改Android的ramdisk.img的手动方法:
将ramdisk.img复制一份到任何其他目录下,将其名称改为ramdisk.img.gz,并使用命令
gunzip ramdisk.img.gz
然后新建一个文件夹,叫ramdisk吧,进入,输入命令
cpio -i -F ../ramdisk.img
这下,你就能看见并操作ramdisk里面的内容了。
此步可参考:http://blog.csdn.net/liushaogeng/archive/2010/10/14/5941259.aspx
2、完成一个C语言程序chpermission.c,来实现修改权限的功能。代码如下:
#include <stdlib.h>
int main()
{
system("chmod 700 /data");
return 0;
}
然后编译此程序,不过需要编译为android下的可执行程序,可参考我的博客:http://blog.csdn.net/liushaogeng/archive/2010/09/01/5855925.aspx ,采用博客中介绍的两种方法均可以。
编译完后将可执行文件push到模拟器的/data目录中去:
#adb push chpermission /data
3、 修改ramdisk目录下init.rc文件,让其启动 chpermission程序, 增加以下代码:
#add by me on 2010-10-18
service chpermission /data/ chpermission
oneshot
用于启动 chpermission,完成相应的功能--修改data权限。
init.rc的语法可参考博客: http://blog.csdn.net/liushaogeng/archive/2010/10/18/5949244.aspx
4、制作ramdisk.img,
init.rc修改之后,可以使用下列命令重新打包成镜像
cpio -i -t -F ../ramdisk.img > list
cpio -o -H newc -O lk.img < list
当前目录下生成的lk.img就是我们的新镜像了。
可参考博客: http://blog.csdn.net/liushaogeng/archive/2010/10/14/5941259.aspx
将ramdisk.img拷贝到sdk指向的目录。
全部ok,重启自己的模拟器,查看data权限是否为770.
android | 评论:0
| Trackbacks:0
| 阅读:856
Submitted by admin on 2011, July 18, 7:50 PM
在Unix和Linux的各种操作系统下,每个文件(文件夹也被看作是文件)都按读、写、运行设定权限。
读、写、运行三项权限可以用数字表示,就是r=4,w=2,x=1。所以,rw-r--r--用数字表示成644。
反过来说777就是rwxrwxrwx,意思是该登录用户(可以用命令id查看)、他所在的组和其他人都有最高权限。
Android中可用通过adb shell 方法修改文件的权限,有时候我们需要在代码中实现改功能,
try {
String command = "chmod 777 " + destFile.getAbsolutePath();
Log.i("zyl", "command = " + command);
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(command);
} catch (IOException e) {
Log.i("zyl","chmod fail!!!!");
e.printStackTrace();
}
android | 评论:0
| Trackbacks:0
| 阅读:1013
Submitted by admin on 2011, July 18, 7:50 PM
由于某些原因,可能需要指定域名对应的IP地址。Android是基于Linux的系统,与Linux类似,通过hosts文件来设置。
在Android下,/etc是link到/system/etc的,我们需要修改/system/etc/hosts来实现。但是这个文件是只读,不能通过shell直接修改。可以通过连接到PC上使用adb来修改。步骤如下:
1、获得root权限:adb root
2、设置/system为可读写:adb remount
3、将hosts文件复制到PC:adb pull /system/etc/hosts <PC机上文件名>
4、修改PC机上文件
5、将PC机上文件复制到手机:adb push <PC机上文件名> /system/etc/hosts
如果要查看是否修改成功,可以在PC上执行adb shell,运行cat /system/etc/hosts;或者在手机上运行cat /system/etc/hosts。
在Android 1.6系统中,hosts文件格式有一点与PC机Linux不同:不能在一行中一个IP对应多个域名,比如:
127.0.0.1 host1.example.com host2.example.com host3.example.com
在大多PC机Linux系统是合法的,但不能在Android 1.6上起作用,需要拆成每个域名一行才能使用:
127.0.0.1 host1.example.com
127.0.0.1 host2.example.com
127.0.0.1 host3.example.com
转
android | 评论:0
| Trackbacks:0
| 阅读:726
Submitted by admin on 2011, July 18, 11:24 AM
Squid 中 refresh_pattern 的作用
用于确定一个页面进入cache后,它在cache中停留的时间。refresh_pattern 规则仅仅应用到没有明确过时期限的响应。原始服务器能使 用 Expires 头部,或者 Cache-Control:max-age 指令来指定过时期限 ,只要没有在设置 override-expire。
语法:
refresh_pattern [-i] regexp min percent max [options]
min 参数是分钟数量。它是过时响应的最低时间限制。如果某个响应驻留在 cache 里的时间没有超过这个最低限制,那么它不会过期。类似的,max 参数是存活响应的最高时间限制。如果某个响应驻留在 cache 里的时间高于这个最高限制,那么它必须被刷新。
在最低和最高时间限制之间的响应,会面对 squid 的最后修改系数 LM-factor 算法 LM-factor=(response age)/(resource age)。对这样的响应,squid 计算响应的年龄和最后修改系数,然后将它作为百分比值进行比较。响应年龄简单的就是从原始服务器产生,或最后一次验证响应后,经历的时间数量。源年龄在 Last-Modified 和 Date头 部之间是不同的。LM-factor 是响应年龄与源年龄的比率。这个基本不用详细了解,这是不是一个精确控制过期的参数,如果要精确控制过期,就不要使用这个。
Refresh_pattern 有14个参数
我讲讲常用的几个参数的意思
override-expire
该选项导致 squid 在检查 Expires 之前,先检查 min 值。这样,一个非零的 min 时间让 squid 返回一个未确认的 cache 命中,即使该响应准备过期。
override-lastmod
改选项导致 squid 在检查 LM-factor 百分比之前先检查min ,它生效在expire 之后
reload-into-ims
该选项让 squid 在确认请求里,以 no-cache 指令传送一个请求。换句话说,squid 在转发请求之前,对该请求增加一个 If-Modified- Since 头部。注意这点仅仅在目标有 Last-Modified 时间戳时才能工作。外面进来的请求保留 no-cache 指令,以便它到达原始服务器。
一般情况可以使用 reload-into-ims。它其实是强行控制对象的超时时间,这违反了http协议的精神,但是在带宽较窄的场合,可以提高明显系统相应时间。
举例:
refresh_pattern -i \.css$ 1440 50% 129600 reload-into-ims
refresh_pattern -i \.xml$ 1440 50% 129600 reload-into-ims
refresh_pattern -i \.html$ 1440 90% 129600 reload-into-ims-
refresh_pattern -i \.shtml$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.hml$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.jpg$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.png$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.gif$ 1440 90% 129600 ignore-reload
refresh_pattern -i \.bmp$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.js$ 1440 90% 129600 reload-into-ims
ignore-reload
该选项导致 squid 忽略请求里的任何 no-cache 指令。
所以。如果希望内容一进入 cache 就不删除,直到被主动 purge 掉为止,可以加上 ignore-reload 选项,这个我们常用在mp3,wma,wmv,gif之类。
Examples:
refresh_pattern -i \.mp3$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.wmv$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.rm$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.swf$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.mpeg$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.wma$ 1440 50% 2880 ignore-reload
ignore-no-cache
该选项导致 Squid 强制忽略从源站而来的“Pragma: no-cache”和“Cache-control: no-cache”
ignore-private
该选项导致 Squid 强制忽略从源站而来的“Cache-control: private”
ignore-auth:强制将一个请求认为是源站发送的带有“Cache-control: public”
ignore-auth
该选项导致 Squid 强制将一个请求认为是源站发送的带有“Cache-control: public”
Refresh_pattern percent 的计算
resource age =对象进入cache的时间-对象的last_modified
response age =当前时间-对象进入cache的时间
LM-factor=(response age)/(resource age)
举个例子,这里只考虑percent, 不考虑min 和max
例如:refresh_pattern 20%
假设源服务器上www.aaa.com/index.htm —–lastmodified 是 2007-04-10 02:00:00
squid上 proxy.aaa.com/index.htm index.htm进入cache的时间 2007-04-10 03:00:00
1)如果当前时间 2007-04-10 03:00:00
resource age =3点-2点=60分钟
response age =0分钟
index.htm还可以在cache停留的时间(resource age)*20%=12分钟
也就是说,index.htm进入cache后,可以停留12分钟,才被重新确认。
2)如果当前时间 2007-04-10 03:05:00
resource age =3点-2点=60分钟
response age =5分钟
index.htm还可以在cache停留的时间(resource age)*20%=12分钟-5=7
LM-factor=5/60=8.3%<20%
一直到2007-04-10 03:12:00 LM-factor=12/60=20% 之后,cache中的页面index.htm终于stale。
如果这时没有 index.htm 的请求,index.htm 会一直在缓存中,如果有 index.htm 请求,squid 收到该请求后,由于已经过期, squid 会向源服务器发一个 index.htm 是否有改变的请求,源服务器收到后,如果 index.htm 没有更新,squid 就不用更新缓存,直接把 缓存的内容放回给客户端,同时,重置对象进入 cache 的时间为与源服务器确认的时间,比如 2007-04-10 03:13:00,如果正好在这个后重新确认了页面。重置后,resource age 变长,相应在 cache 中存活的时间也变长。
如果有改变则把最新的 index.htm 返回给 squid,squid 收到会更新缓存,然后把新的 index.htm 返回给客户端,同时根据新页面 中的Last_Modified 和取页面的时间,重新计算 resource age,进一步计算出存活时间。
实际上,一个页面进入 cache 后,他的存活时间就确定了,即 (resource age) * 百分比,一直到被重新确认。
转
squid/缓存 | 评论:0
| Trackbacks:0
| 阅读:738
Submitted by admin on 2011, July 17, 10:43 PM
rysnc是一个数据镜像及备份工具,具有可使本地和远程两台主机的文件,目录之间,快速同步镜像,远程数据备份等功能。在同步过程中,rsync是根据自己独特的算法,只同步有变化的文件,甚至在一个文件里只同步有变化的部分,所以可以实现快速的同步数据的功能。
第一种:依赖ssh服务同步目录
rsync -aSvH /home/N22/test1/* /home/N22/test2/
参数解释:
a 等同于 -rlptgoD 归档模式,就是保持文件所有属性、权限不变
S 有效的处理零散文件
v verbose模式
H 保持hard links
上面这个表示 将本机的/home/N22/test1/目录下所有的文件,同步到/home/N22/test2/目录下。这种方式我只能同步新增和更新,不能同步删除,不知道原因,修改为
rsync -aSvH –delete /home/N22/test1/* /home/N22/test2/
时,虽然添加了delete仍然不能同步删除的文件。
和其它服务器同步时,需要账户和密码:rsync -aSvH /home/* root@192.168.1.1:/home/
第二种:服务器和客户端
经过测试,这种服务器和客户端的配置能完美解决删除文件和目录的同步功能。
服务器端配置:
1、rysnc一般是通过xinetd进行启动的。
修改/etc/xinetd.d/rsync,只修改一个地方
# default: off
# description: The rsync server is a good addition to am ftp server, as it \
# allows crc checksumming etc.
service rsync
{
disable = yes 修改为disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = –daemon
log_on_failure += USERID
}
2、接下来编辑配置文件
[root@mailsvr ~] # vi /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
[web]
path = /opt/web
ignore errors
read only = true
list = false
hosts allow = 192.168.0.5 # 允许的IP地址
hosts deny = 0.0.0.0/32 # 禁止的IP 地址
auth users = backup # 认证用户名,此例是 backup
secrets file = /etc/backup.pass #认证用户的密码文件
3、编辑服务器的密码文件 /etc/backup.pass
vi /etc/backup.pass
backup:123456
4、然后设置权限chmod 400 /etc/backup.pass
客户端配置
1. 编辑rsync连接时的密码文件 /etc/rsync_client.pass
vi /etc/rsync_client.pass
123456 # 只需要配置连接时使用的密码即可,必须与A服务器上定义的密码相同.
2. chmod 600 /etc/rsync_client.pass
3. 使用 rsync 命令连接服务器,实现文件同步
rsync -vzrtopg –progress –delete –password-file=/etc/rsync_client.passbackup@192.168.1.2::web /opt/test
4. 使用 –execlude= 排除不需要同步的文件后缀名
rsync -vzrtopg –progress –delete –password-file=/etc/rsync_client.pass –exclude=”*.tmp”backup@192.168.1.2::web /home/test
5. 使用 –execlude-from= 排除不需要同步的目录
rsync -vzrtopg –progress –delete –password-file=/etc/rsync_client.pass –exclude-from=/opt/pcdir backup@192.168.1.2::web /home/test
6、定时同步
#vi rsyncd.sh
rsync -aSvH –delete –password-file=/home/N22/rsync_client.pass backup@192.168.1.252::web /home/N22/test2/
#crontab -e
01 04 * * * /etc/rsyncd.sh
每天凌晨4点01分执行
http://hi.baidu.com/colorsight/blog/item/f0ce3816d874ec104b90a75f.html
linux | 评论:0
| Trackbacks:0
| 阅读:759
Submitted by admin on 2011, July 17, 7:30 PM
假设我这里有大量图像、CSS、javascript等静态文件,分别放在后端服务器 192.168.1.5 和 192.168.1.6上,那么我如何利用nginx的反向代理功能将不同的 http_user_agent 请求发送到指定的服务器上呢?如 "Mozilla" 转发到 192.168.1.5 ,MSIE 转发到 192.168.1.6 。
Nginx web 服务器支持if条件表达式,由此来跳转或者使用不同的配置变量。在本文中需要使用 $http_user_agent 变量,它标记了用户浏览器的类别,版本以及操作系统的一些信息,语法如下:
if ( condition ){
do_something
}
if ( $http_user_agent = "wget" ){
do_something
}
if ( $http_user_agent ~ MSIE ){
return 403;
}
if指令会就检查后面表达式的值是否为真(true),如果为真,则执行后面大括号中的内容。以下是一些条件表达式的比较方法:
1、变量的完整比较可以使用=或!=操作符
2、 部分匹配可以使用正则表达式来表示,~或~*
3、~表示区分大小写
4、~*表示不区分大小写(firefox与FireFox是一样的)
5、!~与!~* 是取反操作,也就是不匹配的意思
6、检查文件是否存在使用 -f 或 !-f 操作符
7、检查目录是否存在使用-d或!-d操作符
8、检查文件,目录或符号连接是否存在使用-e或!-e操作符
9、检查文件是否可执行使用-x或!-x操作符
10、正则表达式的部分匹配可以使用括号,匹配的部分在后面可以用$1~$9变量代替,这些和apache一致。
例子:
编辑 /usr/local/nginx/conf/nginx.conf 文件
#vi /usr/local/nginx/conf/nginx.conf
设置upstream服务器:
upstream myproxybackend {
server 192.168.1.1;
server 192.168.1.2;
server 192.168.1.3;
server 192.168.1.4;
}
upstream msiebackend {
server 192.168.1.6;
}
upstream mozillabackend {
server 192.168.1.5;
}
更新虚拟主机配置文件
server {
access_log logs/access.log;
error_log logs/error.log;
index index.html;
listen 202.54.1.5:80 default;
root /usr/local/nginx/html;
server_name example.com www.example.com 0.example.com;
## PROXY - Web
location / {
proxy_pass http://myproxybackend;
if ($http_user_agent ~ MSIE ) {
proxy_pass http://msiebackend;
}
if ($http_user_agent ~ Mozilla ) {
proxy_pass http://mozillabackend;
}
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
# many more...
# many more...
}
最后重启/重新载入nginx
#/usr/local/nginx/sbin/nginx -s reload
转
nginx | 评论:0
| Trackbacks:0
| 阅读:831
Submitted by admin on 2011, July 17, 7:29 PM
对于后端是同一端口多域名转发的nginx proxy。在nginx中的默认proxy是只能对后面real server做端口转发的,而不能做域名转发。
这个是因为默认
1 |
proxy_set_header Host $proxy_host; |
这样就等于前端输入域名后到nginx这里直接转换成IP进行转发了。
于是我们需要修改proxy_set_header的参数
1 |
proxy_set_header Host $http_host; |
例如下面一个举例。下面这个例子中backend1权重为5,其他默认为1,最大失效次数3次,如果30秒内没有响应就认为是失效了。
02 |
server backend 1 .test.com weight= 5 ; |
03 |
server backend 2 .test.com: 8080 max_fails= 3 fail_timeout= 30 s; |
04 |
server unix:/tmp/test 3 ; |
08 |
server_name lb.test.com; |
12 |
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
13 |
proxy_set_header X-Real-IP $remote_addr; |
14 |
proxy_set_header Host $http_host; |
nginx | 评论:0
| Trackbacks:0
| 阅读:1854