kickstart 下的 gpt

对于 cobbler 来说,最重要的估计就是 ks 文件的书写了,这个跟 preseed 类似,但是可以精确的划分各个分区,而想要通过 preseed 精确的控制 debian 分区几乎是不可能的,没有经验的话,其最终的结果可能会相差数十倍之多。之前曾经对着 preseed 文件调试了不下百来次,最后的结果依然差强人意。如果磁盘的大小换了,就需要重新书写对应的 preseed,这个基本就是个灾难。对于 ks 来说,则不会存在这类问题。

目前线上的机器小于、大于 2T 的磁盘大概是一半一半的样子,为了维护方便,决定后面所有的机器不管是多大的磁盘都采用 gpt 的方式分区。下面这个是一个范例:

zerombr
bootloader –location=mbr –driveorder=/dev/sda

part /boot –fstype="ext4" –size=150 –ondisk=sda
part / –fstype="ext4" –size=20000 –ondisk=sda
part /var –fstype="ext4" –size=40000 –ondisk=sda
part /home –fstype="ext4" –grow –size=1 –ondisk=sda

part /data/data1 –fstype="ext4" –grow –size=1 –fsoptions="defaults,noatime" –ondisk=sdb

%pre

clearpart –all
/usr/sbin/parted –script /dev/sda mklabel gpt
/usr/sbin/parted –script /dev/sdb mklabel gpt

%end

这个 gist 是一个完整的 ks,根据我们的需求划分了磁盘,服务器的开启关闭以及 post install 方面的一些内容,这个在 gist 里面都做了详细的说明。

cobbler snippet 的使用

cobbler 可以通过 cheetah 来做一些定制话的事情。因此需要严格遵循其语法,可以先参考下 /var/lib/cobbler/snippets/ 目录下的 snippet 是怎么写的。这里面会涉及到很多的变量,可以使用下面这条命令将其 dump 出来:
# cobbler system profile dumpvars --name=jaseywang_profile

这样就可以在 snippet 里面直接引用了。比如我在 snippets/ 目录下面再建立一个 custom/ 目录,专门存放我们自己写的 snippet。
一个标准的 hosts 文件应该像下面这样:
127.0.0.1   localhost.localdomain    localhost
192.168.1.2 system1.jaseywang.me     system1

下面这个 snippet 要做的事情就是完成上面 hosts 的标准:
$ cat /var/lib/cobbler/snippets/custom/hosts
#set $hostname = $getVar('$hostname', None)
#set $hostpart = $hostname.split('.')[0]

#set $ikeys = $interfaces.keys()
#for $iface in $ikeys
#set $idata = $interfaces[$iface]
#set $my_interface_hostname_short = $idata["dns_name"].split('.',1)[:1][0]
#end for

cat > /etc/hosts << EOF
127.0.0.1           localhost.localdomain       localhost
$idata["ip_address"]        $idata["dns_name"].lower()          $my_interface_hostname_short.lower()
EOF

注意其语法,虽然感觉有点奇怪。这样书写好了以后就可以在 ks 的 %post 里面将其添加进去了:
%post

#$SNIPPET('custom/hosts')

以上就完成了一个 post install 的 snippet 的书写,其他的跟以上的类似。

使用 cobbler 2.2.3 遇到的一些问题

我们线上的机器使用 2.2.3 这个版本已经很长一段时间,使用过程中也发现不少问题,包括本篇在内,后续会陆续跟大家分享一下。
要理解 cobbler 的整体架构,可以参见这张截取自官方的图,十分清晰的表明了各个部分的关系。

另外我之前的一篇博客总结过跟 cobbler 相关的所有目录文件的结构,这次官方提供了一个更加详细的。

在 RH 上安装 cobbler/cobblerd 需要如下的软件包,可以通过包管理器(yum)直接安装:
createrepo
httpd(apache2 for Debian/Ubuntu)
mkisofs
mod_wsgi(libapache2-mod-wsgi for Debian/Ubuntu)
python-cheetah
python-netaddr
python-simplejson
python-urlgrabber
PyYAML(python-yaml for Debian/Ubuntu)
rsync
tftp-server(atftpd for Debian/Ubuntu, though others may work)
yum-utils

如果需要安装 cobbler web,还需要如下的包:
Django(python-django for Debian/Ubuntu)

如果需要重新安装系统,则需要 koan 这个包,他依赖于下面的软件包:
python-simplejson
koan
Continue reading

使用 DHCP relay 解决跨网段广播

先来温习下 DHCP 的基础概念。

RHEL 上使用的 DHCP 版本叫 ISC DHCP server,通过 yum 安装 dhcp。sample 配置可以在 /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample 里面找到,参照这个文件修改是个比较快捷有效的方式:
# yum install dhcp
# cp /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample /etc/dhcp/dhcpd.conf

