美文网首页
pxe安装最小

pxe安装最小

作者: dreamscd | 来源:发表于2019-10-10 16:40 被阅读0次

    要使用pxe安装需要的准备(centos7作服务器):

    • 要安装系统的光盘

    这个没有什么说的,买的实体光盘,下载的iso(注意hash)

    • pxe启动文件
    这里使用的是ipxe,个人觉得ipxe的启动更方便定制,可用来安装linux,windows(启动pe来安装,也可兼容WDS)
    ipxe-7zfile.png

    之前在centos安装中提到

    cd ipxexxxxx/src
    vim demo.ipxe
        #!ipxe
        ifopen
        chain tftp://${next-server}/boot/menu.txt || shell
    
    make bin/undionly.kpxe EMBED=demo.ipxe
    cp bin/undionly.kpxe /var/lib/tftpboot/
    
    

    上面图片下载后改为7z可得到编译好的文件ipxe.pxe和undionly.kpxe

    /var/lib/tftpboot/
    ├── boot
    │   ├── bcd
    │   ├── fonts
    │   │   ├── chs_boot.ttf
    │   │   └── wgl4_boot.ttf
    │   ├── initrd.img
    │   ├── menu.txt
    │   ├── pe32.wim
    │   ├── pe64.wim
    │   ├── vmlinuz
    │   ├── wimboot
    │   └── zh-cn
    │       ├── bootmgr.exe.mui
    │       └── memtest.exe.mui
    ├── bootmgr.exe
    ├── centos7(安装iso的挂载点)
    ├── initrd.img
    ├── ipxe.pxe
    ├── ksdir
    │   └── 7
    │       └── ks.cfg
    ├── pxeautorun.txt
    ├── undionly.kpxe
    └── vmlinuz
    

    一个简单的文件树

    • dhcp服务器
    [root@localhost tftpboot]# yum install dhcp
    dhcp在安装中最最重要的是提供filename,next-server
    /etc/dhcp/dhcpd.conf
    subnet 192.168.1.0 netmask 255.255.255.0 {
      range 192.168.1.100 192.168.1.200;
      #option domain-name-servers 192.168.1.254;
      #option routers 192.168.1.254;
      #filename "ipxe.pxe";
      filename "undionly.kpxe";#(ipxe.pxe也可以,如果不能启动可以换着试试)
      next-server 192.168.1.254;#(tftp服务器)
    }
    
    • tftp服务器
    [root@localhost ~]# yum install tftp-server
    [root@localhost ~]# cat /usr/lib/systemd/system/tftp.service
    =====================tftp.service===================
    [Unit]
    Description=Tftp Server
    Requires=tftp.socket
    Documentation=man:in.tftpd
    
    [Service]
    ExecStart=/usr/sbin/in.tftpd -s /var/lib/tftpboot
    StandardInput=socket
    
    [Install]
    Also=tftp.socket
    ==================================================
    也没有什么配置,默认启动为
    ExecStart=/usr/sbin/in.tftpd -s /var/lib/tftpboot
    日志在/var/log/message中,但只有成功的请求!
    如果要看更详细的日志,修改/usr/lib/systemd/system/tftp.service中
    ExecStart=/usr/sbin/in.tftpd -sv /var/lib/tftpboot
    修改完后
    [root@localhost ~]# systemctl daemon-reload
    [root@localhost ~]# systemctl restart tftp
    
    tftp服务的工作目录是/var/lib/tftpboot
    
    • ftp/http服务器
    [root@localhost ~]# yum install httpd
    
    =================================
    这时,如果是一台专门的pxe服务器那可以
    1. 将httpd.conf中的
    DocumentRoot "/var/lib/tftpboot"
    <Directory "/var/lib/tftpboot">
            Options Indexes
            AllowOverride All
            Require all granted
    </Directory>
    
    2. 或使用ln
    [root@localhost ~]# ln -s /var/lib/tftpboot /var/www/html
    =================================
    

    而如果有其它http服务在使用,可以使用 Alias

    Alias /pxe "/var/lib/tftpboot"
    
    <Directory "/var/lib/tftpboot">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride all
        Require all granted
    </Directory>
    
    但这样需要调整启动的菜单等等。。(不建议使用)
    

    =================================
    如果一定要这么使用可以采用 VirtualHost

    [root@localhost ~]# vim /etc/httpd/conf/httpd.conf
    #DocumentRoot "/var/www/html"#(注释掉)
    [root@localhost conf.d]# vim /etc/httpd/conf.d/vhost-pxe.conf
    <VirtualHost *:80>
        ServerAdmin admin@abc.com
        DocumentRoot "/var/lib/tftpboot"
        ServerName pxe.abc.com
        ErrorLog "/var/log/httpd/vhost.pxe.abc.com-error_log"
        CustomLog "/var/log/httpd/vhost.pxe.abc.com-access_log" common
        <Directory "/var/lib/tftpboot">
            Options Indexes
            AllowOverride All
            Require all granted
            DirectoryIndex index.html
        </Directory>
    </VirtualHost>
    <VirtualHost *:80>
        ServerAdmin admin@abc.com
        DocumentRoot "/var/www/html"    
        ServerName www.abc.com
        ErrorLog "/var/log/httpd/vhost.www.abc.com-error_log"
        CustomLog "/var/log/httpd/vhost.www.abc.com-access_log" common
    </VirtualHost>
    
    这种基于主机名的虚拟主机,最好将pxe放在第一的位置,这个使用ip访问时默认会访问到pxe的虚拟主机上
    

    以上操作注意selinux和firewall的影响,selinux可以关闭,但实际环境中,防火墙不要关,自行加规则

    mount win10共享(要在“网络文件和文件夹共享”中加上Everyone的权限)

    mount -t cifs -o username=Everyone,vers=2.0 //192.168.2.99/boot /var/lib/tftpboot/boot
    

    pxe-pdhcp

    
    --
    https://github.com/frsyuki/pxe-pdhcp
    wget https://github.com/frsyuki/pxe-pdhcp/archive/master.zip
    [root@localhost pxe-pdhcp-master]# vim pxe-pdhcp.c
    char* nbp_name;
    char* nbp_name_sec;
    void dhcp_reply(struct dhcp_packet *p, struct sockaddr* client_address, socklen_t client_addrlen)
    {
            dtype = get_dhcp_message_type(p);
            printf("type: %d\n",dtype);
            if (check_dhcp_packet(p) == -1) {
                    DBG("got a invalid dhcp packet");
                    return;
            }
            if (dtype == DHCPDISCOVER) {
                    DBG("got a DHCPDISCOVER on dhcp");
                    nbp_name = nbp_name_sec;
            } else if (dtype == DHCPREQUEST) {
                    DBG("got a DHCPREQUEST on dhcp");
                    nbp_name = "boot/menu.txt";
            } else {
                    DBG("got a non-DHCPDISCOVER dhcp packet");
                    return;
            }
    }
    void init_packet(struct dhcp_packet *newp, struct dhcp_packet *oldp, u_char mtype)
    {
            nbp_name = argv[optind];
            nbp_name_sec = nbp_name;
    }
    
    尝试在DHCPREQUEST的时候是不是可以回复/boot/menu.txt---------失败
    结果可以在收到Request的时候发送"boot/menu.txt",但不能启动
    猜测:
    ipxe 启动初始化时会再次发Discover报文,如果这时发"boot/menu.txt"的话,
    就再也不能给第二台提供ipxe文件了-----2019.10.11中
    
    pxe-pdhcp改.png
    ----2019.10.11晚
    猜测是正确的,第一次收到Discover报文时发"ipxe.pxe",客户机会使用ipxe.pxe启动,ipxe.pxe启动后会初始化,
    并进行dhcp,再次发出Discover报文,这时服务器发送"boot/menu.txt"的报文就可以启动。
    同时有两个问题:
    1. 如果这种做,只能为一台客户机提供pxe服务,而且只能启动一次。
    2. 由于这个程序的速度非常快,它的DHCP Offer报文会先dhcp服务器一步发出,最后next-server的地址
       会被dhcp服务器的后续报文覆盖,在menu.txt文件中使用了${next-server}变量将会出错
    如抓包截图所示,如果我们的包能
        a. 在dhcp服务器发出DHCP Offer后,发出filename:ipxe.pxe
        b. 在dhcp服务器第二次发出DHCP Offer后,发出filename:boot/menu.txt,那么就应该能正常启动了。
        c. 在dhcp服务器第二次发出DHCP ACK后,发出一个定义next-server的包来防止被覆盖
    具体有时间去好好看一下大大的源代码再说!!
    
    pxe-pdhcp构想.png

    有时间来就验证

    ipxe

    ======================================================
    使用ipxe
    vim demo.ipxe
    #!ipxe
    ifopen
    echo -n Next-server: && read next-server
    chain tftp://${next-server}/boot/menu.txt || shell

    ipxe-proxy.png

    加上read 可以手动输入正确的next-server地址,但这样必须手动

    相关文章

      网友评论

          本文标题:pxe安装最小

          本文链接:https://www.haomeiwen.com/subject/lagopctx.html