Archive

Posts Tagged ‘linux’

Seccomp和系统调用过滤

December 8th, 2009 li 1 comment

Seccomp v1

Seccomp是2005年Andrea Arcangeli在Linux内核加的一个功能,为了给*Grid计算中的应用*提供sandbox模型。运行在Seccomp模式下的进程,只能执行下面几个系统调用:
    read(), write(), exit(), sigreturn()

Read more…

Categories: 开源软件 Tags: , , ,

用 syslinux 引导 Windows

March 22nd, 2009 li 2 comments

FAT 分区的引导扇区(Boot Sector)的功能是将 Windows XP 的 ntldr 文件,或 Windows Vista 的 bootmgr 文件加载到内存适当位置,由此启动 Windows。

Linux 下可以创建 Windows 的 FAT 文件系统,但是不能创建 FAT 文件系统中的 Boot Sector,也就是不能创建可以引导的 FAT 分区,因而 Linux 下无法创建可以引导的 Windows 磁盘。

不过可以曲线救国,通过 syslinux 来引导 Windows。 首先,将 syslinux 安装到 Windows 分区设备上。

syslinux /dev/sdXY

然后,将 syslinux 自带的 chain.c32 文件拷贝到 Windows 分区上。如果是 Debian,这一文件在 /usr/lib/syslinux/ 目录下。

接着,在 Windows 分区上创建 syslinux.cfg 文件

default 1
timeout 0
label 1
  kernel chain.c32
  append hd0,1 ntldr=ntldr

chain.c32 接受的第一个参数代表启动第1块硬盘的第1个分区,并装载分区上的 ntldr 文件。用该配置文件可以引导 Windows XP。如果需要引导 Windows Vista,需要修改成下述内容:

default 1
timeout 0
label 1
  kernel chain.c32
  append hd0,1 ntldr=bootmgr

chain.32 接受的参数说明如下

  • option “swap” to support swapping of BIOS drive numbers. This is necessary to boot certain operating systems (DOS, Windows) from a secondary drive.
  • option “file=” to support loading a boot file from the SYSLINUX filesystem instead of loading the boot sector from the drive.
  • option “seg=” to control the load location.
  • option “ntldr=” as a shorthand for “seg=0×2000 file=”; use this to load one of WinNT’s loaders
  • options “freedos=” and “msdos=”/”pcdos=” as shorthands for “seg=0×60 file=” and “seg=0×70 file=” respectively; use this to load FreeDOS’s kernel.sys, MS-DOS’s io.sys or PC-DOS’s ibmbio.sys.
Categories: 开源软件 Tags: , ,

Linux 下读写 FAT 属性信息

March 22nd, 2009 li No comments

FAT 是 Windows 下的文件系统格式。每个 FAT 下的文件都包含 ARHIVE,SYSTEM,HIDDEN,READ-ONLY 等属性。而 Linux 下面缺乏读写 FAT 属性信息的命令,难以读出,或者设置这些 FAT 属性。

而实际上 Linux 内核的 vfat 模块包含相应的 ioctl 命令,可以修改文件的属性。在 <linux/msdos_fs.h> 定义如下:

#define FAT_IOCTL_GET_ATTRIBUTES	_IOR('r', 0x10, __u32)
#define FAT_IOCTL_SET_ATTRIBUTES	_IOW('r', 0x11, __u32)

上述两个 ioctl 命令接受一个 int 类型,该 int 值的不同 bit 位,按照下面的定义表示不同的文件属性:

#define ATTR_RO		1	/* read-only */
#define ATTR_HIDDEN	2	/* hidden */
#define ATTR_SYS	4	/* system */
#define ATTR_VOLUME	8	/* volume label */
#define ATTR_DIR	16	/* directory */
#define ATTR_ARCH	32	/* archived */

由于没有发现有命令可以利用上述 ioctl 接口,操作 FAT 文件的属性,我自己写了一个 attrib.py 文件,代码在最后。该命令接收两个参数,说明如下

Usage: ./attrib.py dir_or_file dump|load

下面的命令将 /mnt/fat 目录下所有子目录和文件的属性输出到文件 attributes.dump 文件中

