#based on "pc" configuration # Accepted kernel parameters: # part=root=4,vg=LVM_VG_NAME,swap=4,var=20,home=max # disks=vda,vdb # zerombr !!!USE WITH CAUTION!!! # lang=en_US # pkgs=desktop,salpack # repo=testing repo=other repo=http://... # text # # Install OS instead of upgrade install url --url http://mirrors.aliyun.com/centos/6/os/x86_64/ # System authorization information and root password auth --useshadow --enablemd5 rootpw --iscrypted $1$x.ZTyCr8$.15VIWht2E.VX2MjAziTw. # System bootloader configuration bootloader --append="" --location=mbr --timeout=1 # Firewall configuration (ssh is enabled by default) #firewall --enabled firewall --disabled clearpart --drives=sda --all # Run the Setup Agent on first boot firstboot --enable # System keyboard keyboard us # System language lang en_US.UTF-8 # Installation logging level #logging info # Network information network --bootproto=dhcp --onboot=on #vnc --host=158.197.240.41 --port=5500 # Reboot after installation reboot # SELinux configuration selinux --disabled # System timezone timezone --utc Asia/Shanghai # Services services --disabled=netfs --enabled=network # iSCSI #ignoredisk --interactive #iscsiname iqn.2012-09.test #iscsi --ipaddr=158.197.16.70 --target=iqn.2012-09.sk.upjs.ftp:fedora # Disk partitioning information #part / --bytes-per-inode=4096 --fstype="ext4" --grow --size=1 %packages --ignoremissing dhclient yum yum-utils openssh-clients openssh-server #screen wget rsync which iptables #joe #mc parted -sendmail %end %pre --interpreter /usr/bin/python # SAL's fedora/centos kickstart script import os, sys, re, socket, urllib2 part_names = dict( swap='swap', boot='/boot', var='/var', home='/home', tmp='/tmp', www='/var/www', opt='/opt' ) sys.stdout = open('/tmp/centos.ks', 'wt') spare = 2 # check distribution (el6 or fc20) distro, arch = os.popen('uname -r').read().strip().split('.')[-2:] if distro.startswith("fc"): biosboot = 2 else: biosboot = 0 if arch.endswith('86'): arch = "i386" # boot command line cmd_line = {} for cmd in open('/proc/cmdline').read().strip().split(' '): arg = None if '=' in cmd: cmd, arg = cmd.split('=', 1) cmd_line[cmd] = arg def disksize(*disks): ds = [ int(open('/sys/class/block/%s/size' % x).read().strip())/2048 for x in disks ] print "# disksizes: %s = %s" % (disks, ds) return min(ds) def size(s, disks=None, sum=0): if s in ['', 'max']: if disks is None: return "1 --grow" else: print "# sum=%d kB" % sum return disksize(*disks)-sum if s.endswith('m') or s.endswith('M'): return int(s[:-1]) else: return int(float(s.strip('gG'))*1024) class mk_raid: cntr = -1 def __init__(self, disks): self.disks = disks def add(self, s): raids = [] self.cntr += 1 for i in 0, 1: if self.disks[i]: print "part raid.%d%d --size=%s --ondisk=%s" \ % (self.cntr, i+1, s, self.disks[i]) raids.append("raid.%d%d" % (self.cntr, i+1)) return raids def add_raid1(self, name, s, fstype=""): raids = self.add(s) print "raid %s --level=1 --device=md%d %s %s" \ % (name, self.cntr, fstype, " ".join(raids)) def add_vg(self, vg, s): self.add_raid1("pv.01", s) print "volgroup %s pv.01" % vg def add_part(self, mp, s, fstype='--fstype=ext4'): self.add_raid1(mp, s, fstype) def not_cdrom_or_lun(hd): try: media = open('/sys/block/%s/device/media' % hd, 'r').read().strip() if media=='cdrom': return False except IOError: pass try: model = open('/sys/block/%s/device/model' % hd, 'r').read().strip() if model=='LUNZ': return False except IOError: pass return True def detect_disks(): return [x for x in os.listdir('/sys/block') if (x[0:2] in ['sd','vd','hd']) and not_cdrom_or_lun(x)] def initdisks(disks): if 'zerombr' in cmd_line: print "zerombr" if disks: print "clearpart --all --initlabel --drives=%s" \ % ','.join([x for x in disks if x]) else: print "clearpart --all --initlabel" def autopartition(disks, parts): if disks and disks.startswith("iscsi:"): #print "ignoredisk --interactive" print "iscsiname iqn.2012-09.test" print "iscsi --ipaddr=%s --target=%s --user=%s --password=%s" \ % tuple(disks[6:].split(";", 3)) return if not parts: return if disks: print "ignoredisk --only-use=%s" % disks.strip(',') disks = disks.split(',') else: disks = detect_disks() parts = [x.split('=', 1) for x in parts.split(',')] vg = None if len(disks)==1: # one disk partition scheme disk0 = disks[0] for key, value in parts: if ':' in value: fstype = "--fstype=%s" % value.split(':', 1)[1] value = value.split(':', 1)[0] elif key=='swap': fstype = '' elif distro=='el7': fstype = '--fstype=xfs' else: fstype = '--fstype=ext4' if key=='vg': vg = value print "part pv.01 --ondisk=%s --size=1 --grow" % disk0 print "volgroup %s pv.01" % vg elif key=='root': initdisks(disks) if biosboot>0: print "part biosboot --fstype=biosboot --ondisk=%s --size=%d" \ % (disk0, biosboot) print "part / --ondisk=%s %s --size=%d" \ % (disk0, fstype, size(value)) elif key in part_names: if vg: print "logvol %s --vgname=%s --size=%s --name=%s %s" \ % (part_names[key], vg, size(value), key, fstype) else: print "part %s --ondisk=%s %s --size=%d" \ % (part_names[key], disk0, fstype, size(value)) elif len(disks)==2: # raid 1 partition scheme sum = spare # 1 disk0 = disks[0] disk1 = disks[1] raid = mk_raid(disks) for key, value in parts: if ':' in value: fstype = "--fstype=%s" %value.split(':', 1)[1] value = value.split(':', 1)[0] elif key=='swap': fstype = '' else: fstype = '--fstype=ext4' print "# key, value, fstype:", key, value, fstype if key=='vg': vg = value # calculate pv size #s = 0 #for k, v in parts: # if k=='vg': # s = 1 # elif s>0: # if v.isdigit(): # s += int(v)*1024 # else: # s += 1 # add pv # --grow disabled in F14 for raid partitions :-( #raid.add_vg(vg, "%d --grow" % s) print "# disk size: %d-%d" % (disksize(*disks), sum) raid.add_vg(vg, "%d" % (disksize(*disks)-sum)) elif key=='root': initdisks(disks) if biosboot>0: print "part biosboot --fstype=biosboot --ondisk=%s --size=%d" \ % (disk0, biosboot) print "part biosboot --fstype=biosboot --ondisk=%s --size=%d" \ % (disk1, biosboot) sum += biosboot s = size(value, disks, sum) raid.add_part("/", s, fstype) sum += s elif key in part_names: if vg: print "logvol %s --vgname=%s --size=%s --name=%s %s" \ % (part_names[key], vg, size(value), key, fstype) else: s = size(value, disks, sum) raid.add_part(part_names[key], s, fstype) sum += s print "# sum=%d kB" % sum class repocfg_class: el = dict( base = [ 'url --url=%(mirror)s/centos/%(ver)d/os/%(arch)s/', 'repo --name=Updates --baseurl=%(mirror)s/centos/%(ver)d/updates/%(arch)s/', 'repo --name=EPEL --baseurl=%(mirror)s/mirrors/epel/%(ver)d/%(arch)s/' ], testing = [ 'repo --name=EPEL-testing --baseurl=%(mirror)s/mirrors/epel/testing/%(ver)d/%(arch)s/' ] ) all_repos = ('pkgs' in cmd_line) or ('packages' in cmd_line) cmd_line_testing = 'testing' in cmd_line cmd_line_repo = cmd_line.get('repo') cmd_line_packages = cmd_line.get('pkgs') or cmd_line.get('packages') def get(self, distro): grps = getattr(self, distro) ret = grps['base'] if self.cmd_line_testing: ret.extend(grps['testing']) if self.all_repos: ret.extend(grps['other']) return ret def repo_update(self, distro, version, arch): for repo in self.get(distro): if repo.startswith("url") and self.cmd_line_repo: print "url --url=%s" % self.cmd_line_repo else: print repo % dict( mirror="http://ftp.upjs.sk/pub", dir="releases", ver=version, arch=arch ) def geturl(self, url): if "://" not in url: url = os.path.join(os.path.dirname(cmd_line['ks']), url) #return urllib2.urlopen(url).read() return '%include ' + url def package_update(self, distro, version): distro_packages = dict( fc = ["gdisk"], el = ["epel-release"] ) group_packages = dict( desktop = 'desktop.pkgs' ) print "%packages --ignoremissing" print "\n".join(distro_packages.get(distro)) if self.cmd_line_packages: for pkg in self.cmd_line_packages.split(','): if pkg in group_packages: print self.geturl(group_packages[pkg]) else: print pkg print "%end" def lang(lang): if not lang: return langs = dict( en = "en_US", sk = "sk_SK", cs = "cs_CZ" ) if "_" not in lang and lang in langs: lang = langs[lang] if "." not in lang: lang += ".UTF-8" print "lang", lang if "text" in cmd_line: print "text" autopartition( cmd_line.get('disk') or cmd_line.get('disks'), cmd_line.get('part') ) repocfg = repocfg_class() repocfg.repo_update(distro[:2], int(distro[2:]), arch) repocfg.package_update(distro[:2], int(distro[2:])) lang(cmd_line.get('lang')) %end %post --interpreter /bin/bash mkdir -p /root/.ssh echo 'ssh-dss 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 zym@ZYMLinux.net' >> /root/.ssh/authorized_keys chmod 0700 /root/.ssh /root/.ssh/authorized_keys #chkconfig network on #chkconfig postfix on sync %end %include /tmp/centos.ks %packages --nobase %end