每修改一次 dhcpd.conf 文件,如果要是其生效,需要 restart dhcpd;或者通过 omshell 使其在 on the fly 的过程中生效。dhcpd.conf 中的配置是 case-insensitive 的。下面几个是参考配置。

下面的 option 只对 subnet 192.168.1.0/24 的网段生效:
subnet 192.168.1.0 netmask 255.255.255.0 {
        option routers                          192.168.1.254;
        option subnet-mask                 255.255.255.0;
        option domain-search              "example.com";
        option domain-name-servers   192.168.1.1;
        option time-offset                      -18000;   
        range                                        192.168.1.10 192.168.1.100;
}

下面的 option 对全局生效:
default-lease-time                  600;
max-lease-time                      7200;
option subnet-mask                255.255.255.0;
option broadcast-address      192.168.1.255;
option routers                         192.168.1.254;
option domain-name-servers 192.168.1.1, 192.168.1.2;
option domain-search             "example.com";
subnet 192.168.1.0 netmask 255.255.255.0 {
   range 192.168.1.10 192.168.1.100;
}

指定特定的 host 分配特定的 IP:
host apex {
   option host-name "apex.example.com";
   hardware ethernet 00:A0:78:8E:9E:AA;
   fixed-address        192.168.1.4;
}

如果一台机器有多块网卡,分了多个网段,可以使用 "shared-network" 声明:
shared-network name {
    option domain-search                "test.redhat.com";
    option domain-name-servers      ns1.redhat.com, ns2.redhat.com;
    option routers                             192.168.0.254;
    more parameters for EXAMPLE shared-network
    subnet 192.168.1.0 netmask 255.255.252.0 {
        parameters for subnet
        range 192.168.1.1 192.168.1.254;
    }
    subnet 192.168.2.0 netmask 255.255.252.0 {
        parameters for subnet
        range 192.168.2.1 192.168.2.254;
    }
}

通过 "group" 将某一类给划分起来:
group {
   option routers                              192.168.1.254;
   option subnet-mask                     255.255.255.0;
   option domain-search                  "example.com";
   option domain-name-servers       192.168.1.1;
   option time-offset                         -18000;
   host apex {
      option host-name "apex.example.com";
      hardware ethernet 00:A0:78:8E:9E:AA;
      fixed-address        192.168.1.4;
   }
   host raleigh {
      option host-name "raleigh.example.com";
      hardware ethernet 00:A1:DD:74:C3:F2;
      fixed-address        192.168.1.6;
   }
}

详细的可以 man dhcp-options。

对于 DHCP server 来说,/var/lib/dhcpd/dhcpd.leases 存储着 client 的 lease 信息,该文件由系统自动生成,无需手动修改。像下面这样:
# cat /var/lib/dhcpd/dhcpd.leases
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.1.1-P1

lease 192.168.10.93 {
  starts 4 2013/01/31 09:34:57;
  ends 4 2013/01/31 15:29:19;
  tstp 4 2013/01/31 15:29:19;
  cltt 4 2013/01/31 09:34:57;
  binding state free;
  hardware ethernet 80:b3:1c:32:6e:a5;
  set vendorclass = "PXEClient:Arch:00000:UNDI:002001";
}

需要注意的是,该文件所有跟时间相关的都是使用的 UTC,而非本地时间。

当 dhcpd 第一次启动时,如果没有 dhcpd.leases 文件,手动的 touch 一个 /var/lib/dhcpd/dhcpd.leases 文件,否则会启动失败:
# /sbin/service dhcpd start/stop

如果有多块接口,可以通过下面这个指定特定的接口监听 dhcpd:
# cat /etc/sysconfig/dhcpd
DHCPDARGS=eth0

其余可以在 /etc/sysconfig/dhcpd 里面指定的参数:
-p: 该参数指定了 dhcpd 监听的 UDP port,默认是情况是 server 在 67 port 监听请求,68 port 回复客户端。
-f: dhcpd daemon 默认时 backgroud,该参数使得 dhcpd 跑在 foreground,主要用来 debugging。
-d: 默认 log 发送至 /var/log/messages,该参数使得 log 发送到 stderr。
-q: 启动 daemon 的时候,不打印 copyright 的信息。
-cf: 指定配置文件的位置,默认在 /etc/dhcp/dhcpd.conf。
-lf: 指定 lease db 文件的位置,默认在 /var/lib/dhcpd/dhcpd.leases。

DHCP 的客户端的配置,主要在下面这个文件:
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
还有个 PEERDNS 选项,yes 表示使用 DHCP server 的 push 过来的 DNS,no 表示不修改 /etc/resolv.conf。详细的可以 man dhclient 以及 dhclient.conf。