./attrib.py /mnt/fat dump > attributes.dump

./attrib.py dump 输出的部分内容如下:

A..SHR     ./ntldr
A..SHR     ./NTDETECT.COM
A..SHR     ./boot.ini
A..SHR     ./IO.SYS
A..SHR     ./MSDOS.SYS
.D..H.     ./WINDOWS/inf
.D.S.R     ./WINDOWS/Fonts
.D.SH.     ./WINDOWS/Installer
.D.S..     ./WINDOWS/Tasks
.D.S..     ./WINDOWS/Downloaded Program Files
...SH.     ./WINDOWS/winnt.bmp
...SH.     ./WINDOWS/winnt256.bmp
A...HR     ./WINDOWS/WindowsShell.Manifest
A..S..     ./WINDOWS/bootstat.dat

下面的命令将根据 attributes.dump 文件中包含的属性信息,给 /mnt/fat 目录下所有子目录和文件设置相应的属性

./attrib.py /mnt/fat load < attributes.dump

下面是 attrib.py 的源码:

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/usr/bin/python
import os
import sys
import fcntl
import posixpath
 
ATTR_ARCH = 0x20
ATTR_DIR = 0x10
ATTR_VOLUME = 0x08
ATTR_SYSTEM = 0x04
ATTR_HIDDEN = 0x02
ATTR_RO = 0x01
 
AttrBitName = {
    ATTR_ARCH: 'A',
    ATTR_DIR: 'D',
    ATTR_VOLUME: 'V',
    ATTR_SYSTEM: 'S',
    ATTR_HIDDEN: 'H',
    ATTR_RO: 'R',
}
 
AttrBits = AttrBitName.keys()
AttrBits.sort()
AttrBits.reverse()
 
FAT_GETATTR_IOCTL = 0x80047210
FAT_SETATTR_IOCTL = 0x40047211
 
def fat_getattr(filename):
  fd = os.open(filename, os.O_RDONLY)
  try:
    word = fcntl.ioctl(fd, FAT_GETATTR_IOCTL, '    ')
  except:
    os.close(fd)
    raise
  os.close(fd)
  return ord(word[0])
 
def fat_setattr(filename, attr):
  fd = os.open(filename, os.O_RDONLY)
  word = '%s\0\0\0' % chr(attr)
  try:
    fcntl.ioctl(fd, FAT_SETATTR_IOCTL, word)
  except:
    os.close(fd)
    raise
  os.close(fd)
 
def fat_attrstr(attr):
  bit_to_name = lambda bit: bit &amp; attr and AttrBitName[bit] or '.'
  return ''.join(map(bit_to_name, AttrBits))
 
def fat_strattr(str):
  str_to_bin = lambda x: x[0] == x[1] and '1' or '0'
  bin = ''.join(map(str_to_bin, zip('ADVSHR', str)))
  return int(bin, 2)
 
def fat_dumpattr():
  for cur, dirs, files in os.walk('.'):
    items = dirs + files
    for item in items:
      try:
        filename = '%s/%s' % (cur, item)
        attr = fat_getattr(filename)
        str = fat_attrstr(attr)
        print '%s     %s' % (str, filename)
      except Exception, e:
        print e
 
def fat_loadattr():
  for line in sys.stdin.readlines():
    str = line[:6]
    file = line[6:].strip()
    if posixpath.exists(file):
      newattr = fat_strattr(str)
      oldattr = fat_getattr(file)
      if newattr == oldattr:
        print 'ignore same attribute %s[0x%02x]: %s' % (str, newattr, file)
      else:
        oldstr = fat_attrstr(oldattr)
        fat_setattr(file, newattr)
        print '-%s[0x%02X] +%s[0x%02X] %s' % (oldstr, oldattr, str, newattr, file)
    else:
      print 'ignore not existing file: %s' % file
 
def usage():
  print 'Usage: %s dir_or_file dump|load' % sys.argv[0]
  exit(1)
 
if len(sys.argv) != 3:
  usage()
 
target_dir = sys.argv[1]
old_dir = os.getcwd()
try:
  os.chdir(target_dir)
