Tag: gentoo
使用gitosis来配置管理git服务器端
by Elton on 七.21, 2009, under Linux
1. 安装git
1 | emerge -av dev-util/git |
2.安装gitosis
git环境默认是可以直接使用的,但需要为每个成员开ssh权限帐号,且各个仓库之间的交叉权限管理很麻烦,所以需要使用gitosis, 它无需为每个开发人员开设ssh帐号,安全方便。
1 | emerge -av gitosis |
如果提示这个包被mask了,需要编辑/etc/portage/package.keywords文件,在里面加入
1 | dev-util/gitosis ~amd64 |
3.生成公钥
在客户端使用
1 | ssh-keygen -t rsa |
来生成ssh的key,注意你的主机名需要是全部英文字符,不能有下划线或者.之类的特殊字符,否则后面在服务端生成版本库的时候会报错。
4.上传公钥
从客户端把刚刚生成的公钥上传到服务器上。
1 | scp ~/.ssh/id_rsa.pub USER@YOUR_SERVER:/tmp |
5.在服务端生成管理库
1 | sudo -H -u git gitosis-init < /tmp/id_rsa.pub |
成功的话,你将看到类似下面的提示:
1 2 | Initialized empty Git repository in /var/spool/gitosis/repositories/gitosis-admin.git/ Reinitialized existing Git repository in /var/spool/gitosis/repositories/gitosis-admin.git/ |
设置post-update脚本权限
1 | chmod 755 /var/spool/gitosis/repositories/gitosis-admin.git/hooks/post-update |
至此,服务端配置已经完成。
6.同步配置文件
gitosis本身就是一个git库,所以管理起来非常方便。下面在客户端同步gitosis管理库
1 2 | git clone git@YOUR_SERVER:gitosis-admin.git cd gitosis-admin |
你将看到以下文件
1 2 | -rw-r--r-- 1 garry garry 104 Nov 13 05:43 gitosis.conf drwxr-xr-x 3 garry garry 102 Nov 13 05:43 keydir/ |
gitosis.conf是gitosis的配置文件,用于配置用户和权限
keydir/是所有组成员的公钥
我们可以在本地修改配置更改权限,然后push到服务端后,服务器端就立刻生效
7.创建新的repositories
打开gitosis.conf文件,你将看到
1 2 3 | [group gitosis-admin] writable = gitosis-admin members = elton@macbook |
这个是管理组的权限,members中的用户名就是刚才上传的公钥里面的用户名。
在这个文件后面加入:
1 2 3 | [group myteam] members = elton@macbook writable = free_monkey |
这里你定义了一个叫myteam的组,授予elton@macbook这个用户写“free_monkey”这个repo的权限
1 2 | git commit -a -m "Allow elton write access to free_monkey" git push |
上面的操作就更新了服务端的权限。
下面就开始创建free_monkey的repo
1 2 3 | mkdir free_monkey cd free_monkey git init |
创建 .gitignore 文件,用于忽略某些不需要进行代码管理的内容,如rails的应用可能如下:
1 2 3 4 5 | .DS_Store log/*.log tmp/**/* config/database.yml db/*.sqlite3 |
提交代码:
1 2 3 4 5 | git remote add origin git@YOUR_SERVER_HOSTNAME:free_monkey.git git add . git commit -a -m "initial import" git push origin master:refs/heads/master |
接下来,可以增加成员的公钥到系统中了
1 2 3 4 | cd gitosis-admin cp ~/alice.pub keydir/ cp ~/bob.pub keydir/ git add keydir/alice.pub keydir/bob.pub |
修改gitosis.conf
1 2 3 4 | [group myteam] - members = jdoe + members = jdoe alice bob writable = free_monkey |
提交修改:
1 2 | git commit -a -m "Granted Alice and Bob commit rights to FreeMonkey" git push |
其它成员就可以获取代码了
1 | git clone git@YOUR_SERVER:free_monkey.git |
Gentoo下Nginx+thin构建rails环境
by Elton on 七.21, 2009, under Linux, Rails
本文前提是你已经配置好了ruby on rails
安装thin
thin是一个ruby的轻量级的web server
可以看到thin在100个并发连接的时候,性能还是不错的。
可以使用
1 | sudo gem install thin |
或者
1 | emerage -av thin |
使用emerage的话,需要在/etc/portage/package.keywords中加入
1 2 3 | www-servers/thin ~amd64 dev-ruby/eventmachine ~amd64 dev-ruby/rack ~amd64 |
因为相关的包被gentoo的portage给mask了
创建thin集群rake脚本
进入你的rails应用目录,在lib/tasks下建立一个thin的任务,以.rake为后缀名,如thin.rake。这个是用来建立thin的集群的脚本
编辑内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | namespace :thin do namespace :cluster do desc 'Start thin cluster' task :start => :environment do `cd #{RAILS_ROOT}` port_range = RAILS_ENV == 'development' ? 3 : 8 (ENV['SIZE'] ? ENV['SIZE'].to_i : 4).times do |i| Thread.new do port = ENV['PORT'] ? ENV['PORT'].to_i + i : ("#{port_range}%03d" % i) str = "thin start -d -p#{port} -Ptmp/pids/thin-#{port}.pid" str += " -e#{RAILS_ENV}" puts str puts "Starting server on port #{port}..." `#{str}` end end end desc 'Stop all thin clusters' task :stop => :environment do `cd #{RAILS_ROOT}` Dir.new("#{RAILS_ROOT}/tmp/pids").each do |file| Thread.new do if file.starts_with?("thin-") str = "thin stop -Ptmp/pids/#{file}" puts "Stopping server on port #{file[/d+/]}..." `#{str}` end end end end end end |
之后就可以使用
1 2 | # rake thin:cluster:start RAILS_ENV=production SIZE=3 PORT=8000 # rake thin:cluster:stop |
来启动和停止thin集群了。
编辑nginx的conf文件,加入rails虚拟主机
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | upstream thin { server 127.0.0.1:8000; server 127.0.0.1:8001; server 127.0.0.1:8002; } server { listen 80; server_name localhost; access_log /var/log/nginx/localhost.access.log; root /var/www/test/public; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect false; if (-f $request_filename/index.html) { rewrite (.*) $1/index.html break; } if (-f $request_filename.html) { rewrite (.*) $1.html break; } if (!-f $request_filename) { proxy_pass http://thin; break; } } } |
重启nginx就可以运行rails应用了。
参考:
http://code.macournoyer.com/thin/
http://glauche.de/2008/01/12/thin-nginx-with-rails/
Gentoo安装SNMP & MRTG 本机监控
by Elton on 七.20, 2009, under Linux
必要组件:
- [net-analyzer/net-snmp]
- [media-libs/gd]
- [net-analyzer/mrtg]
- [sys-process/vixie-cron]
0) 切换用户
1 | /bin/su - |
1) 创建目录
1 2 3 | /usr/bin/mkdir /etc/mrtg /usr/bin/mkdir /etc/cron.mrtg /usr/bin/mkdir /var/www/localhost/mrtg |
2) 创建snmpd.conf文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | vim /etc/snmp/snmpd.conf com2sec local 127.0.0.1/32 public com2sec local 10.10.10.0/24 public group MyROGroup v1 local group MyROGroup v2c local group MyROGroup usm local view all included .1 80 access MyROGroup "" any noauth exact all none none syslocation MyLocation syscontact Me <me@somewhere.org> |
编辑 /etc/conf.d/snmpd 在SNMPD_FLAGS里面添加
1 | -c /etc/snmp/snmpd.conf |
如:SNMPD_FLAGS=”-c /etc/snmp/snmpd.conf”
3) 创建守护进程
1 2 | /etc/init.d/snmpd start /sbin/rc-update add snmpd default |
4) 配置
Traffic:
1 2 3 4 5 6 7 | /usr/bin/cfgmaker --output=/etc/mrtg/traffic.cfg --ifdesc=ip --ifref=descr --global "WorkDir: /var/www/localhost/mrtg" --global "Options[_]: bits,growright" public@localhost |
Cpu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | vim /etc/mrtg/cpu.cfg WorkDir: /var/www/localhost/mrtg LoadMIBs: /usr/share/snmp/mibs/UCD-SNMP-MIB.txt Target[localhost.cpu]:ssCpuRawUser.0&ssCpuRawUser.0:public@localhost + ssCpuRawSystem.0&ssCpuRawSystem.0:public@localhost + ssCpuRawNice.0&ssCpuRawNice.0:public@localhost RouterUptime[localhost.cpu]: public@localhost MaxBytes[localhost.cpu]: 100 Title[localhost.cpu]: CPU Load PageTop[localhost.cpu]: <H1>Active CPU Load %</H1> Unscaled[localhost.cpu]: ymwd ShortLegend[localhost.cpu]: % YLegend[localhost.cpu]: CPU Utilization Legend1[localhost.cpu]: Active CPU in % (Load) Legend2[localhost.cpu]: Legend3[localhost.cpu]: Legend4[localhost.cpu]: LegendI[localhost.cpu]: Active LegendO[localhost.cpu]: Options[localhost.cpu]: growright,nopercent |
Mem:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | vim /etc/mrtg/mem.cfg LoadMIBs: /usr/share/snmp/mibs/HOST-RESOURCES-MIB.txt Target[localhost.mem]: .1.3.6.1.4.1.2021.4.11.0&.1.3.6.1.4.1.2021.4.11.0:public@localhost PageTop[localhost.mem]: <H1>Free Memory </H1> WorkDir: /var/www/localhost/mrtg Options[localhost.mem]: nopercent,growright,gauge,noinfo Title[localhost.mem]: Free Memory MaxBytes[localhost.mem]: 1000000 kMG[localhost.mem]: k,M,G,T,P,X YLegend[localhost.mem]: bytes ShortLegend[localhost.mem]: bytes LegendI[localhost.mem]: Free Memory: LegendO[localhost.mem]: Legend1[localhost.mem]: Free memory, not including swap, in bytes |
Swap:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | vim /etc/mrtg/swap.cfg LoadMIBs: /usr/share/snmp/mibs/UCD-SNMP-MIB.txt Target[localhost.swap]: memAvailSwap.0&memAvailSwap.0:public@localhost PageTop[localhost.swap]: <H1>Swap Memory</H1> WorkDir: /var/www/localhost/mrtg Options[localhost.swap]: nopercent,growright,gauge,noinfo Title[localhost.swap]: Free Memory MaxBytes[localhost.swap]: 1000000 kMG[localhost.swap]: k,M,G,T,P,X YLegend[localhost.swap]: bytes ShortLegend[localhost.swap]: bytes LegendI[localhost.swap]: Free Memory: LegendO[localhost.swap]: Legend1[localhost.swap]: Swap memory avail, in bytes |
Ping:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | vim /etc/mrtg/ping.cfg WorkDir: /var/www/localhost/mrtg Title[mithril.ping]: Round Trip Time PageTop[mithril.ping]: <H1>Round Trip Time</H1> Target[mithril.ping]: `/etc/mrtg/ping.sh` MaxBytes[mithril.ping]: 2000 Options[mithril.ping]: growright,unknaszero,nopercent,gauge LegendI[mithril.ping]: Pkt loss % LegendO[mithril.ping]: Avg RTT Legend1[mithril.ping]: Maximum Round Trip Time in ms Legend2[mithril.ping]: Minimum Round Trip Time in ms #Legend3[mithril.ping]: Maximal 5 Minute Maximum Round Trip Time in ms #Legend4[mithril.ping]: Maximal 5 Minute Minimum Round Trip Time in ms YLegend[mithril.ping]: RTT (ms) |
5) 创建脚本
Traffic:
1 2 3 | vim /etc/cron.mrtg/traffic.sh #!/bin/sh /usr/bin/mrtg /etc/mrtg/traffic.cfg |
Cpu:
1 2 3 | vim /etc/cron.mrtg/cpu.sh #!/bin/sh /usr/bin/mrtg /etc/mrtg/cpu.cfg |
Mem:
1 2 3 | vim /etc/cron.mrtg/mem.sh #!/bin/sh /usr/bin/mrtg /etc/mrtg/mem.cfg |
Swap:
1 2 3 | vim /etc/cron.mrtg/swap.sh #!/bin/sh /usr/bin/mrtg /etc/mrtg/swap.cfg |
Ping:
1 2 3 | vim /etc/cron.mrtg/ping.sh #!/bin/sh /usr/bin/mrtg /etc/mrtg/ping.cfg |
ping.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | vim /etc/mrtg/ping.sh #!/bin/sh PING="/bin/ping" # Google, for example ADDR="google.com" DATA=`$PING -c10 -s500 $ADDR -q ` LOSS=`echo $DATA | awk '{print $18 }' | tr -d %` echo $LOSS if [ $LOSS = 100 ]; then echo 0 else echo $DATA | awk -F/ '{print $5 }' fi |
赋予脚本可执行权限
1 2 | /bin/chmod +x /etc/cron.mrtg/*.sh /bin/chmod +x /etc/mrtg/ping.sh |
下面的每个脚本执行3次,不必理会warning
1 2 3 4 5 | /etc/cron.mrtg/traffic.sh /etc/cron.mrtg/cpu.sh /etc/cron.mrtg/mem.sh /etc/cron.mrtg/swap.sh /etc/cron.mrtg/ping.sh |
6) 创建MRTG首页
1 2 3 4 5 6 7 8 9 | /usr/bin/indexmaker --output=/var/www/localhost/mrtg/index.html --title="Power Under Control : )" --sort=name --enumerate /etc/mrtg/traffic.cfg /etc/mrtg/cpu.cfg /etc/mrtg/mem.cfg /etc/mrtg/swap.cfg /etc/mrtg/ping.cfg |
7) 计划任务
每5分钟执行一次数据更新
1 2 | usr/bin/crontab -e */5 * * * * /bin/run-parts /etc/cron.mrtg 1> /dev/null |
现在就有一个html文件生成好了/var/www/localhost/www/index.html
将你的web服务器设置好,打开流量器就可以看到统计数据了。
Gentoo下安装Nginx+php
by Elton on 七.19, 2009, under Linux, PHP
使用nginx(engin x)和spawn-fcgi来共同支持php
安装nginx
1 | emerge -av nginx |
安装spawn-fcgi
1 | emerge -av spawn-fcgi |
启动spawn-fcgi
1 | spawn-fcgi -a 127.0.0.1 -p 9000 -f /usr/bin/php-cgi -C 10 |
a 表示绑定的ip地址
p 表示端口号
f 表示fcgi的应用程序,在这里是制定php的cgi版本的程序
C 表示spawn的child的个数
执行netstat检查spwan-fcgi是否正常启动,可以看到9000端口是否已经开始监听
1 | netstat -tnpl |
配置nginx
编辑nginx.conf文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | user nginx nginx; worker_processes 8; worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; error_log /var/log/nginx/error_log info; #Specifies the value for maximum file descriptors that can be opened by this process. worker_rlimit_nofile 51200; events { worker_connections 8192; use epoll; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$gzip_ratio"'; client_header_timeout 10m; client_body_timeout 10m; client_max_body_size 50m; #最大允许上传50M的附件 send_timeout 10m; connection_pool_size 512; client_header_buffer_size 8k; large_client_header_buffers 4 4k; request_pool_size 1024k; gzip on; gzip_min_length 1k; gzip_buffers 4 8k; gzip_http_version 1.1; gzip_types text/plain application/x-javascript text/css application/xml; output_buffers 1 1024k; postpone_output 1460; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 75 20; ignore_invalid_headers on; index index.html; include /data/www/vhosts/*.conf; |
其中,worker_processes表示worker进程的个数,一般跟CPU个数相同
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
表示每个CPU处理一个worker
虚拟主机配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | server { index index.htm index.html index.php server_name blog.domain.com; access_log /var/log/nginx/domain.access_log main; error_log /var/log/nginx/domain.error_log info; root /data/www/domain/htdocs/blog; location / { 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; } } location ~ .*.php$ { include /etc/nginx/fastcgi_params; fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~ .(htm|html|gif|jpg|jpeg|png|bmp|ico|css|js)$ { expires 30d; } } |
上面的配置以wordpress的静态url为例
其中,location ~ .*.php$ 部分是配置php的fcgi
expires,是设置静态资源的缓存时间
rewrite部分是设置wordpress静态url时候需要用到的rewrite
Nginx日常维护
Nginx 支持下表中的信号:
信号名 作用描述
TERM, INT 快速关闭程序,中止当前正在处理的请求
QUIT 处理完当前请求后,关闭程序
HUP 重新加载配置,并开启新的工作进程,关闭就的进程,此操作不会中断请求
USR1 重新打开日志文件,用于切换日志,例如每天生成一个新的日志文件
USR2 平滑升级可执行程序
WINCH 从容关闭工作进程
如要重新加载配置文件就使用如下命令
1 | #kill -HUP <pid> |
pid是nginx的进称号,通过netstat -tnpl可以查到
Nginx 监控
通过在配置文件中加入:
1 2 3 4 | location ~ ^/status/ { stub_status on; #Nginx 状态监控配置 access_log off; } |
就可以使用http://yourdomain.com/stauts监控nginx的状态。
可以看到类似这样的信息
1 2 3 4 | Active connections: 70 server accepts handled requests 14553819 14553819 19239266 Reading: 0 Writing: 3 Waiting: 67 |
- active connections – 当前 Nginx 正处理的活动连接数.
- server accepts handled requests — 总共处理了 14553819 个连接 , 成功创建 14553819 次握手 ( 证明中间没有失败的 ), 总共处理了 19239266 个请求 ( 平均每次握手处理了 1.3 个数据请求 )
- reading — nginx 读取到客户端的 Header 信息数
- writing — nginx 返回给客户端的 Header 信息数。
- waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading + writing),意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。
参考:
http://www.ibm.com/developerworks/cn/web/wa-lo-nginx/index.html
http://wiki.nginx.org/NginxChs
http://blog.chinaunix.net/u/12909/showart_1831422.html
Gentoo下的ARP防御
by Elton on 七.17, 2009, under Linux
arp问题由来
arp是困扰很多人的问题, 利用arp协议的漏洞,别人可以很容易的在你的页面上挂上木马。简单的说,arp攻击就是利用arp自身的漏洞,欺骗你的机器访问虚假的网关,在那个虚假的网关上被植入木马代码的行为。 前两天Pett留言说他访问我的博客发现有病毒,虽然我没能重现他所反应的问题。 但是我想八九不离十应该是机房局域网中的arp攻击所致。
arp问题解决方案
解决arp问题目前比较常见的做法就是双向绑定你服务器的网卡和机房交换机的网卡。 跟机房联系过绑定网卡的事情,居然说要收费,NND基本的服务都要收费。 没办法,我先自己绑定机房交换机的网卡吧。 可以在一定程度避免收到arp的影响。
假设机房网关的ip是192.168.1.1
1 2 3 | # arp Address HWtype HWaddress Flags Mask Iface 192.168.1.1 ether 00:12:f2:09:17:20 C eth0 |
可以看到,返回了机房网关的ip地址和mac地址。 C表示arp对这些信息进行了缓存。
如果发现可疑的设备可以使用arp -d来删除它。
绑定网关mac地址
1 2 | echo "192.168.1.1 00:12:f2:09:17:20">/etc/macbind arp -f /etc/macbind |
执行好上面的命令后,在使用arp命令查看的时候,你会发现如下信息:
1 2 3 | # arp Address HWtype HWaddress Flags Mask Iface 192.168.1.1 ether 00:12:f2:09:17:20 CM eth0 |
这回多了个M,表示已经静态化mac地址绑定了。
这样就完成了你的服务器到机房网关的单项mac绑定。
在wordpress上配置memcached
by Elton on 七.13, 2009, under Linux
Memcached 是一种高性能的分布式内存对象缓存系统。在动态应用,Memcached 既能提高访问的速度,同时还减低了数据库的负载。
如果想在wordpress上使用memcache,需要按照如下步骤来做(以gentoo为例)
1. 安装memcached
1 | emerge -av net-misc/memcached |
2. 安装php的memcached扩展
因为dev-php5/pecl-memcache被gentoo mask了,所以需要先修改/etc/portage/package.keywords,添加:
1 | emerge -av dev-php5/pecl-memcache |
3. 下载wordpress的memcached插件
http://dev.wp-plugins.org/browser/memcached/trunk
可以通过 SVN 工具去获取,SVN 地址为:
http://svn.wp-plugins.org/memcached/trunk/
4. 启动memcached
1 | memcached -d -m 512 -u root -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid |
-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是512MB,
-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址127.0.0.1,
-p是设置Memcache监听的端口,我这里设置了11211,最好是1024以上的端口,
-c选项是最大运行的并发连接数,默认是1024,
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid
如果要结束Memcache进程,执行:
1 | # kill `cat /tmp/memcached.pid` |
如果想查看memcache的状态,可以使用如下命令
1 2 3 4 5 6 | memcached-tool 10.0.0.5:11211 display # shows slabs memcached-tool 10.0.0.5:11211 # same. (default is display) memcached-tool 10.0.0.5:11211 stats # shows general stats memcached-tool 10.0.0.5:11211 dump # dumps keys and values memcached-tool 10.0.0.5:11211 move 7 9 # takes 1MB slab from class #7 # to class #9. |
5. 上传object-cache.php到wp-content目录后,就可以完成设置了。 看看是不是你的wordpress快了很多
Gentoo 网络配置
by Elton on 七.09, 2009, under Linux
1. 配置ip
/etc/conf.d/net
DHCP 动态获取
1 | config_eth0=( "dhcp" ) |
固定IP
1 2 3 4 | config_eth0=( "192.168.0.2 netmask 255.255.255.0 brd 192.168.0.255" ) 或者 config_eth0=( "192.168.0.2/24 brd 192.168.0.255" ) routes_eth0=( "default via 192.168.0.1" ) |
2. DNS设置
/etc/resolv.conf
1 | nameserver 202.96.209.5 202.96.209.133 |
3. 重启网卡
1 | /etc/init.d/net.eth0 start | stop | restart |
4. 配置防火墙 iptables
# stop iptables services
/etc/init.d/iptables stop
# disable all chains
iptables -F
iptables -t nat -F
iptables -t mangle -F
# allow ssh
iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp –dport 80 -j ACCEPT
# allow old connection and deny new connection
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i eth0 -m state –state NEW,INVALID -j DROP
# allow all localhost
iptables -A INPUT -i lo -j ACCEPT
# define default policy
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
# save
/etc/init.d/iptables save
/etc/init.d/iptables restart
#加入自动启动任务,使iptables自动启动
rc-update add iptables default
如何删除一条规则?比如删除80端口,让外面无法访问。
iptables -D INPUT -i eth0 -p tcp –dport 80 -j ACCEPT
如何再添加?
iptables -I INPUT -i eth0 -p tcp –dport 80 -j ACCEPT
最后别忘记用
/etc/init.d/iptables save
/etc/init.d/iptables restart
这两个命令保存并重启
针对Intel Core i7优化安装Gentoo
by Elton on 七.08, 2009, under Linux
要让Core i7处理器在gentoo里工作得正常需要从3个方面来设置。下面我一一来说明。
1. CFlag
Core i7的信息
vendor_id : GenuineIntel
cpu family : 6
model : 26
model name : Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz
/etc/make.conf内容
1 2 3 | CHOST="x86_64-pc-linux-gnu" CFLAGS="-march=core2 -msse4 -mcx16 -msahf -O2 -pipe" CXXFLAGS="${CFLAGS}" |
2, Kernel Setup
1 2 3 4 5 6 7 8 | Processor type and features ---> Subarchitecture Type () ---> (X) PC-compatible Processor family () ---> (X) Pentium M [ ] Generic x86 support [*] Supported processor vendors ----> [*] Support Intel processors |
填写你的CPU核数
1 2 3 4 5 | Processor type and features ---> [*] Symmetric multi-processing support (8) Maximum number of CPUs (2-256) [ ] SMT (Hyperthreading) scheduler support [*] Multi-core scheduler support |
支持64位CPU
1 2 3 4 5 | Processor type and features ---> -- Machine check support [*] Intel MCE features Executable file formats / Emulations ---> [*] IA32 Emulation |
3. Hardware Sensors
增加硬件监控
1 2 3 4 | Device Drivers ---> Hardware Monitoring support ---> <m> Hardware Monitoring support <m> Intel Core (2) Duo/Solo temperature sensor |
Gentoo emerge 使用方法
by Elton on 七.08, 2009, under Linux
使用emerge可以管理Portage中的软件甚至整个系统。
当我们谈到(软件)包的时候,我们通常指的是Portage树为Gentoo用户提供的包的名称。Portage树是ebuilds文件的集合,这些文件包含了Portage管理工具维护软件(安装,搜索,查询, …)时所需要的所有信息,并被默认的放置在/usr/portage目录中。
每当您要求Portage对系统中的软件包执行一些操作的时候,它会以系统中的ebuilds文件作为基础。因此您最好定期更新系统Portage树中的ebuild文件,这样Portage才知道新加入了哪些软件,哪些软件发布了安全更新,等等。
更新Portage树
1 | # emerge --sync |
更新系统
1 | # emerge --update --deep --newuse world |
–update(-u)表示更新
–deep(-D)表示更新关联包
Portage会查找您已经安装的软件包是否有更新版本,但它只会核对那些您已经明确地安装过的软件包(也就是在/var/lib/portage/world文件中列出的包),并不会完整去的检查与这些软件产生依赖关系的包是否也需要更新。如果您想更新系统中的每个软件包,那就加上–deep参数
–newuse 如果USE变量的值变了,就要使用这个参数,通知系统USE参数有变化
移除依赖包
如果仅仅移除了一个包,而未将其依赖的包移除,使用emerge –depclean命令来移除依赖包。
1 2 3 | # emerge --update --deep --newuse world # emerge --depclean # revdep-rebuild |
在使用emerge –depclean前,确保系统完全更新过。
revdep-rebuild工具由gentoolkit包提供;使用前别忘了首先emerge它:
1 | # emerge gentoolkit |
升级系统完整步骤
1 2 3 4 | 1. emerge --sync 2. emerge -vauD --newuse world 3. emerge –depclean 4. revdep-rebuild |
通过名称查找软件
1 | # emerge --search softname |
通过软件描述查找软件
1 | # emerge --searchdesc pdf |
安装软件
1 | # emerge gnumeric |
假装安装软件
1 2 3 | # emerge --pretend gnumeric 或 # emerge -p gnumeric |
移除软件
1 | # emerge --unmerge gnumeric |
全面world更新的时候,不想更新某些包
将你不想更新的包的名字加入到/etc/portage/package.mask中。
如你不想升级最新的nginx则加入
1 | www-servers/nginx |
设置某些包的USE属性
如果你想针对某些包设置他们的USE属性,而不是改变全局USE属性,则修改/etc/portage/package.use文件,如:
1 2 3 4 | >=www-servers/nginx-0.7.6 random-index addition fastcgi flv imap pcre perl ssl status sub webdav zlib >=dev-lang/ruby-1.8.7 dev-db/mysql innodb berkdb dev-lang/php fpm berkdb bzip2 cli crypt gdbm iconv ipv6 ncurses nls pcre readline reflection session spl ssl unicode zlib curl exif gd json mysql pdo threads xml zip |
使用最新的测试包
默认gentoo都是用稳定版的包,如果你想使用最新版本的软件,只要在/etc/portage/package.keywords文件中,对应的包后加入~就可以了。如:
1 2 3 4 5 6 | www-servers/lighttpd ~amd64 www-servers/nginx ~amd64 dev-lang/php ~amd64 dev-db/mysql ~amd64 sys-devel/gcc ~amd64 dev-lang/ruby ~amd64 |
~amd64表明你更新的是64位版本的,如果是x86版本的,使用~x86就可以了。
安装支持ext4文件系统的Gentoo
by Elton on 七.02, 2009, under Linux
ext4出来了,但是gentoo官方文档并没有具体介绍如何安装带ext4支持的gentoo。 昨天试了一下,记录下来:
1. 事前准备
1a. 设置root密码
# passwd
New password: (输入新密码)
Re-enter password: (再次输入密码)
1b. 启动ssh
/etc/init.d/sshd start
1c. 网络准备
如果启动的时候,发现没有eth0网卡,可能是没有获得到ip地址,而不是网卡没有找到。
输入
# dhcpcd eth0
重新获得ip地址就可以看到网卡找到了
2. 预备磁盘
2a. fdisk分区
# fdisk /dev/sda
常用命令:p 显示当前分区, n 创建新分区
创建boot分区
n创建分区
p选择主分区类型
从第一个柱面开始
+32M 设定boot分区大小为32M
a 建立启动标记
1 选择第一个分区即boot分区为启动分区
如果你再次按p键,你就会注意到,在“Boot”那一列有个*
我们需要把这个分区设置成可启动的。键入a来给分区添加启动标志,然后键入1。如果你再次按p键,你就会注意到,在“Boot”那一列有个*
创建交换分区
方式跟创建boot分区一样
t 更改分区类型为swap, 输入82
保存分区布局
键入w来保存分区布局并退出fdisk。
分区的例子
Device Boot Start End Blocks Id System
/dev/sda1 * 1 5 40131 83 Linux
/dev/sda2 6 6533 52436160 83 Linux
/dev/sda3 6534 8101 12594960 82 Linux swap / Solaris
/dev/sda4 8102 38913 247497390 5 Extended
/dev/sda5 8102 14629 52436128+ 83 Linux
/dev/sda6 14630 38913 195061198+ 83 Linux
sda1 /boot 32M
sda2 / 50G
sda3 swap 12G
sda5 /usr 50G
sda6 /data 184G
2b. 创建文件系统
格式化分区
将sda1格式化为ext3,其余格式化为ext4
# mke2fs -j /dev/sda1
# mkfs.ext4 /dev/sda2
# mkfs.ext4 /dev/sda5
# mkfs.ext4 /dev/sda6
激活交换分区
创建交换分区标志
# mkswap /dev/sda3
激活交换分区
# swapon /dev/sda3
2c.挂载
# mount /dev/sda2 /mnt/gentoo
# mkdir /mnt/gentoo/boot
# mount /dev/sda1 /mnt/gentoo/boot
如果独立创建/usr分区(emerage 的下载的文件都保存在/usr/src下,所以建议独立分区),则执行
# mkdir /mnt/gentoo/usr
# mount /dev/sda5 /mnt/gentoo/usr
3.安装Gentoo安装文件
3a.安装一个Stage Tarball
解开stage
# cd mnt/gentoo
# tar xvjpf stage3-*.tar.bz2
p表示保留权限
3b. 安装Portage
从网上下载和安装Portage快照
# cd /mnt/gentoo
# links http://www.gentoo.org/main/en/mirrors.xml
选择一个离你最近的镜像,打开snapshots/目录。然后选择最新的Portage快照(portage-latest.tar.bz2)并按D来下载它。
现在按Q来退出浏览器。你现在已经有一个Portage快照保存在/mnt/gentoo里了。
校验Portage快照的完整性
# md5sum -c portage-latest.tar.bz2.md5sum
portage-latest.tar.bz2: OK
解开Portage快照
# tar xvjf /mnt/gentoo/portage-latest.tar.bz2 -C /mnt/gentoo/usr
3c.配置编译选项
# nano -w /mnt/gentoo/etc/make.conf
CHOST 不需要更改
其他的根据你的机器的配置来,如:
CFLAGS=”-march=core2 -mfpmath=sse,387 -O2 -pipe -fomit-frame-pointer -mmmx -msse -msse2 -msse3″
CXXFLAGS=”${CFLAGS}”
LDFLAGS=”-Wl,-O2″
-march和mtune具体参数的含义参见:http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options
4. 安装Gentoo基本系统
4a.chroot
选择境像站点
# mirrorselect -i -o >> /mnt/gentoo/etc/make.conf
拷贝DNS信息
# cp -L /etc/resolv.conf /mnt/gentoo/etc/
挂载/proc和/dev文件系统
# mount -t proc none /mnt/gentoo/proc
# mount -o bind /dev /mnt/gentoo/dev
进入新的系统环境
# chroot /mnt/gentoo /bin/bash
# env-update
>> Regenerating /etc/ld.so.cache…
# source /etc/profile
# export PS1=”(chroot) $PS1″
4b. 配置Portage
更新Portage树
# emerge –sync
配置USE变量
nano -w /etc/make.conf
配置Locales
nano -w /etc/locale.gen
添加zh_CN.UTF-8 UTF-8
运行
#locale-gen
生成local.gen文件
5. 配置内核
5.a. 时区
cp /usr/share/zoneinfo/PRC /etc/localtime
设置PRC为当前时区
5.b. 安装源码
emerge gentoo-sources
gentoo-sources 为一般用途,只打了一般的安全补丁
hardened-sources 服务器用途, 安全性和稳定性有所提高
5.c. 手动配置内核
安装工具
emerge pciutils
用lspci检查当前系统配置
配置内核
# cd /usr/src/linux
# make menuconfig
根据你的硬件和你的需要选择对应的选项,主要就是网卡和文件系统两方面
因为要支持ext4,特别注意file system中有关ext4的设置。把相关内容都选上
编译内核
之后,使用make && make modules_install来编译内核
安装内核
编译后,执行下面命令来安装内核
cp arch/x86_64/boot/bzImage /boot/kernel-2.6.29-gentoo-r5
其中kernel-2.6.28-gentoo-r9根据你使用的内核和版本来定。 在/usr/src里面可以看到你之前下载的linux内核源码,可以查看到版本号
6. 配置系统
6.a. 文件系统信息
创建/etc/fstab
/etc/fstab使用一种特殊语法格式。每行都包含六个字段。这些字段之间由空白键(空格键,tab键,或者两者混合使用)分隔。每个字段都有自己的含意:
• 第一个字段是对分区的描述,也就是设备文件的路径
• 第二个字段是分区挂载点,也就是分区应该挂载到的地方
• 第三个字段给出分区所用的文件系统
• 第四个字段给出的是挂载分区时mount命令所用的挂载选项。由于每个文件系统都有自己的挂载选项,我们建议你阅读mount手册(man mount)以获得所有挂载选项的列表。多个挂载选项之间是用逗号分隔的。
• 第五个字段是给dump使用的,用以决定这个分区是否需要dump。一般情况下,你可以把该字段设为0(零)。
• 第六个字段是给fsck使用的,用以决定系统非正常关机之后文件系统的检查顺序。根文件系统应该为1,而其它的应该为2(如果不需要文件系统自检的话可以设为0)
另外一个使用了ext4的例子
/dev/sda1 /boot ext3 noauto,noatime 1 2
/dev/sda2 / ext4 noatime 0 1
/dev/sda3 none swap sw 0 0
/dev/sda5 /usr ext4 noatime 0 2
/dev/sda6 /data ext4 noatime 0 2
/dev/cdrom /mnt/cdrom auto noauto,ro 0 0
auto选项可以使mount猜测文件系统(推荐对于可移动设备采用这个选项,因为它们可能采用很多不同的文件系统),而user选项使得非root用户可以挂载光驱。
为了提高性能,大部分用户会添加noatime挂载选项。由于不记录该分区中文件的访问时间(一般来说你并不需要知道它),这个选项能够提高系统速度。
6.b. 网络信息
设定主机名
# nano -w /etc/conf.d/hostname
配置你的网络
# nano -w /etc/conf.d/net
为了输入你自己的IP地址,子网掩码和网关,你需要设置config_eth0和routes_eth0:
手动为eth0设置IP信息
config_eth0=( “192.168.0.2 netmask 255.255.255.0 brd 192.168.0.255″ )
routes_eth0=( “default via 192.168.0.1″ )
如果你使用DHCP,请定义一下config_eth0:
config_eth0=( “dhcp” )
在启动时自动启用网络
# rc-update add net.eth0 default
6.c. 系统信息
设置root密码
# passwd
修改系统信息
# nano -w /etc/rc.conf
比如把默认的编辑器改为vi
设置键盘布局
# nano -w /etc/conf.d/keymaps
设置时钟选项
# nano -w /etc/conf.d/clock
如果你机器上的钟不用UTC,你需要在文件钟加上CLOCK=”local”。否则,你的时钟就有可能出现偏差。
7. 安装必要的系统工具
7.a. 系统日志工具
# emerge syslog-ng
# emerge logrotate
# rc-update add syslog-ng default
7.b. Cron守护进程
# emerge vixie-cron
# rc-update add vixie-cron default
7.c. 文件索引
# emerge slocate
7.e. 网络工具
安装一个DHCP客户端
# emerge dhcpcd
8. 配置引导程序
8a. 使用GRUB
安装GRUB
# emerge grub
尽管现在已经安装完GRUB,我们仍需要为其写一个配置文件,并将其安置到硬盘的主引导记录中,使它能自动引导您新创建的内核。您可以使用nano(或其他可用的编辑器)来创建配置文件/boot/grub/grub.conf:
# nano -w /boot/grub/grub.conf
例如
# 默认选择哪个列表来引导。0表示第一个, 1表示第二个,以此类推。
default 0
# 引导默认列表前等待多少秒
timeout 30
# 使用漂亮、“臃肿”的spalsh图像来增加一点趣味:)
# 如果您没有安装显卡,请将这行注释掉
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title Gentoo Linux 2.6.29-r5
# 内核镜像(或者操作系统)所在分区
root (hd0,0)
kernel /boot/kernel-2.6.29-gentoo-r5 root=/dev/sda2
# 如果使用ext4格式的分区,需要使用下面的参数
kernel /boot/kernel-2.6.29-gentoo-r5 root=/dev/sda2 rootfs=ext4
title Gentoo Linux 2.6.29-r5 (rescue)
# 内核镜像(或者操作系统)所在分区
root (hd0,0)
kernel /boot/kernel-2.6.29-gentoo-r5 root=/dev/sda2 init=/bin/bb
# 接下来的四行只有在您与Windows系统进行双启动的情况下才需要。
# 本例中,windows系统位于/dev/sda6。
title Windows XP
rootnoverify (hd0,5)
makeactive
chainloader +1
使用grub-install安装GRUB
为了安装GRUB,您将需要执行grub-install命令。尽管如此,当我们处于chroot的环境时,grub-install并不能正常的工作。我们还需要创建一个/etc/mtab,在里面列出所有已加载的文件系统。幸运的是,有一个简单的方法来完成这个任务——将/proc/mounts拷贝成/etc/mtab,如果您没有创建一个独立的boot分区,请排除rootfs行。下面的命令在两种情况下都可以正常工作:
# grep -v rootfs /proc/mounts > /etc/mtab
现在我们就可以用grub-install来安装GRUB了:
# grub-install –no-floppy /dev/sda
将ssh加入到启动进程
rc-update add sshd default
8b. 重启系统
# exit
cdimage ~# cd
cdimage ~# umount /mnt/gentoo/boot /mnt/gentoo/dev /mnt/gentoo/proc /mnt/gentoo
cdimage ~# reboot


