# 树莓派 配置 cobbler [TOC] ## 安装 ```bash # 源码安装 sudo apt install git make python-dev python-setuptools python-cheetah openssl sudo apt install createrepo apache2 python-cheetah python-netaddr python-simplejson python-urlgrabber python-yaml rsync yum-utils libapache2-mod-wsgi xinetd tftpd tftp python-django sudo a2enmod proxy sudo a2enmod proxy_http sudo a2enmod rewrite sudo a2ensite cobbler.conf sudo apt install make git python3-yaml python3-cheetah python3-netaddr python3-simplejson python3-future python3-distro python3-setuptools python3-sphinx python3-coverage pyflakes3 python3-pycodestyle python3-django git clone https://github.com/cobbler/cobbler.git cd cobbler git checkout release28 ``` 本来Google的方案需要从源码安装,但是尝试了下apt, 发现有现成的包,~~所以简单太多了~~ 版本太老,有额外的问题要处理. ```bash sudo apt install cobbler cobbler-web xinetd # 安装过程中会让输密码 # 该包是2.6.6版本 有点老,现在来说有好几个bug # cobbler-web 有bug, 不兼容新的 sudo pip install Django==1.8.9 ``` ![image-20200712010915940](https://public.veypi.com/img/screenshot/20200712010915.png) ```bash # 结果输出 Setting up liblwp-protocol-https-perl (6.07-2) ... Setting up debmirror (1:2.32) ... Setting up cobbler (2.6.6+dfsg1-13) ... Considering dependency proxy for proxy_http: Enabling module proxy. Enabling module proxy_http. To activate the new configuration, you need to run: systemctl restart apache2 Module wsgi already enabled Enabling module rewrite. To activate the new configuration, you need to run: systemctl restart apache2 ERROR: Module python does not exist! Enabling site cobbler. To activate the new configuration, you need to run: systemctl reload apache2 Created symlink /etc/systemd/system/multi-user.target.wants/cobbler.service → /lib/systemd/system/cobbler.service. # 在重启前需要配置cobbler ``` ## 配置 ```bash # 配置文件 /etc/cobbler/settings # 自动化部署系统的密码的哈希, 用下行命令生成 # openssl passwd -1 # $1$j9.kasLF$4v5dJWXMDUmxYTXO9qPiG. # 密文第一项 1 指hash方式, 第二项 j9.kasLF 指的salt,这样子用以系统判断密码是否正确但是又不存储密码,密码和salt都相同时才能计算出唯一的密文 default_password_crypted: "$1$j9.kasLF$4v5dJWXMDUmxYTXO9qPiG." # 设置cobbler的ip, 不要设置0.0.0.0,设置一个不隔离广播域的内网ip server: 192.168.1.2 # 设置的tftp ip,用于下载镜像,通常与上一个一样 next_server: 192.168.1.2 # 是否开启DHCP,0不开启 1开启 # 为了启动 pxe, 需要开启dhcp分发地址 并引导系统 到tftp server下载网络启动文件 manage_dhcp: 1 ``` ```bash # 配置DHCP /etc/cobbler/dhcp.template # 不要修改 next-server 项,该配置会自动从上面拉取变量 # 不要修改 #for dhcp_tag in $dhcp_tags.keys(): 这一行之后的内容 subnet 192.168.1.0 netmask 255.255.255.0 { option routers 192.168.1.1; option domain-name-servers 114.114.114.114,8.8.8.8; option subnet-mask 255.255.255.0; filename "/pxelinux.0"; default-lease-time 2.8.0; max-lease-time 43200; next-server $next_server; } # 树莓派版本用的dnsmasq,所以改这个 # 配置DHCP /etc/cobbler/dnsmasq.template ``` cobbler 会将 镜像存储到 /var/lib/cobbler/www/cobbler/ks_mirror/下, 注意容量和权限 ```bash sudo systemctl enable cobbler sudo systemctl start cobbler # 检测 会提示一些操作, 根据需要去做 sudo cobbler check sudo cobbler sync # 会发现该指令报错 缺pxelinux.0等一批loaders ``` Raspberry 安装syslinux ```bash scp CentOS-8.2.2004-x86_64-dvd1.iso pi@x.x.x.x:/home/pi/ ssh pi@x.x.x.x sudo mount -o loop ~/CentOS-8.2.2004-x86_64-dvd1.iso /media/ sudo cp /media/BaseOS/Packages/syslinux-nonlinux-6.04-4.el8.noarch.rpm /tmp sudo apt install rpm2cpio sudo rpm2cpio /tmp/syslinux-nonlinux-6.04-4.el8.noarch.rpm | cpio -idmv sudo cp /tmp/usr/share/syslinux/* /usr/lib/syslinux/ sudo umount /media # 现在正常 sudo cobbler sync ``` ## 导入镜像 ```bash # http://mirrors.aliyun.com/centos 下载镜像, 下载minimal版方便测试 sudo mkdir /mnt/centos_mini sudo mount -t iso9660 -o loop,ro ~/CentOS-8.2.2004-x86_64-dvd1.iso /mnt/centos_mini sudo cobbler import --name=centos8-mini --arch=x86_64 --path=/mnt/centos_mini # 出现这个问题 task started: 2020-07-12_041754_import task started (id=Media import, time=Sun Jul 12 04:17:54 2020) No signature matched in /var/lib/cobbler/www/cobbler/ks_mirror/centos8-x86_64 !!! TASK FAILED !!! # 使用该指令之后再导入一次 sudo cobbler signature update sudo cobbler import --name=centos8-mini --arch=x86_64 --path=/mnt/centos_mini # 出现这个问题 Exception occured: Exception value: 'default_kickstart' Exception Info: File "/usr/lib/python2.7/dist-packages/cobbler/remote.py", line 87, in run rc = self._run(self) File "/usr/lib/python2.7/dist-packages/cobbler/remote.py", line 231, in runner self.logger File "/usr/lib/python2.7/dist-packages/cobbler/api.py", line 938, in import_tree return import_module.run(path,mirror_name,network_root,kickstart_file,arch,breed,os_version) File "/usr/lib/python2.7/dist-packages/cobbler/modules/manage_import_signatures.py", line 132, in run self.signature = self.scan_signatures() File "/usr/lib/python2.7/dist-packages/cobbler/modules/manage_import_signatures.py", line 192, in scan_signatures self.kickstart_file = sigdata["breeds"][breed][version]["default_kickstart"] # 找到 distro_signatures 文件, 替换 default_autoinstall 为 default_kickstart sudo vim /var/lib/cobbler/distro_signatures.json :%s/default_autoinstall/default_kickstart/ sudo cobbler import --name=centos8-mini --arch=x86_64 --path=/mnt/centos_mini ## 出现错误 creating new profile: cobbler-centos8-x86_64 Exception occured: Exception value: 'kickstart not found: None' Exception Info: File "/usr/lib/python2.7/dist-packages/cobbler/remote.py", line 87, in run rc = self._run(self) File "/usr/lib/python2.7/dist-packages/cobbler/remote.py", line 231, in runner self.logger File "/usr/lib/python2.7/dist-packages/cobbler/api.py", line 938, in import_tree return import_module.run(path,mirror_name,network_root,kickstart_file,arch,breed,os_version) File "/usr/lib/python2.7/dist-packages/cobbler/modules/manage_import_signatures.py", line 140, in run os.path.walk(self.path, self.distro_adder, distros_added) File "/usr/lib/python2.7/posixpath.py", line 239, in walk walk(name, func, arg) File "/usr/lib/python2.7/posixpath.py", line 239, in walk walk(name, func, arg) File "/usr/lib/python2.7/posixpath.py", line 231, in walk func(arg, top, names) File "/usr/lib/python2.7/dist-packages/cobbler/modules/manage_import_signatures.py", line 255, in distro_adder adtls.append(self.add_entry(dirname,kernel,initrd)) File "/usr/lib/python2.7/dist-packages/cobbler/modules/manage_import_signatures.py", line 349, in add_entry profile.set_kickstart(self.kickstart_file) File "/usr/lib/python2.7/dist-packages/cobbler/item_profile.py", line 211, in set_kickstart raise CX(_("kickstart not found: %s") % kickstart) !!! TASK FAILED !!! # 尝试查询distro, 发现centos已经导入,但是没有profile sudo cobbler distro list # 返回 # cobbler-centos8-mini-x86_64 sudo cobbler profile list # 没有返回任何profile,中间出现了错误 导入distro成功但配置profile失败 # 手动删除 distro sudo cobbler distro remove --name=cobbler-centos8-mini-x86_64 # 现在我们检查到底出什么错 sudo vim /usr/lib/python2.7/dist-packages/cobbler/item_profile.py # 211行 如下图所示 修改,打印出到底是什么 # 重新导入 输出为 creating new profile: cobbler-centos8-mini-x86_64 Exception occured: Exception value: 'kickstart not found: sample.ks' Exception Info: File "/usr/lib/python2.7/dist-packages/cobbler/remote.py", line 87, in run rc = self._run(self) ....... File "/usr/lib/python2.7/dist-packages/cobbler/item_profile.py", line 212, in set_kickstart raise CX(_("kickstart not found: %s") % temp) !!! TASK FAILED !!! # 看来是sample.ks 未找到 # find_kickstart() 函数为 def find_kickstart(url): """ Check if a kickstart url looks like an http, ftp, nfs or local path. If a local path is used, cobbler will copy the kickstart and serve it over http. Return None if the url format does not look valid. """ if url is None: return None x = url.lstrip() for y in ["http://", "nfs://", "ftp://", "/"]: # make sure we get a lower-case protocol without # affecting the rest of the string x = re.sub(r"(?i)%s" % y, y, x, count=1) if x.startswith(y): if x.startswith("/") and not os.path.isfile(x): return None return x return None # 明显输入为'sample.ks'时输出为None, 推测是未给url加绝对路径,文件在/var/lib/cobbler/kickstarts/sample.ks # /usr/lib/python2.7/dist-packages/cobbler/modules/manage_import_signatures.py: 192 直接读取并没有添加,所以需要我们自己手动添加 sudo vim /var/lib/cobbler/distro_signatures.json :%s/sample.ks/\/var\/lib\/cobbler\/kickstarts\/sample.ks/ # 重新导入, 一次成功 sudo cobbler import --name=centos8-mini --arch=x86_64 --path=/mnt/centos_mini # 输出 ➜ test sudo cobbler distro list cobbler-centos8-mini-x86_64 ➜ test sudo cobbler profile list cobbler-centos8-mini-x86_64 ➜ test sudo cobbler distro report --name=cobbler-centos8-mini-x86_64 Name : cobbler-centos8-mini-x86_64 Architecture : x86_64 TFTP Boot Files : {} Breed : redhat Comment : Fetchable Files : {} Initrd : /var/lib/cobbler/www/cobbler/ks_mirror/centos8-mini-x86_64/images/pxeboot/initrd.img Kernel : /var/lib/cobbler/www/cobbler/ks_mirror/centos8-mini-x86_64/images/pxeboot/vmlinuz Kernel Options : {} Kernel Options (Post Install) : {} Kickstart Metadata : {'tree': 'http://@@http_server@@/cblr/links/cobbler-centos8-mini-x86_64'} Management Classes : [] OS Version : rhel8 Owners : ['admin'] Red Hat Management Key : <> Red Hat Management Server : <> Template Files : {} ➜ test sudo cobbler profile report --name=cobbler-centos8-mini-x86_64 Name : cobbler-centos8-mini-x86_64 TFTP Boot Files : {} Comment : DHCP Tag : default Distribution : cobbler-centos8-mini-x86_64 Enable gPXE? : 0 Enable PXE Menu? : 1 Fetchable Files : {} Kernel Options : {} Kernel Options (Post Install) : {} Kickstart : /var/lib/cobbler/kickstarts/sample.ks Kickstart Metadata : {} Management Classes : [] Management Parameters : <> Name Servers : [] Name Servers Search Path : [] Owners : ['admin'] Parent Profile : Internal proxy : Red Hat Management Key : <> Red Hat Management Server : <> Repos : [] Server Override : <> Template Files : {} Virt Auto Boot : 1 Virt Bridge : virbr0 Virt CPUs : 1 Virt Disk Driver Type : raw Virt File Size(GB) : 5 Virt Path : Virt RAM (MB) : 512 Virt Type : kvm ``` ![image-20200714013540086](https://public.veypi.com/img/screenshot/20200714013540.png) 修改centos用的kickstart文件 ```bash cd /var/lib/cobbler/kickstarts/ sudo cp sample.ks centos8.ks sudo cobbler profile edit --name=cobbler-centos8-mini-x86_64 --kickstart=/var/lib/cobbler/kickstarts/centos8.ks # 验证 sudo cobbler profile report --name=cobbler-centos8-mini-x86_64 | grep kickstart # 同步 sudo cobbler sync ``` ## Centos8.ks ```bash #platform=x86, AMD64, or Intel EM64T #os=centos8 # Install OS instead of upgrade install # Use text mode install text # System keyboard keyboard us # System language lang en_US # System timezone timezone Asia/ShangHai # System authorization information # centos8 已经将authconfig 更新为authselect # auth --useshadow --enablemd5 authselect --enableshadow --passlgo=sha512 #Root password rootpw --iscrypted $default_password_crypted # Firewall configuration firewall --disabled # SELinux configuration selinux --disabled # Use network installation url --url=$tree # Clear the Master Boot Record zerombr # System bootloader configuration # bootloader --location=mbr # interface can be named as eth* bootloader --location=mbr --append="net.ifnames=0 biosdevname=0 rhgb quiet" # Partition clearing information clearpart --all --initlabel # Allow anaconda to partition the system as needed autopart # or # # create 1MB biosboot type partition, centos7 and centos8 . # part biosboot --fstype=biosboot --size=1 # # Disk partitioning information # part /boot --fstype=xfs --size=300 # part pv.122 --fstype="lvmpv" --grow # volgroup VolGroup00 --pesize=16384 pv.122 # logvol / --fstype="xfs" --size=10000 --name=LogVol00 --vgname=VolGroup00 # If any cobbler repo definitions were referenced in the kickstart profile, include them here. $yum_repo_stanza # add repo manually # repo --name="AppStream" --baseurl=file:///run/install/repo/AppStream # Network information $SNIPPET('network_config') # Do not configure the X Window System skipx # Run the Setup Agent on first boot firstboot --disable # Reboot after installation reboot %pre $SNIPPET('log_ks_pre') $SNIPPET('kickstart_start') $SNIPPET('pre_install_network_config') # Enable installation monitoring $SNIPPET('pre_anamon') %end %packages $SNIPPET('func_install_if_enabled') # if you need puppet to install pkgs, just uncomment it # $SNIPPET('puppet_install_if_enabled') @core @base tree nmap wget telnet %end %post --nochroot $SNIPPET('log_ks_post_nochroot') %end %post $SNIPPET('log_ks_post') # Start yum configuration $yum_config_stanza # End yum configuration $('post_install_kernel_options') $SNIPPET('post_install_network_config') $SNIPPET('func_register_if_enabled') $SNIPPET('puppet_register_if_enabled') $SNIPPET('download_config_files') $SNIPPET('koan_environment') $SNIPPET('redhat_register') $SNIPPET('cobbler_register') # Enable post-install boot notification $SNIPPET('post_anamon') # Start final steps $SNIPPET('kickstart_done') # End final steps %end ``` ## 验证 - failed to load ldlinux.c32 ![image-20200714060726959](https://public.veypi.com/img/screenshot/20200714060727.png) ```bash sudo cp /usr/lib/syslinux/ldlinux.c32 /var/lib/cobbler/tftp/ ``` - Failed to load libutil.c32 failed to load COM32 file menu.c32 ![image-20200714061319612](https://public.veypi.com/img/screenshot/20200714061319.png) ```bash sudo cp /usr/lib/syslinux/libutil.c32 /var/lib/cobbler/tftp/ sudo cp /usr/lib/syslinux/menu.c32 /var/lib/cobbler/tftp/ ``` - 暂时成功 ![image-20200714061640172](https://public.veypi.com/img/screenshot/20200714061640.png) - failed to fetch kickstart from http://.../cblr/svc/op/ks/profile/cobbler-centos8-mini-x86_x64 dracut-initqueue[944]: Warning: dracut-initqueue timeout ![image-20200714062152172](https://public.veypi.com/img/screenshot/20200714062152.png) ```bash # 又是版本不对应的锅 # apache2 升级到2.4之后之前的的配置不能通过授权 sudo vim /etc/apache2/apache2.conf Options FollowSymLinks AllowOverride None #Require all denied Require all granted # 查看日志有错误 Tue Jul 14 08:18:54 2020 - INFO | Exception occured: Tue Jul 14 08:18:54 2020 - INFO | Exception value: 'Error templating file, check cobbler.log for more details' Tue Jul 14 08:18:54 2020 - INFO | Exception Info: File "/usr/lib/python2.7/dist-packages/cobbler/remote.py", line 1062, in generate_kickstart return self.api.generate_kickstart(profile,system) File "/usr/lib/python2.7/dist-packages/cobbler/api.py", line 696, in generate_kickstart return self.kickgen.generate_kickstart_for_profile(profile) File "/usr/lib/python2.7/dist-packages/cobbler/kickgen.py", line 312, in generate_kickstart_for_profile return self.generate_kickstart(profile=g) File "/usr/lib/python2.7/dist-packages/cobbler/kickgen.py", line 290, in generate_kickstart data = self.templar.render(raw_data, meta, None, obj) File "/usr/lib/python2.7/dist-packages/cobbler/templar.py", line 116, in render data_out = self.render_cheetah(raw_data, search_table, subject) File "/usr/lib/python2.7/dist-packages/cobbler/templar.py", line 215, in render_cheetah raise CX("Error templating file, check cobbler.log for more details") # 修改该文件37行 sudo vim /usr/lib/python2.7/dist-packages/cobbler/templar.py # 改为: fix_cheetah_class = (int(major), int(minor), int(release)) >= (2, 4, 2) ``` - 系统安装中出现一些异常 pykickstart.errors.KickstartError: /usr/sbin/authconfig is missing ![image-20200714085059931](https://public.veypi.com/img/screenshot/20200714085100.png) ```bash # 该问题是centos 8 没有authconfig指令了,更新为了 authselect # 更改ks文件,将auth 行 换成authselect ``` - missing packages: 配置本地源即可解决 - ![image-20200714184027547](https://public.veypi.com/img/screenshot/20200714184027.png) - sbin/dmsquash-live-root: line 273: write error: No space left on device ​ 确保虚拟机有至少2g内存 - pyanaconda.payload.PayloadError: Payload error - DNF installation has ended up abruptly: No available modular metadata for modular package Traceback Dnf.exceptions.Error: No available modular metadata for modular package ![image-20200714233216115](https://public.veypi.com/img/screenshot/20200714233216.png) ## 配置 centos8 本地源 ```bash sudo apt install yum-utils # 添加 sudo cobbler repo add --name=Centos8-BaseOS --mirror=http://mirrors.aliyun.com/centos/8.2.2004/BaseOS/x86_64/os/ --arch=x86_64 --breed=yum sudo cobbler repo add --name=Centos8-AppStream --mirror=http://mirrors.aliyun.com/centos/8.2.2004/AppStream/x86_64/os/ --arch=x86_64 --breed=yum sudo cobbler repo add --name=Centos8-extras --mirror=http://mirrors.aliyun.com/centos/8.2.2004/extras/x86_64/os/ --arch=x86_64 --breed=yum sudo cobbler repo add --name=Centos8-Epel --mirror=http://mirrors.aliyun.com/epel/8/Everything/x86_64/ --arch=x86_64 --breed=yum sudo cobbler repo add --name=Centos8-Openstack-ussuri --mirror=http://mirrors.aliyun.com/centos/8.2.2004/cloud/x86_64/openstack-ussuri/ --arch=x86_64 --breed=yum # 查看 sudo cobbler repo list # 同步 # 需要 sudo apt install yum-utils, 安装完后重启cobbler # 存储在 /var/lib/cobbler/www/cobbler/repo_mirror/ sudo cobbler reposync sudo cobbler profile edit --name=cobbler-centos8-mini-x86_64 --repos='Centos8-BaseOS Centos8-AppStream Centos8-extras Centos8-Epel Centos8-Openstack-ussuri' # 或者手动在ks文件里添加 # repo --name="BaseOS" --baseurl=http://192.168.10.50/cblr/repo_mirror/Centos8-BaseOS/ ``` --------------- [1]: http://cobbler.github.io [2]: https://cobbler.readthedocs.io/en/latest/ [3]: https://bashtheshell.com/guide/setting-up-pxe-boot-server-on-raspberry-pi/ [4]: http://wiki.inford.net/使用树莓派3构建PXE服务器自动安装操作系统 [5]: https://blog.51cto.com/dyc2005/2130240 [6]: https://www.golinuxcloud.com/rhel-centos-8-kickstart-example-generator/