except:
  print 'Bad directory: %s' % target_dir
  usage()
 
 
op = sys.argv[2]
if op == 'dump':
  fat_dumpattr()
elif op == 'load':
  fat_loadattr()
else:
  print 'Bad option: %s' % op
  usage()
 
os.chdir(old_dir)
Categories: 开源软件 Tags: ,

Debian下网卡对802.1Q VLAN的支持

October 14th, 2008 li No comments

现在的交换机大部分都支持802.1Q VLAN了, 通过VLAN可以将一个交换机上的不同端口分隔成隔离的链路, 也可以将多个交换机上的端口连接到同一个链路.

有时候, 我们可能希望一台机器同时连入多个VLAN, 最好是通过一块网卡. 也就是说, 让一个网络端口同时属于多个VLAN. 要实现这样的功能, 需要做两个方面的配置:

交换机配置

首先要把该主机对应的交换机端口设置为混合端口, 只有混合端口可以同时加入多个VLAN, 下面是Huawei交换机的配置片段:

interface Ethernet0/1
port link-type hybrid
port hybrid vlan 10 20 tagged
port hybrid pvid vlan 10

上述配置让交换机的1号端口成为混合端口, 并同时加入id号为10和20的VLAN, 主VLAN号是10.

Debian主机配置

首先需要在Debian上安装vlan配置工具.

apt-get install vlan

然后, 我们可以在Debian的网络配置文件中, 配置每个VLAN对应的网卡. 下面是/etc/network/interfaces文件的片段:

auto eth0.10
iface eth0.10 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.254

iface eth0.20 inet static
address 192.168.2.10 
netmask 255.255.255.0

上述配置文件配置的主机, 分别有两块虚拟网卡eth0.10, eth0.20, 对应VLAN 10和VLAN 20所在的网络.

除了配置文件之外, 管理员还可以通过vconfig命令, 增加或者删除VLAN.

Categories: 开源软件 Tags: , , ,

Linux下设置主机的FQDN

October 13th, 2008 li No comments

FQDN是Fully Qualified Domain Name的缩写, 含义是完整的域名. 例如, 一台机器主机名(hostname)是www, 域后缀(domain)是example.com, 那么该主机的FQDN应该是www.example.com.

题外话, 其实FQDN最后是以"."来结尾的, 但是大部分的应用和服务器都允许忽略最后这个点.

Linux允许用户通过hostname命令查看并设置主机名. 用户也可以通过hostname -f命令得到该主机的FQDN. 但是, 却没有直接设置FQDN的命令.

实际上, 设置Linux的FQDN可以通过两种方法实现.

第一种, /etc/hostname + /etc/hosts文件组合

首先在/etc/hostname文件中设置主机名, 假设是

www

然后在/etc/hosts文件中增加一行主机记录, 第一个字段是该主机的IP地址, 第二个字段是你希望设置的FQDN, 最后是刚刚设置的主机名, 如下

A.B.C.D www.example.com www

设置好之后, 通过hostname -F /etc/hostname更新主机名. 这时, 通过hostname -f看到的FQDN就应该是: www.example.com

第二种, /etc/hostname + /etc/resolv.conf组合

如果Linux不能在/etc/hosts文件中找到hostname对应的记录, 就会试图从resolv.conf文件中得到主机的域名后缀(domain name). 例如, 这样的/etc/resolv.conf文件

domain example.com
search example.com
nameserver W.X.Y.Z

根据配置文件中的domain后缀example.com, 加上主机名www, Linux会试图自动拼接成一个候选FQDN: www.example.com. 但这个候选FQDN还需要进一步验证.

Linux通过DNS服务器W.X.Y.Z解析候选FQDN, 如果解析失败, 生成FQDN过程就失败了. 如果解析成功, 则会返回www.example.com这个域名的正式名称. 也就是说, 如果在DNS服务器的记录中, www.example.com这个域名是指向server.example.com的CNAME记录的话, 而server.example.com才是A记录. 返回的FQDN就是server.example.com, 而不是www.example.com.

以上就是Linux下设置FQDN的方法.

Categories: 开源软件 Tags: , ,