2012年4月30日月曜日

[基础知识] DNS 服务器

[LINUX 基础] TTY 与 PTS

$ ps auxwww
USER   PID %CPU %MEM  VSZ  RSS TTY   STAT START TIME COMMAND
go   23713  0.0  0.1 5704 1508 pts/0 Ss   07:33 0:00 -bash
go   23811  0.0  0.1 5704 1544 tty1  Ss+  07:35 0:00 -bash

TTY 列
根据 TTY 列的显示, 可以查看进程正在哪个终端下执行
1. pts/? 是软件虚拟出的终端设备, 如 ssh, telnet
$ tty
/dev/pts/0
$ ls /dev/pts/0
$ echo Hello World! > /dev/pts/0
Hello World!

2. tty? 是直接连在主机上的物理终端设备, 如键盘显示器
桌面到字符终端的切换: ctl + alt + F1 - F6 (F7 取消)
$ tty
/dev/tty1

2012年4月29日日曜日

[基础知识] 公钥与私钥

1. 非对称密钥密码系统
每个通信方均需要两个密钥, 即公钥和私钥, 这两把密钥可以互为加解密
公钥是公开的, 不需要保密, 而私钥是由个人自己持有, 并且必须妥善保管和注意保密

2. 公钥私钥的原则
一个公钥对应一个私钥
密钥对中, 让大家都知道的是公钥, 不告诉大家, 只有自己知道的是私钥
如果用其中一个密钥加密数据, 则只有对应的那个密钥才可以解密
如果用其中一个密钥可以进行解密数据, 则该数据必然是对应的那个密钥进行的加密

3. 基于公开密钥的加密过程 (数据传输, 公钥加密, 私钥解密)
比如有两个用户 A 和 B, A 想把一段明文通过双钥加密的技术发送给 B, B 有一对公钥和私钥, 那么加密解密的过程如下
3-1. B 将他的公钥传送给 A
3-2. A 用 B 的公开密钥加密她的消息, 然后传送给 B
3-3. B 用他的私人密钥解密 A 的消息

4. 基于公开密钥的认证过程 (SSH, 私钥加密, 公钥解密)
A 想让 B 知道自己是真实的 A, 而不是假冒的, 因此 A 只要使用公钥密码学对文件签名发送给 B, B 使用 A 的公钥对文件进行解密, 如果可以解密成功, 则证明 A 的私钥是正确的, 因而就完成了对 A 的身份鉴别, 整个身份认证的过程如下
4-1. A 用她的私人密钥对文件加密, 从而对文件签名
4-2. A 将签名的文件传送给 B
4-3. B 用 A 的公钥解密文件, 从而验证签名

[LINUX 基础] syslog

1. 配置文件
/etc/syslog.conf

配置文件中每行表示一个项目, 格式为: facility.level action
第一部分: 选择条件, 可以有一个或者多个条件, 用 ; 隔开
第二部分: 操作

1-1. 选择条件
选择条件本身分为两个字段, 用一个 . 分隔
前一字段是一项服务, 后一字段是一个优先级
是对消息类型的一种分类, 这种分类便于把不同类型的消息发送到不同的地方

常见 facility:
kern     内核信息
user     用户进程信息
mail     电子邮件相关信息
daemon   后台进程相关信息
authpriv 包括特权信息如用户名在内的认证活动
cron     计划任务信息
syslog   系统日志信息
lpr      打印服务相关信息
news     新闻组服务器信息
uucp     uucp 生成的信息
local0-local7 本地用户信息

1-2. 优先级
它代表消息的紧急程度, 按严重程度由低到高排序, 支持 * = ! 操作符
debug   不包含函数条件或问题的其他信息
info    提供信息的消息
none    没有重要级, 通常用于排错
notice  具有重要性的普通条件
warning 预警信息
err     阻止工具或某些子系统部分功能实现的错误条件
crit    阻止某些工具或子系统功能实现的错误条件
alert   需要立即被修改的条件
emerg   该系统不可用

1-3. 操作
日志信息可以分别记录到多个文件, 发送到命名管道, 其他程序甚至另一台机器