对于 Multihomed 的 DHCP server 来说,需要指定监听的端口:
DHCPDARGS="eth0 eth1";

另外,需要指定多个 subnet,这些 subnet 要匹配上面指定的端口:
default-lease-time 600;
max-lease-time 7200;
subnet 10.0.0.0 netmask 255.255.255.0 {
    option subnet-mask  255.255.255.0;
    option routers           10.0.0.1;
    range                        10.0.0.5 10.0.0.15;
}
subnet 172.16.0.0 netmask 255.255.255.0 {
    option subnet-mask 255.255.255.0;
    option routers          172.16.0.1;
    range                       172.16.0.5 172.16.0.15;
}
host example0 {
    hardware ethernet 00:1A:6B:6A:2E:0B;
    fixed-address        10.0.0.20;
}
host example1 {
    hardware ethernet 00:1A:6B:6A:2E:0B;
    fixed-address        172.16.0.20;
}

注意:
1. DHCP 不支持 alias 接口(eth0:x)。
2. fixed-address 后面跟的地址要在 range 分配的 IP pool 之外。
3. *nix DHCP server 对 IP 的分配是从高到低的,而 Windows 的则相反。
对于第二点,官方的说法是 fixed-address 的 IP 不能在 range 的范围内,但是我通过 cobbler 指定的地址来看,这个说法实践中却是可以的,也就是说 fixed-address 是可以在 range 范围内的。

下面开始本篇博客的正题,DHCP Relay agent。
DHCP Relay agent(dhcrelay)可以让没有 dhcpd 的网段获取到 dhcp。
下面根据我们的实际情况来实践一下。首先 DHCP server(192.168.1.1) 的机器在 192.168.1.0/24 网段,除此之外,我们还有 192.168.2.0/24, 192.168.3.0/24 等网段,各个网段通过路由连接。最简单的方式是在每一个网段下面部署一个 DHCP server,但是后果就是维护量比较大,并且资源的利用率比较低下。为此,我们可以通过 DHCP relay 的方式来提高资源的利用率,降低维护的成本,这样,我们只需要一个 DHCP server,最多两个(failover),剩下的在每一个网段部署一台 DHCP relay 就好了,由这台 relay 将 client 的广播包 relay 到那台 server 就好了。
Continue reading

使用 Cobbler 安装 Ubuntu 出现的问题

pxe 安装 Ubuntu 10.04,使用 apt-mirror 同步源在内网使用,然后在 preseed 文件上修改的这两段:
d-i mirror/http/hostname string http://your-private-ip
d-i mirror/http/directory string /ubuntu

在使用 iDRAC 打开安装界面,Ctrl+Alt+F4 观察安装的 log 时,发现启动到一定阶段系统没有相应了,出现如下的提示:
cat can't open '/tmp/net-retriever-xxxx-deduplicate/*': No such file or directory.

之前直接使用 mirrors.sohu.com 的源并没有出现问题,初步判定是由于使用了内部源引起的。
G 后发现是使用 apt-mirror 同步源时没有同步 netboot 下面的某些目录, rsync 下面的目录:
deb-amd64 http://mirrors.sohu.com/ubuntu lucid main/installer-amd64
deb-amd64 http://mirrors.sohu.com/ubuntu lucid main/debian-installer restricted/debian-installer universe/debian-installer multiverse/debian-installer
#deb-amd64 http://mirrors.sohu.com/ubuntu lucid-updates main/debian-installer restricted/debian-installer universe/debian-installer
#deb-amd64 http://mirrors.sohu.com/ubuntu lucid-security main/debian-installer restricted/debian-installer universe/debian-installer
Continue reading

Cobbler 下安装 Ubuntu

更新: cobbler 2.2.3 安装 ubuntu 12.04


Cobbler 主要针对的是 RH 系,诸如 Red Hat Enterprise Linux,CentOS,Fedora。但是他也可以用来安装 Debian-based 的版本。

 

1. 下载 Ubuntu 镜像:

# wget http://mirrors.rit.edu/ubuntu-releases/lucid/ubuntu-10.04.2-server-amd64.iso

2. 挂载镜像:

# mount -o loop /home/isos/ubuntu-10.04.2-server-amd64.iso /media

3. 使用 rsync 将 ISO 同步至 /var/www/cobbler/ks_mirror/Ubuntu-lucid-x86_64:

# mkdir /var/www/cobbler/ks_mirror/Ubuntu-lucid-x86_64
# rsync -a /media/ /var/www/cobbler/ks_mirror/Ubuntu-lucid-x86_64 –exclude-from=/etc/cobbler/rsync.exclude
Continue reading