config-pxe.sh 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. #!/bin/bash
  2. set -e
  3. # 检查软件安装
  4. function check_package() {
  5. if ! dpkg -l | grep isc-dhcp-server; then
  6. sudo apt install -y isc-dhcp-server
  7. fi
  8. if ! dpkg -l | grep tftpd-hpa; then
  9. sudo apt install -y tftpd-hpa
  10. fi
  11. if ! dpkg -l | grep tftp-hpa; then
  12. sudo apt install -y tftp-hpa
  13. fi
  14. if ! dpkg -l | grep nfs-kernel-server; then
  15. sudo apt install -y nfs-kernel-server
  16. fi
  17. }
  18. # 重启服务
  19. function restart_service() {
  20. sudo systemctl restart tftpd-hpa.service nfs-kernel-server.service isc-dhcp-server.service
  21. # sudo systemctl status tftpd-hpa.service nfs-kernel-server.service isc-dhcp-server.service
  22. # sudo systemctl enable tftpd-hpa.service nfs-kernel-server.service isc-dhcp-server.service
  23. # for s in tftpd-hpa.service nfs-kernel-server.service isc-dhcp-server.service; do
  24. # STATUS=$(systemctl status $s | grep Active | awk '{print $2}')
  25. # # echo -e "$s\t$STATUS"
  26. # if [ ! $STATUS = "active" ]; then
  27. # sudo systemctl restart $s
  28. # fi
  29. # done
  30. }
  31. # 获取有线网卡
  32. function get_lan_interface() {
  33. # 获取有线网卡(如:enp0s25,enp4s0),目前以 e开头作为判断条件,需要再找找更精准的方法,或者做成选择项
  34. IFACE_LAN=$(LANG=en ip link | awk -F '[ :]' '{print $3}' | grep "^e")
  35. echo ${IFACE_LAN}
  36. }
  37. # 配置静态IP地址
  38. function config_static_ipaddr() {
  39. IFACE_LAN=$(get_lan_interface)
  40. echo "IFACE_LAN=${IFACE_LAN}"
  41. # 备份原配置文件
  42. CONFIG_FILE=/etc/netplan/01-network-manager-all.yaml
  43. if [ ! -f ${CONFIG_FILE}.bak ]; then
  44. sudo cp -v ${CONFIG_FILE}{,.bak}
  45. fi
  46. IPADDR=10.0.0.10
  47. GATEWAY=10.0.0.1
  48. DNS=10.0.0.10
  49. echo "IPADDR=${IPADDR}, GATEWAY=${GATEWAY}, DNS=${DNS}"
  50. CONNECT_NAME="pxe"
  51. nmcli c add type ethernet con-name ${CONNECT_NAME} ifname ${IFACE_LAN} ipv4.addr ${IPADDR}/24 ipv4.gateway ${GATEWAY} ipv4.method manual
  52. sudo nmcli c up ${CONNECT_NAME}
  53. }
  54. # 配置 tftpd-hpa
  55. function config_tftp_server() {
  56. # tftp 路径
  57. TFTP_PATH=/opt/pxe/
  58. sudo rsync -rR -v ./opt/pxe /
  59. sudo chmod 777 -R "${TFTP_PATH}"
  60. # tftp 配置文件
  61. CONFIG_FILE=/etc/default/tftpd-hpa
  62. if [ ! -f ${CONFIG_FILE}.bak ]; then
  63. sudo cp -v ${CONFIG_FILE}{,.bak}
  64. fi
  65. echo "=== tftp config file: ${CONFIG_FILE} ==="
  66. sudo tee ${CONFIG_FILE} <<EOF
  67. TFTP_USERNAME="tftp"
  68. TFTP_DIRECTORY="${TFTP_PATH}"
  69. TFTP_ADDRESS=":69"
  70. RUN_DAEMON="yes"
  71. TFTP_OPTIONS="-l -c -s -vv"
  72. EOF
  73. sudo systemctl restart tftpd-hpa.service
  74. }
  75. # 测试 tftp
  76. function test_tftp_server() {
  77. pushd /tmp >/dev/null
  78. tftp 127.0.0.1 -c get netbootx64.efi
  79. if [ -f netbootx64.efi ]; then
  80. echo "tftp get netbootx64.efi success!"
  81. else
  82. echo "tftp failed!"
  83. fi
  84. popd >/dev/null
  85. }
  86. # 配置 nfs-kernel-server
  87. function config_nfs_server() {
  88. # nfs 路径
  89. NFS_PATH=/opt/pxe
  90. if [ ! -d "${NFS_PATH}" ]; then
  91. sudo mkdir -p "${NFS_PATH}"
  92. sudo chmod 777 -R "${NFS_PATH}"
  93. fi
  94. # nfs 配置文件
  95. CONFIG_FILE=/etc/exports
  96. if [ ! -f ${CONFIG_FILE}.bak ]; then
  97. sudo cp -v ${CONFIG_FILE}{,.bak}
  98. fi
  99. echo "=== nfs config file: ${CONFIG_FILE} ==="
  100. sudo tee ${CONFIG_FILE} <<EOF
  101. ${NFS_PATH}/ *(rw,sync,no_root_squash,no_subtree_check)
  102. EOF
  103. echo ""
  104. sudo systemctl restart nfs-kernel-server.service
  105. showmount --exports
  106. }
  107. # 配置dhcp server
  108. function config_dhcp_server() {
  109. DHCP_FILE=/etc/default/isc-dhcp-server
  110. if [ ! -f ${DHCP_FILE}.bak ]; then
  111. sudo cp -v ${DHCP_FILE}{,.bak}
  112. fi
  113. sudo sed -i "/INTERFACESv4/c INTERFACESv4=\"$(get_lan_interface)\"" ${DHCP_FILE}
  114. sudo sed -i "/^INTERFACESv6/ {s/^/#/}" ${DHCP_FILE}
  115. # dhcpd 配置文件
  116. CONFIG_FILE=/etc/dhcp/dhcpd.conf
  117. if [ ! -f ${CONFIG_FILE}.bak ]; then
  118. sudo cp -v ${CONFIG_FILE}{,.bak}
  119. fi
  120. echo "=== dhcp config file: ${CONFIG_FILE} ==="
  121. sudo tee ${CONFIG_FILE} <<EOF
  122. ddns-update-style none;
  123. ignore client-updates;
  124. default-lease-time 600;
  125. max-lease-time 7200;
  126. log-facility local7;
  127. option space PXE;
  128. allow booting;
  129. allow bootp;
  130. option client-system-arch code 93 = unsigned integer 16;
  131. subnet 10.0.0.0 netmask 255.255.255.0 {
  132. range dynamic-bootp 10.0.0.100 10.0.0.200;
  133. option broadcast-address 10.0.0.255;
  134. option subnet-mask 255.255.255.0;
  135. option routers 10.0.0.10;
  136. option domain-name "kylin.com";
  137. option domain-name-servers 10.0.0.10;
  138. next-server 10.0.0.10;
  139. if option client-system-arch = 00:07 or option client-system-arch = 00:09 {
  140. filename "netbootx64.efi";
  141. } elsif option client-system-arch = 00:0B {
  142. filename "netbootaa64.efi";
  143. } elsif option client-system-arch = 00:00 {
  144. filename "pxelinux.0";
  145. }
  146. }
  147. # subnet 172.29.220.0 netmask 255.255.255.0 {
  148. # range dynamic-bootp 172.29.220.15 172.29.220.250;
  149. # option broadcast-address 172.29.220.255;
  150. # option subnet-mask 255.255.255.0;
  151. # option routers 172.29.220.242;
  152. # option domain-name "kylin.com";
  153. # option domain-name-servers 172.29.220.242;
  154. # next-server 172.29.220.242;
  155. # }
  156. # subnet 172.29.0.0 netmask 255.255.0.0 {
  157. # range dynamic-bootp 172.29.220.10 172.29.221.250;
  158. # option broadcast-address 172.29.220.255;
  159. # option subnet-mask 255.255.0.0;
  160. # option routers 172.29.220.242;
  161. # option domain-name "kylin.com";
  162. # option domain-name-servers 172.29.220.242;
  163. # next-server 172.29.220.242;
  164. # }
  165. EOF
  166. sudo systemctl restart isc-dhcp-server.service
  167. }
  168. sudo ls >/dev/null
  169. check_package
  170. # if lsb_release -i | grep -q Raspbian; then
  171. # echo "TODO: config Raspbian"
  172. # else
  173. # config_static_ipaddr
  174. # fi
  175. config_tftp_server
  176. test_tftp_server
  177. config_nfs_server
  178. config_dhcp_server
  179. # restart_service