3-1. file 指定文件的绝对路径
3-2. terminal 或 pri 完全的串行或并行设备标志符
3-3. @host (@IP) 远程的日志服务器


2. 搭建 Linux 日志服务器
# 最好先配置好 DNS 和 NTP 服务

2-1. 服务器端
2-1-1. 编辑 /etc/sysconfig/syslog 文件, 让服务器能够接受客户端传来的数据
-SYSLOGD_OPTIONS="-m 0"
+SYSLOGD_OPTIONS="-r -x -m240" # 默认时间戳标记 --MARK--, 每 240 分钟出现一次, -m0 表示不出现

2-1-2. 重启 syslogd
# service syslog restart

2-1-3. 关闭 iptables, 或开启 514 端口

2-2. 配置各客户端
2-2-1. 配置 /etc/syslog.conf
修改客户机/etc/syslog.conf文件, 在有关配置行的操作动作部分用一个 "@" 字符指向日志服务器
*.* @IP (或主机名) => 客户端产生的所有的日志文件将在日志服务器的 /var/log/*.* 生成
authpriv.* @IP (或主机名)

2-2-2. 重启客户端 syslog 使设置生效
# service syslog restart

[LINUX 基础] Log Rotate

1. logrotate
1-1. 安装
$ rpm -qa | grep logrotate

1-2. 配置文件
/etc/logrotate.conf
/etc/logrotate.d => include 配置文件夹

主要参数
compress                 通过 gzip 压缩转储以后的日志
nocompress               不需要压缩时, 用这个参数
delaycompress + compress 转储的日志文件到下一次转储时才压缩
nodelaycompress          覆盖 delaycompress, 转储同时压缩
copytruncate             用于还在打开中的日志文件, 把当前日志备份并截断
nocopytruncate           备份日志文件但是不截断
create mode owner group  转储文件, 使用指定的文件模式创建新的日志文件
nocreate                 不建立新的日志文件
errors address           专储时的错误信息发送到指定的 Email 地址
mail address             把转储的日志文件发送到指定的 E-mail 地址
nomail                   转储时不发送日志文件
ifempty                  即使是空文件也转储, 缺省选项
notifempty               如果是空文件的话不转储
olddir directory         转储后的日志文件放入指定的目录, 必须和当前日志文件在同一个文件系统
noolddir                 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript      在转储以前需要执行的命令, 两个关键字必须单独成行
postrotate/endscript     在转储以后需要执行的命令, 两个关键字必须单独成行
daily                    指定转储周期为每天
weekly                   指定转储周期为每周
monthly                  指定转储周期为每月
rotate count             指定日志文件删除之前转储的次数, 0 指没有备份, 5 指保留 5 个备份
tabootext [+] list       让 logrotate 不转储指定扩展名的文件, 缺省的扩展名是 .rpm-orig, .rpmsave, v, ~
size size                当日志文件到达指定的大小时才转储, Size 可以指定 bytes (缺省)以及 KB (sizek)或者 MB (sizem)

1-3. 运行方式
$ logrotate /etc/logrotate.conf
重新读取配置文件, 并对符合条件的文件文件进行 rotate

$ logrotate -d /etc/logrotate.conf
调试模式, 输出调试结果, 但并不执行

$ logrotate -f /etc/logrotate.conf
强制模式, 对所有相关文件进行rotate

自定义 cron 来定时检查运行
$ cat /etc/cron.daily/logrotate

2. Apache rotatelogs

2-1. 1 天一次
$ some_program | /usr/sbin/rotatelogs /tmp/foo.log "86400" &

2-2. 10M 一次
$ some_program | /usr/sbin/rotatelogs /tmp/foo.log "10M" &

2012年4月24日火曜日

[PostgreSQL] pg_rman

http://code.google.com/p/pg-rman/
http://se-suganuma.blogspot.jp/2010/12/pgrmanpostgresql.html
http://d.hatena.ne.jp/interdb/20091210/1260410830
http://postgresql.g.hatena.ne.jp/pgsql/20091209
--

$ export BACKUP_PATH=/home/go/data/backup/pg9139


$ pg_rman backup -b full


备份时, 按指定规则删除过期或多余的备份

保留至前1天的最新的1个验证过的备份
$ pg_rman backup -b full --keep-data-generations=1 --keep-data-days=2
Start                   Status
================================
2012-04-25 10:03:08     OK <= 今天, 本次创建的备份
2012-04-24 10:02:28     OK <= 前一天, 保留
2012-04-24 09:00:00     OK <= 前一天, 保留
2012-04-24 07:01:10     OK <= 前一天, 删除

保留今天最新的1个备份, 其余全部删除
$ pg_rman backup -b full --keep-data-generations=1 --keep-data-days=0
Start                   Status
================================
2012-04-25 10:03:08     OK <= 今天, 本次创建的备份
2012-04-25 10:02:28     OK <= 今天, 保留
2012-04-24 09:00:00     OK <= 前一天, 删除


保留前1天最新的0个备份, 其余全部删除
1. 如果存在今天的全备份, 则删除至前一天为止所有备份
2. 如果不存在今天的全备份, 则保留前一天最新的1个备份
$ pg_rman backup -b full --keep-data-generations=0 --keep-data-days=1


其余全部删除并创建新备份
$ pg_rman backup -b full --keep-data-generations=0 --keep-data-days=0


Start                   Status
================================
2012-04-25 10:03:08     OK <= 今天, 本次创建的备份
2012-04-25 10:02:28     OK <= 今天, 保留
2012-04-24 09:00:00     OK <= 前一天, 删除


$ pg_rman show
$ pg_rman show -a
$ pg_rman show "2012"
$ pg_rman show "2012-04"
$ pg_rman show "2012-04-23"
$ pg_rman show "2012-04-23 04"
$ pg_rman show "2012-04-23 04:12"
$ pg_rman show "2012-04-23 04:12:42"
$ pg_rman show timeline

$ pg_rman validate
$ pg_rman validate "2012-04-23 04:12:42"


删除备份
$ pg_rman delete "2012-04-23 04:00:00"

1. 指定时间必须是 full 备份的时间
2. 删除的是指定时间之前的所有备份 (full, incremental, archive)


2012年4月22日日曜日

[LINUX 基础] mount 挂载设备

mount [-参数] [设备名称] [挂载点]

挂载点: 已经存在的目录, 这个目录可以不为空, 但挂载后这个目录下以前的内容将不可用, umount 后会恢复正常
设备名称: 可以是一个分区, usb 设备, 光驱, 软盘, 网络共享等

常见分区加载方法

0. 先查看所需挂载的设备信息
# fdisk -l

1. iso 文件
# mkdir /mnt/iso
# mount –o loop foo.iso /mnt/iso

2. 光驱
一般 CDROM 的设备文件是 /dev/hdc
# mkdir /mnt/cdrom
# mount /dev/hdc /mnt/cdrom

3. 软驱
# mkdir /mnt/floppy
# mount /dev/fd0 /mnt/floppy

4. windows 共享文件 (samba)
指定访问共享的用户名, 密码, codepage 指定编码与 iocharset 同意义, 这里的 windows 系统是中文简体
codepage 指定文件系统的代码页, 简体中文中文代码是 936, iocharset 指定字符集, 简体中文一般用 cp936 或 gb2312
# mkdir /mnt/winshare
# mount -t smbfs -o username=w,password=w,codepage=936,iocharset=gb2312 //192.168.0.101/share /mnt/winshare

5. U 盘
如果计算机没有其它 SCSI 设备和 usb 外设的情况下, 插入的 U 盘的设备路径是 /dev/sda1
# mkdir /mnt/usb
# mount /dev/sda1 /mnt/usb

6. NFS 系统
# showmount -e 192.168.0.30
# mount -t nfs 192.168.0.30:/tmp /mnt/nfs

7. ext 文件系统
/dev/sda2 上事先存在文件系统, 如 ext3 等
# mount -t ext3 /dev/sda2 /mtn/disk

================================================================================
/etc/fstab 与 /etc/mtab

1. /etc/fstab
记录系统启动时自动挂载的设备

2. /etc/mtab
系统启动时不自动挂载, 之后手动挂载的设置
可以通过此文件查看当前挂载信息
mount /dev/sda1 /media 命令会修改此文件

2012年4月21日土曜日

[LINUX 基础] Linux 上可关闭的服务

http://yp.oss.org.cn/blog/show_resource.php?resource_id=1076

1.  smartd, 检查硬盘故障, 虚拟的硬盘是无法用这个服务来检查, 只对实体的装置才有用
2.  apmd, 电源管理, 没有 UPS 或是没有电池的电脑这是没用的
3.  autofs, 自动挂载服务, 通常 server 所需要挂载都是固定的, 除非是特殊的目的, 否则用处不大
4.  bluetooth, 蓝芽, Server 应该是不太需要用蓝芽
5.  cups, 打印服务器服务
6.  ip6table6
7.  iptable
8.  isdn, 如果有需要建立 ISDN 的环境, 才需要使用
9.  hidd, 蓝牙的输入支持
10. pcscd, 给 smart card 用
11. pcmcia, 给 pcmcia 用
12. acpid, linux 新型电源管理标准, 建议笔记本使用
13. anacron, 和 cron 相似的任务调度器, 只不过它并不要求系统持续运行
14. atd, 运行用户用at命令调度的任务,需要用到at的得留着
15. firstboot, 系统安装后第一次启动的配置工具
16, kudzu, 新增硬件检测
17. mcstrans, 主要用于 SELinux, 不开 SELinux 的话就关了
18. microcode_ctl, 控制 IA32 微码驱动程序更新
19. restorecond, SELinux 用于监控文件
20. sendmail, 邮件服务器程序
21. setroubleshoot, SELinux Troubleshooting
22. yum-updatesd, yum 自动更新
23. netfs, fatab 中自动 mount NFS 或 Samba 时需要使用
24. nfslock, NFS 文件锁定功能
25. portmap, 用来支持 RPC 连接, RPC 被用于 NFS 以及 NIS 等服务
26. rpcgssd, 使系统支持 NFSv4 Service
27. rpcidmapd, 使系统支持 NFSv4 Service
28. avahi-daemon, 当沒有 DNS 服务器时尝试寻找提供 zeroconf 协议的主机
29. cpuspeed, 控制 CPU 速度主要用來省電
30. gpm, 为文本模式下的 Linux 程序提供了鼠标的支持
31. irqbalance, 使系统支持多个 CPU 负载均衡
32. mdmonitor, RAID 监控

设置
--------------------------------------------------------------------------------
#!/bin/sh
/sbin/service smartd stop
/sbin/service apmd stop
/sbin/service autofs stop
/sbin/service bluetooth stop
/sbin/service cups stop
/sbin/service ip6table6 stop
/sbin/service iptable stop
/sbin/service isdn stop
/sbin/service hidd stop
/sbin/service pcscd stop
/sbin/service pcmcia stop
/sbin/service acpid stop
/sbin/service anacron stop
/sbin/service atd stop
/sbin/service firstboot stop
/sbin/service kudzu stop
/sbin/service mcstrans stop
/sbin/service microcode_ctl stop
/sbin/service restorecond stop
/sbin/service sendmail stop
/sbin/service setroubleshoot stop
/sbin/service yum-updatesd stop
/sbin/service netfs stop
/sbin/service nfslock stop
/sbin/service portmap stop
/sbin/service rpcgssd stop
/sbin/service rpcidmapd stop
/sbin/service avahi-daemon stop
/sbin/service cpuspeed stop
/sbin/service gpm stop
/sbin/service mdmonitor stop

/sbin/chkconfig smartd off
/sbin/chkconfig apmd off
/sbin/chkconfig autofs off
/sbin/chkconfig bluetooth off
/sbin/chkconfig cups off
/sbin/chkconfig ip6tables off
/sbin/chkconfig iptables off
/sbin/chkconfig isdn off
/sbin/chkconfig hidd off
/sbin/chkconfig pcscd off
/sbin/chkconfig pcmcia off
/sbin/chkconfig acpid off
/sbin/chkconfig anacron off
/sbin/chkconfig atd off
/sbin/chkconfig firstboot off
/sbin/chkconfig kudzu off
/sbin/chkconfig mcstrans off
/sbin/chkconfig microcode_ctl off
/sbin/chkconfig restorecond off
/sbin/chkconfig sendmail off
/sbin/chkconfig setroubleshoot off
/sbin/chkconfig yum-updatesd off
/sbin/chkconfig netfs off
/sbin/chkconfig nfslock off
/sbin/chkconfig portmap off
/sbin/chkconfig rpcgssd off
/sbin/chkconfig rpcidmapd off
/sbin/chkconfig avahi-daemon off
/sbin/chkconfig cpuspeed off
/sbin/chkconfig gpm off
/sbin/chkconfig mdmonitor off

[工具使用] NYAOS

http://efcl.info/2011/0501/res2717/

2012年4月19日木曜日

[工具使用] CentOS5 安装 Dante Socks

主页
http://www.inet.no/dante/index.html

1. 安装


2. 客户端设置
$ cat /etc/socks.conf
#
# A simple sample socks.conf for users with a local nameserver.
#

# Assuming de0 is on the lan-net, the below will make connections to it
# (and anything else on the lan), be direct, i.e. not go via the proxy.

route { from: 0.0.0.0/0 to: 192.168.1.1/32 via: direct }
route { from: 0.0.0.0/0 to: 192.168.1.2/32 via: direct }

# Clients going anywhere else go via the proxy server listening at
# IP address 10.1.1.1, port 1080.  Uncomment the line(s)
# corresponding to the proxyprotocols your proxyserver supports.

route {
        from: 0.0.0.0/0   to: 0.0.0.0/0   via: 192.168.1.100 port = 1080
        protocol: tcp udp               # server supports tcp and udp.
        proxyprotocol: socks_v5         # server supports socks v5.
        method: none #username           # we are willing to authenticate via
}


3. 使用
$ socksify cvs -d xxxxx co yyyyyy
$ socksify ssh hoge@192.168.1.2

2012年4月16日月曜日

[LINUX 基础] CentOS 各常用软件的代理设置

1. wget
# vim /etc/wgetrc
http_proxy=http://proxy.hostname.com:80
或
# export http_proxy="http://proxy.hostname.com:80"

2. yum
# vim /etc/yum.conf
proxy=http://proxy.hostname.com:80
或
$ export http_proxy="http://proxy.hostname.com:80"

3. rpm
# rpm --httpproxy http://proxy.hostname.com --httpport 80 --import http://ftp.riken.jp/Linux/centos/RPM-GPG-KEY-CentOS-5

4. ssh
ssh proxy 设置
http://godbms.blogspot.jp/2011/11/centos5-dante.html

5. cvs
CVS 的使用
http://godbms.blogspot.jp/2011/11/cvs_25.html

http://godbms.blogspot.jp/2012/04/centos5-dante-socks.html

6. svn
SVN 使用
http://godbms.blogspot.jp/2011/12/svn.html

7. git
git 安装与使用

2012年4月13日金曜日

[工具使用] rdesktop

1. 安装
$ yum install rdesktop

2. 使用
$ rdesktop --help
$ rdesktop -g 1024x768 192.168.1.2

2012年4月10日火曜日

[PostgreSQL] [9.1] streaming replication + hot standby

1. primary 配置
$ vim path/to/prim/postgresql.conf
listen_addresses = '*'
port = 5432
wal_level = hot_standby
max_wal_senders = 1
hot_standby = on # standby 用
archive_mode = on
archive_command = 'cp "%p" "/arc/%f"'

$ vim path/to/prim/pg_hba.conf
local replication  repuser             trust
host  replication  repuser  0.0.0.0/0  trust


2. 启动 primary, 使设置生效
$ pg_ctl start -w


3. 确认归档
$ pgbench -i
$ ls
000000010000000000000001


4. basebackup 到 stanby 目录
$ pg_basebackup -x -h localhost -p 5432 -U repuser -D path/to/stby


5. stanby 配置
$ vim path/to/stby/postgres.conf
port = 5433

$ vim path/to/stby/recovery.conf
standby_mode = 'on'
primary_conninfo = 'host=localhost port=5432 user=reprole password=reppass'


6. 启动 stanby
$ pg_ctl start -w


7. 查看启动状态
$ netstat -ano | grep PGSQL
unix  2      [ ACC ]     STREAM     LISTENING     50435  /tmp/.s.PGSQL.5432
unix  2      [ ACC ]     STREAM     LISTENING     49068  /tmp/.s.PGSQL.5433


8. failover (一旦升级后, 再降级要重新配置)
$ pg_ctl -D path/to/stby promote


9. 相关视图

9-1 显示 replication 状态
=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
procpid          | 22856
usesysid         | 16384
usename          | reprole
application_name | stby
client_addr      | 127.0.0.1
client_hostname  |
client_port      | 34689
backend_start    | 2011-11-16 15:43:42.736069+09
state            | streaming
sent_location    | 0/301C028
write_location   | 0/301C028
flush_location   | 0/301C028
replay_location  | 0/301C028
sync_priority    | 0
sync_state       | async

9-2 primary 现在 wal 位置
=# select * from pg_current_xlog_location();

9-3 stanby 现在写入 wal 位置
=# select * from pg_last_xlog_receive_location();

9-4 standby 到显示的时间为止的更新被应用
$ select pg_last_xact_replay_timestamp();
 pg_last_xact_replay_timestamp
-------------------------------
 2011-04-25 23:20:56.912261+09
(1 row)

9-5 确认各进程
$ ps x | grep postgres
17829 pts/1    S      0:00 /usr/local/pgsql9.1.1/bin/postgres
17835 ?        Ss     0:00 postgres: writer process      
17836 ?        Ss     0:00 postgres: wal writer process  
17837 ?        Ss     0:00 postgres: autovacuum launcher process
17838 ?        Ss     0:00 postgres: stats collector process
17918 pts/1    S      0:00 /usr/local/pgsql9.1.1/bin/postgres
17923 ?        Ss     0:00 postgres: startup process   recovering 000000010000000000000004
17924 ?        Ss     0:00 postgres: writer process      
17925 ?        Ss     0:00 postgres: stats collector process
17926 ?        Ss     0:00 postgres: wal receiver process   streaming 0/4088390
17927 ?        Ss     0:00 postgres: wal sender process reprole 127.0.0.1(26093) streaming 0/4088390


10. 同步 replication

10-1. primary 配置
$ vim path/to/prim/postgresql.conf
+synchronous_standby_names = 'stby1,stby2' # 参照 path/to/stby/recovery.conf

$ pg_ctl reload

10-2. standby 配置
$ vim path/to/stby/recovery.conf
-primary_conninfo = 'host=localhost port=5432 user=reprole password=reppass'
+primary_conninfo = 'host=localhost port=5432 user=reprole password=reppass application_name=stby'

$ pg_ctl restart

此时, 如果 stanby 停机, primary 的 commit 会被暂停, stanby 恢复后 commit 将成功
通过 synchronous_commit = local (on) 参数, 可以使 primary 单独 (协同) 工作
$ pg_ctl -D path/to/prim -o "-c synchronous_commit=local" restart
$ pg_ctl -D path/to/prim -o "-c synchronous_commit=on" restart

11. failover (同期 or 非同期)
$ pg_ctl -D path/to/prim -m immediate stop
$ pg_ctl -D path/to/stby promote (新 primary)
$ vim path/to/prim/postgres.conf (修改)
hot_standby = on

$ vim path/to/prim/recovery.conf (创建)
standby_mode = 'on'
primary_conninfo = 'host=localhost port=5433 user=reprole password=reppass application_name=prim'
recovery_target_timeline = 'latest'
restore_command = 'cp path/to/stby/pg_xlog/%f "%p" 2> /dev/null'

$ pg_ctl -D path/to/prim start -w (新 stanby)

[PostgreSQL] 密码设置

1. 创建用户名密码
=# create role hoge password 'pass';
CREATE ROLE
=# alter role hoge login;
ALTER ROLE
=# \password hoge

2. pg_hba.conf
# TYPE  DATABASE USER ADDRESS METHOD
  local all      hoge         md5 (password)

3. 免密码设置
hostname:port:database:username:password
$ echo localhost:5432:postgres:hoge:pass > ~/.pgpass
$ chmod 600 ~/.pgpass

[LINUX 基础] 制作 iso 文件

1. 用 cdrom 制作 iso 文件
# dd if=/dev/cdrom of=/tmp/dvd.iso
或
# mkdir /mnt/cdrom
# mount /dev/cdrom /mnt/cdrom
# mkisofs -r -o dvd.iso /mnt/cdrom
用 mkiso 制作的 iso 已有文件系统 iso9660

2. mount iso 文件
# mkdir /mnt/cdrom
# mount -t iso9660 -o loop /tmp/dvd.iso /mnt/cdrom
# umount /mnt/cdrom

3. 烧制 iso 文件
# cdrecord dev=0,0,0 speed=24 dvd.iso

[LINUX 基础] cron

1. cron 管理命令

# /etc/rc.d/init.d/crond status
# /etc/rc.d/init.d/crond start
# /etc/rc.d/init.d/crond stop
# chkconfig --level 2345 crond on
# chkconfig --list crond

# crontab -u user -l => 只有 root 可以指定 -u
$ crontab -l => 显示 crontab 文件内容
$ crontab -e => 编辑 crontab 文件
$ crontab -r => 删除 crontab 文件

$ crontab -e
可设置注释, 环境变量和 cron 命令

MAILTO=user1,user2
MAILTO="" # 不发送邮件


2. 配置文件

2-1. 各个用户的设置 (crontab -e 编辑此文件)
/var/spool/cron/user

2-2. 系统自动执行的设置 (每时每天等)
/etc/crontab


2-3. cron 命令格式

2-3-1. /var/spool/cron/user
分 时 日 月 星期 命令

2-3-2. /etc/crontab
分 时 日 月 星期 用户 命令

2-3-3. 共通
分 0U+301C59
时 0U+301C23
日 1U+301C31
月 1U+301C12 or jan U+301C dec
星期 0U+301C7 [0, 7 周日] or sun U+301C sat
有效 shell 命令 (可以带空格)

指定列表
0,15,30,45 => 15 分钟执行一次

指定范围
1-5 => 周一到周五

混合指定
1,2,5-10 => 1 点, 2 点, 5 点到 10 点

指定间隔
1-5/2 => 1 点, 3 点, 5 点

2-4. 放置每时, 每天, 每周, 每月要执行的脚本的文件夹, 脚本要指定执行权限
/etc/cron.hourly
/etc/cron.daily
/etc/cron.monthly
/etc/cron.weekly

2-5. 上述之外的自动脚本放置文件夹
/etc/cron.d

2-6. cron 使用权限
/etc/cron.allow  /etc/cron.deny  可以使用的用户
无               无               全员
有               无视             cron.allow 内的用户
无               有               cron.deny 以外的用户
空               无视             无
无               空               全员 (默认)

有:有文件
无:无文件
空:文件大小为 0
无视:无视文件

2012年4月7日土曜日

[工具使用] KVM 安装 (CentOS5)

http://5ydycm.blog.51cto.com/115934/274902


1. KVM 安装

1-1. 查看 cpu 是否支持虚拟化
$ egrep '(vmx|svm|ape)' --color=always /proc/cpuinfo

1-2. 安装 KVM 等工具
# yum install kvm kmod-kvm qemu libvirt python-virtinst
# reboot
# virsh -c qemu:///system list
Id Name                 State
----------------------------------

1-3. 安装网桥工具
# yum install bridge-utils

1-4. 配置网桥
1-4-1. 修改 ifcfg-eth0
# cat ifcfg-eth0
# Intel Corporation 82540EM Gigabit Ethernet Controller
DEVICE=eth0
# BOOTPROTO=none
# HWADDR=08:00:27:A7:0A:50
ONBOOT=yes
# NETMASK=255.255.255.0
# IPADDR=192.168.1.57
GATEWAY=192.168.1.1
# TYPE=Ethernet
# USERCTL=no
# IPV6INIT=no
# PEERDNS=yes
BRIDGE=br0

1-4-2. 创建 ifcfg-br0
# cat ifcfg-br0
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes
BROADCAST=192.168.1.255
NETMASK=255.255.255.0
IPADDR=192.168.1.57
NETWORK=192.168.1.0
GATEWAY=192.168.1.1

1-5. 重启网络
# sudo /sbin/service network restart
# ifconfig

1-6. 安装 KVM 管理软件
# yum install virt-manager virt-viewer

1-7. 启动管理程序
$ ps -ef | grep libvirtd
$ ssh -X go@remote
$ virt-manager &
================================================================================

img 文件可以指定链接
ln -s /var/lib/libvirt/images/centos5.img /work/imgs/centos5.img

2012年4月3日火曜日

[C 语言] socket 基本函数

http://www.cnblogs.com/heiyue/archive/2011/08/03/2126622.html
--
1. write
ssize_t write(int fd, const void*buf, size_t nbytes);
1-1. 将 buf 中的 nbytes 字节内容写入文件描述符 fd
1-2. 返回值 > 0, 表示写了部分或者是全部的数据
1-3. 返回值 < 0, 此时出现了错误, 要根据错误类型来处理, EINTR 表示写的时候出现中断错误, EPIPE 表示网络连接出现问题 (对方已经关闭了连接)

int my_write(int fd, void *buffer, int length)
{
    int bytes_left;
    int written_bytes;
    char *ptr;

    ptr = buffer;
    bytes_left = length;
    while(bytes_left > 0) {
        written_bytes = write(fd, ptr, bytes_left);
        if(written_bytes <= 0) {
            if(errno == EINTR)
                written_bytes = 0;
            else return(-1);
        }
        bytes_left -= written_bytes;
        ptr += written_bytes;
    }
    return(0);
}

2. read
ssize_t read(int fd, void *buf, size_t nbyte)
2-1. 从 fd 中读取内容到 buf 中
2-2. 返回值 > 0, 返回实际所读的字节数,
2-3. 返回值 = 0, 表示已经读到文件的结束,
2-4. 返回值 < 0, 表示出现了错误, 错误为 EINTR 是由中断引起的, ECONNREST 表示网络连接出问题

int my_read(int fd, void *buffer, int length)
{
    int bytes_left;
    int bytes_read;
    char *ptr;

    bytes_left = length;
    while(bytes_left > 0) {
        bytes_read = read(fd, ptr, bytes_left);
        if(bytes_read < 0) {
            if(errno == EINTR)
                bytes_read = 0;
            else
                return(-1);
        } else if(bytes_read == 0)
            break;
        bytes_left -= bytes_read;
        ptr += bytes_read;
    }
    buffer = ptr;
    return (length - bytes_left);
}

3. recv
int recv(int sockfd,void *buf,int len,int flags)
3-1. flags = 0 时, 与 read 相同
3-2. 其他???

4. send
int send(int sockfd,void *buf,int len,int flags)
4-1. flags = 0 时, 与 write 相同
4-2. 其他???


5. recvfrom (udp)


6. sendto (udp)


7. recvmsg


8. sendmsg


9. close


10. shutdown


================================================================================
x-1. 写结构体
struct my_struct my_struct_client;
my_write(fd, (void *)&my_struct_client, sizeof(struct my_struct);

x-2. 读结构体
char buffer[sizeof(struct my_struct)];
struct *my_struct_server;
my_read(fd, (void *)buffer, sizeof(struct my_struct));
my_struct_server = (struct my_struct *)buffer;