2012年2月25日星期六

在linux下创建winpe启动环境


1 配置dhcp服务,下载ris-linux-0.4(略)

2 配置smb服务,配置文件大概如下:
[reminst]
path = /opt/kickstart/tftpboot
public = yes
browsable = true
read only = no
guest ok = yes

3 配置tftp服务,由于linux对大小写敏感,需要将所有以大写字母命名的文件转换成小写字母命名,转换脚本如下:

find ./ -depth |perl -ne 'chomp;m</[^/]*$>;$d=$`;$_=$f=$&;''s/([\x80-\xFF].)|(\w)/$1\l$2/g;system "mv",$d.$f,$d.$_ if $f ne $_'

配置/opt/kickstart/tftpboot/rules文件,对文件名进行映射,内容如下:
[root@linux_install /opt/kickstart/tftpboot]
#cat rules
ri ^[a-z]: # Remove ¡°drive letters¡±
rg \\ / # Convert backslashes to slashes
rg \# @ # Convert hash marks to @ signs
rg /../ /..no../ # Convert /../ to /..no../
rg A a
rg B b
rg C c
rg D d
rg E e
rg F f
rg G g
rg H h
rg I i
rg J j
rg K k
rg L l
rg M m
rg N n
rg O o
rg P p
rg Q q
rg R r
rg S s
rg T t
rg U u
rg V v
rg W w
rg X x
rg Y y
rg Z z
r ^/(.*) \1

启动tftp服务时,需要指定-m参数:
/opt/kickstart/hpa-tftp/sbin/in.tftpd -l -v -s /opt/kickstart/tftpboot/ -m /opt/kickstart/tftpboot/rules

创建winpe的启动环境:
1 找到 STARTROM.N1_ 文件,并重命名为/opt/kickstart/tftpboot/winpe.0
2 运行sed -i -e 's/NTLDR/peldr/gi' /opt/kickstart/tftpboot/winpe.0
3 找到setupldr.exe 文件(i386目录下),并重命名为/opt/kickstart/tftpboot/peldr
4 运行sed -i -e 's/winnt\.sif/winpe\.sif/gi' /opt/kickstart/tftpboot/peldr
5 运行sed -i -e 's/ntdetect\.com/ntdetect\.wpe/gi' /opt/kickstart/tftpboot/peldr
6 找到NTDETECT.COM文件(i386目录下),并重命名为/opt/kickstart/tftpboot/ntdetect.wpe
7 运行 ris-linux-0.4/fixloader.py /opt/kickstart/tftpboot/peldr (此处仅为pxe启动winpe使用,如配置WinXP的安装源则无需这一操作)
8 配置/opt/kickstart/tftpbootwinpe.sif文件如下:

[Intranet root@KickStart /opt/kickstart/tftpboot]
#cat winpe.sif
[SetupData]
OsLoadOptions = "/fastdetect /minint"
SetupSourceDevice = "\Device\LanmanRedirector\10.20.129.9\reminst\windows\winpe"
[UserData]
ComputerName = WindowsPE

KickStart关于%include的使用方法


我们可以将ks文件中相同的内容独立出来写在同一个文件common当中,然后通过ks中的%include /tmp/ks/common选项包含进来。但是common文件的位置该如何处理呢?
首先解释一下ks文件被安装程序anaconda解析的过程:
1pre脚本运行之前,anacondaks文件进行解析,这个时候anaconda会忽略掉所有它不能找到的文件。
2 运行pre脚本。
3 重新解析那些没有找到的文件。

在第1步中使anaconda访问到include所包含的文件是比较困难的,但是通过运行pre脚本可以使anaconda在第3步中对缺失的文件进行解析。pre脚本可以写成如下的形式:

%pre
#!/bin/bash
###ks服务器的IP192.168.0.1common文件存在于ks服务器上的/kickstart/ks/ 目录下
mount 192.168.0.1:/kickstart /mnt
mkdir –p /tmp/ks
cp /mnt/ks/common /tmp/ks/common

通过以上三个命令anaconda可以直接访问到/tmp/ks/common文件。在第1步对ks配置文件解析时被忽略的%include /tmp/ks/common 顺利的在第3步中被解析了。

