星期二, 十一月 29, 2005

[Debian] Raid1 + LVM + xfs

Debian/testing
kernel: 2.6.12-1-686
mdadm: 1.12.0-1
lvm2: 2.01.04-5

系统中两块硬盘,分区 hdb1 和 hdc1 做的raid1,其上做的lvm,由于年深日久,当年又未曾留下文字记录,所以忘了怎么做的了 :-)
凑巧的是,这个lvm的磁盘空间眼看就要用完,而hdb 和 hdc 恰好又还有剩余的空间。干脆将剩余空间再做成raid1,然后加到先前的lvm里面,顺便在此留下文字记录。

  1. 分区,将两块磁盘上为利用的空间分区,因为是raid1的关系,两个分区大小要一致。分区之后,reboot。
  2. 创建raid1
    1. mdadm --create /dev/md1 --level=1 --raid-disks=2 /dev/hdb8 /dev/hdc8
      如果提示没有 /dev/md1 这个文件(因为使用了udev),需要自己手动创建一个
      mkmod /dev/md1 b 9 1
  3. 将新创建的raid1加入到原先的lvm中去(以下三个命令,都有-t:供测试的参数,建议先加一个-t测试一下)。
    1. 将新建的 /dev/md1 用pvcreate命令格式化一下
      pvcreate /dev/md1
    2. 用vgextend命令将 /dev/md1 加入到原先的 vg0 中
      vgextend -Ay vg0 /dev/md1
    3. 扩展lv,命令是 lvextend
      lvextend -Ay -L +36G /dev/vg0/lv0 /dev/md1
  4. 扩展文件系统,我使用的是xfs.
    1. 首先是将文件系统挂载(mount)
    2. 扩展文件系统,使用xfs_growfs,man里头说就是为了配合 lvm 使用的 :-)
      xfs_growfs mount_point
    3. 稳妥起见,还是运行一下磁盘检查程序
      umount mount_point
      xfs_check /dev/vg0/lv0
  5. 大功告成!!
参考文章:
Convert Root System to Bootable Software RAID1 (Debian):http://alioth.debian.org/projects/rootraiddoc
以上所用命令的手册页(man)

星期六, 十一月 26, 2005

[Debian] 解决DMA无法启用一例

系统(Debian/sid)原来运行的内核是2.4.27,现在升级到2.6.14,其中遇到的问题:
  1. 在2.4.27的系统下无法完成2.6.14-2-686的安装,主要是无法生成initrd文件,在Debian-user的邮件列表上有人问过这个问题,需要安装 initramfs-tools, 这样可以解决 2.6.14 的安装问题。
  2. 系统启动之后,发现DMA无法启用:
    # hdparm -d 1 /dev/hda

    /dev/hda:
    setting using_dma to 1 (on)
    HDIO_SET_DMA failed: Operation not permitted
    using_dma = 0 (off)
    在google搜索了一下,找到了这个地址:http://seclists.org/lists/linux-kernel/2002/Oct/0162.html:
    looks like you forgot to enable via support
    正好我的也是via的主板:
    $ lspci|grep -i ide
    0000:00:07.1 IDE interface: VIA Technologies, Inc. VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE (rev 06)
    查看了下initrd里面的文件,确实没有via的IDE驱动模块,于是修改了一下yaird的配置文件(/etc/yaird/Default.cfg),加入了via模块的支持:
    OPTIONAL MODULE via82cxxx
    然后重新配置下2.6的内核
    dpkg-reconfigure linux-image-2.6.14-2-686
  3. 完成之后,重新启动,OK,问题解决了。

星期四, 十一月 24, 2005

[python] 我的第一个python脚本

很丑陋,但是是我写的第一个Python程序。

    想学习下python,于是将python.cn上的邮件列表存档下载下来,想用zcat将它们合并成一个文件,以便用mutt来观看存档,结果发现文件名是类似于2004-September.txt.gz这种结构,如果强行将它们合并的话,时间顺序就会不正确,应为这种文件名不会按照正确的时间来排序。

    于是想到将月份由名称改成数字,这样可以解决文件名排序问题,昨天才看python,但是正好动一下手,解决这个"实际"问题 :-)

    再次申明:很丑陋,但是完成了我的"实际需求"



  • #!/usr/bin/python

    # coding: utf-8
    # filename name_convert.py

    import sys, os, string, re

    def monthConvert(name):
    """ monthConvert:Convert full month name to number.

    Return a month as a decimal number
    if Param is not a full month name, then return None """
    month = {"January": "01",\
    " February":"02",\
    "March":"03 ",\
    "April" :"04",\
    " May":"05",\
    "June":"06 ",\
    "July": "07",\
    " August":"08",\
    "September":"09 ",\
    "October" :"10",\
    " November":"11",\
    "December":"12 "}
    name = name.capitalize()
    try:
    if month[name]:
    return month[name]
    except:
    #print monthConvert.__doc__
    return

    def convertName(filename):
    """convertName: Convert full month name in filename to number.

    Return new filename, month name is replaced by month number
    if file name is not like -monthname.txt.gz, then return None """
    if re.search('.txt.gz' ,filename):
    newName = None
    m = re.findall('-[a-zA-Z]+',filename)
    for j in m:
    monthName=j.strip('-')
    monthNumber = monthConvert(monthName)
    if monthNumber != None:
    if newName != None:
    newName = newName.replace(monthName,monthNumber)
    else:
    newName = filename.replace(monthName,monthNumber)
    return newName

    if __name__ == "__main__":
    for i in os.listdir('.'):
    newName = convertName(i)
    if newName != None:
    os.rename(i,newName)

星期一, 十一月 07, 2005

iptables的几个概念

前两天玩emule,因为在内网,需要端口转发,顺便再了解了一下iptables的一些规则。
  1. 以前对filter中的INPUT链和nat中的PREROUTING有些搞不清,例如,如果INPUT的规则是DROP,那么对PREROUTING会有怎样的影响或是冲突。
    通过实验,应当是这样的,nat的PREROUTING链应当在filter之前,INPUT对PREROUTING的影响只是在于,如果PREROUTING修改过得目的地址如果仍然是本机的话,那么INPUT链将起作用,但如果PREROUTING修改的目的地址不是本机的话,那么就该是FORWARD链的规则控制了。
  2. 做端口转发,应当注意链路的完整性,进得来的要出得去。以amule为例,外部对4662端口的访问如下:
    进入:外部->proxy:4662->PREROUTING修改目的地址->FORWARD转发->amule:4662
    回应:amule:4662->proxy->POSTROUTING修改源地址->FORWARD转发->外部

    这儿应当注意的是,不管POSTROUTING和PREROUTING怎么设置,如果没有FORWARD链,内部和外部是不可能连通的。
  3. iptables的LOG命令是一个相当有用的东西,尤其是在调试iptables的规则的时候,可以用LOG来查看包是否依据规则流动。

apache 对.svn目录的保护

为了图方便,我是在apache的目录下面直接修改文件的,用的是subversion做的版本控制,为了保护.svn目录,需要在apache的配置文件里面加上一节
  • 禁止对.svn目录的访问
    • <Directory ~ "/\.svn">
              Order allow,deny
              Deny from all
       </Directory>

  • 额外的,想禁止对所有以.开头的文件的访问:
    • <Files ~ "^\.">
              Order allow,deny
              Deny from all
        </Files>