可以通过以上方法对系统的分区行为根据需要进行动态设置,方法如下:
1 ks文件中的分区信息独立出来,写进partation文件,然后在ks中添加%include /tmp/ks/partation
2 pre脚本中用fdisk等命令分析硬盘信息
3 pre脚本中运行命令,修改/tmp/ks/partation文件
经过以上三步,anaconda就可以根据硬盘类型,容量的不同对分区信息进行动态调整了

2012年2月23日星期四

qmail对虚拟域用户的处理过程

qmail对域的管理分为两种,一种为本地域,一种为虚拟域。本地域指的是系统用户,虚拟域可以通过手工单独创建,更快捷的方式是通过vpopmail进行管理。如果将信投递给虚拟域用户,qmail处理如下:

假定service.com是一个定义在virtualdomain文件中的虚拟域,该文件包含如下一行
service.com:service.com
qmail收到发给用户user@service.com的信件后首先检查service.com是否存在于locals文件中(service.com是否本地域?),结果不存在,qmail继续检查user@service.com是否在virtualdomains中(user@service.com是否作为一个单独的用户不与service.com域有关?),结果仍然不存在,qmail继续检查service.com是否存在于virtualdomains中,结果是存在的。qmail将user@service.com转化为service.com-user@service.com进行投递。
投递的具体方式定义在assign文件中,assign文件中包含如下的一行:
+service.com-:service.com:89:89:/disk2/vpopmail/domains/service.com:-::
+service.com-定义了匹配service.com-为前缀的邮件,将会以service.com这个用户进行传送,service.com这个用户的uid和gid都是89,/disk2/vpopmail/domains/service.com则定义了用户service.com所在的目录。而最后两个域则定义了.qmail文件实际为.qmail-。
qmail检查service.com-user这个用户是否存在,结果失败,然后qmail继续检查是否存在service.com这个用户,根据对assign文件的说明,可知目前系统存在这个用户,且这个用户的uid和gid都是89,是非0的,用户service.com的家目录/disk2/vpopmail/domains/service.com的uid和gid也都为89。因此把信件交给service.com处理。
service.com用户检查/disk2/vpopmail/domains/service.com是否存在.qmail-user文件,如果失败,那么直接采用.qmail-default文件定义的方式进行处理。

2012年2月20日星期一

加密签名和gpg

为了研究apk的签名,看了下签名和加密的问题,不过本文和apk的签名毫无关系。

加密算法有两种,对称密钥算法和非对称密钥算法。对称密钥算法包括DES,AES等,非对称密钥算法包括RSA,DSA等。对称密钥算法在加密和解密的时候使用同一个密钥。加密解密速度快,如果同时和多方通信,密钥管理成本高;非对称密钥算法则有私钥和公钥之分。私钥保留在用户手中,不对外透漏,公钥公布在互联网上,比如可以放在keys.gnupg.net。公钥和私钥都可以用来加密数据。密钥管理成本低,但是加密解密速度慢。Gnupg简称gpg,是生成和管理密钥的工具。Gnome用seahorse做前端,KDE用Kgpg做前端。

签名是指身份认证,即证明和B通讯的另一方就是A,而不是C冒充的。即A使用私钥签名,B使用A的公钥进行解密。解密成功,则证明对方就是A。
加密是指将信息加密,即使其他用户获得加密后的信息,也无法获得信息正确内容。即B使用A的公钥进行加密,再将加密数据传给A,A收到数据后,利用私钥解密,C即使获得了加密数据,但是由于C没有A的私钥,因此信息依然是安全的。

gpg 命令:
生成key: gpg --gen-key
修改key信息: gpg --edit-key ilout
查看当前的公钥: gpg --list-keys
查看当前的私钥: gpg --list-secret-keys
删除私钥:gpg --delete-secret-keys ilout
删除公钥:gpg --delete-keys ilout
加密信息:gpg -e -r ilout file
解密信息:gpg -d file.asc  >file
导出公钥:gpg --export -a ilout >ilout.pk
将公钥上传到网站: gpg --import --keyserver keys.gnupg.net --send-key E7201101
从文件导入公钥:gpg --import -a ilout.pk
从网站导入公钥:gpg --import --keyserver keys.gnupg.net --recv-keys E7201101
导入公钥后需要对公钥签名,以表示信任该公钥: gpg --sign-key E7201101

上述的签名过程有个漏洞:如果C谎称自己是A,然后将自己的公钥发送给B,B直接导入假冒的公钥,也可以顺利的完成签名认证的过程。为了解决此问题,就产生了数字证书来保证A的公钥无法被任何人冒充。