2023-02-15 10:28:31 +08:00
#!/bin/bash
2023-06-22 14:42:39 +08:00
# from
# https://github.com/spiritLHLS/pve
2023-06-23 13:24:10 +08:00
# 2023.06.23
2023-02-15 10:28:31 +08:00
2023-06-23 13:04:04 +08:00
2023-02-15 10:56:06 +08:00
_red( ) { echo -e " \033[31m\033[01m $@ \033[0m " ; }
_green( ) { echo -e " \033[32m\033[01m $@ \033[0m " ; }
_yellow( ) { echo -e " \033[33m\033[01m $@ \033[0m " ; }
_blue( ) { echo -e " \033[36m\033[01m $@ \033[0m " ; }
2023-02-16 21:03:48 +08:00
reading( ) { read -rp " $( _green " $1 " ) " " $2 " ; }
2023-04-26 16:28:30 +08:00
export DEBIAN_FRONTEND = noninteractive
2023-04-27 11:27:30 +08:00
utf8_locale = $( locale -a 2>/dev/null | grep -i -m 1 -E "UTF-8|utf8" )
2023-04-24 08:51:17 +08:00
if [ [ -z " $utf8_locale " ] ] ; then
2023-04-27 11:27:30 +08:00
echo "No UTF-8 locale found"
2023-04-24 08:51:17 +08:00
else
export LC_ALL = " $utf8_locale "
export LANG = " $utf8_locale "
2023-04-27 11:10:44 +08:00
export LANGUAGE = " $utf8_locale "
2023-04-27 11:27:30 +08:00
echo " Locale set to $utf8_locale "
2023-04-24 08:51:17 +08:00
fi
2023-06-03 13:56:04 +08:00
temp_file_apt_fix = "/tmp/apt_fix.txt"
2023-04-24 08:35:54 +08:00
2023-06-22 17:35:25 +08:00
########## 定义部分需要使用的函数和组件预安装
remove_duplicate_lines( ) {
2023-06-23 21:56:54 +08:00
chattr -i " $1 "
2023-06-23 22:04:12 +08:00
# 去除重复行并跳过空行和注释行
2023-06-23 21:56:54 +08:00
if [ -f " $1 " ] ; then
2023-06-23 22:04:12 +08:00
awk '!/^ *#/ && NF { if (!x[$0]++) print }' " $1 " > " $1 .tmp " && mv -f " $1 .tmp " " $1 "
2023-06-23 21:56:54 +08:00
fi
rm -rf " $1 .tmp "
chattr +i " $1 "
2023-06-22 17:35:25 +08:00
}
install_package( ) {
package_name = $1
if command -v $package_name > /dev/null 2>& 1 ; then
_green " $package_name 已经安装 "
2023-06-23 13:04:04 +08:00
_green " $package_name already installed "
2023-06-22 17:35:25 +08:00
else
apt-get install -y $package_name
if [ $? -ne 0 ] ; then
apt-get install -y $package_name --fix-missing
fi
if [ $? -ne 0 ] ; then
_green " $package_name 已尝试安装但失败,退出程序 "
2023-06-23 13:04:04 +08:00
_green " $package_name tried to install but failed, exited the program "
2023-06-22 17:35:25 +08:00
exit 1
fi
_green " $package_name 已尝试安装 "
2023-06-23 13:04:04 +08:00
_green " $package_name tried to install"
2023-04-24 09:01:14 +08:00
fi
}
2023-05-24 14:01:22 +08:00
rebuild_cloud_init( ) {
2023-05-12 10:02:40 +08:00
if [ -f "/etc/cloud/cloud.cfg" ] ; then
2023-05-24 12:14:31 +08:00
chattr -i /etc/cloud/cloud.cfg
2023-05-24 13:28:00 +08:00
if grep -q "preserve_hostname: true" "/etc/cloud/cloud.cfg" ; then
:
else
sed -E -i 's/preserve_hostname:[[:space:]]*false/preserve_hostname: true/g' "/etc/cloud/cloud.cfg"
echo "change preserve_hostname to true"
fi
2023-05-24 13:48:24 +08:00
if grep -q "disable_root: false" "/etc/cloud/cloud.cfg" ; then
:
else
sed -E -i 's/disable_root:[[:space:]]*true/disable_root: false/g' "/etc/cloud/cloud.cfg"
echo "change disable_root to false"
fi
2023-05-24 15:21:19 +08:00
chattr -i /etc/cloud/cloud.cfg
content = $( cat /etc/cloud/cloud.cfg)
2023-05-24 15:39:31 +08:00
line_number = $( grep -n "^system_info:" "/etc/cloud/cloud.cfg" | cut -d ':' -f 1)
2023-05-24 15:21:19 +08:00
if [ -n " $line_number " ] ; then
lines_after_system_info = $( echo " $content " | sed -n " $(( line_number+1)) ,\$p " )
if [ -n " $lines_after_system_info " ] ; then
updated_content = $( echo " $content " | sed " $(( line_number+1)) ,\$d " )
2023-05-24 15:39:31 +08:00
echo " $updated_content " > "/etc/cloud/cloud.cfg"
2023-05-24 15:21:19 +08:00
fi
fi
2023-05-24 15:52:03 +08:00
sed -i '/^\s*- set-passwords/s/^/#/' /etc/cloud/cloud.cfg
2023-05-24 12:14:31 +08:00
chattr +i /etc/cloud/cloud.cfg
2023-05-12 10:02:40 +08:00
fi
2023-05-24 14:01:22 +08:00
}
2023-05-24 13:48:24 +08:00
2023-06-22 17:35:25 +08:00
rebuild_interfaces( ) {
2023-06-23 20:50:16 +08:00
# 修复部分网络运行部分未空
2023-06-22 17:35:25 +08:00
if [ ! -e /run/network/interfaces.d/* ] ; then
2023-06-23 21:31:25 +08:00
if [ -f "/etc/network/interfaces" ] ; then
2023-06-22 17:35:25 +08:00
chattr -i /etc/network/interfaces
2023-06-23 21:31:25 +08:00
if ! grep -q "^#.*source-directory \/run\/network\/interfaces\.d" /etc/network/interfaces; then
sed -i '/source-directory \/run\/network\/interfaces.d/s/^/#/' /etc/network/interfaces
fi
2023-06-22 17:35:25 +08:00
chattr +i /etc/network/interfaces
fi
2023-06-23 21:31:25 +08:00
if [ -f "/etc/network/interfaces.new" ] ; then
2023-06-22 17:35:25 +08:00
chattr -i /etc/network/interfaces.new
2023-06-23 21:31:25 +08:00
if ! grep -q "^#.*source-directory \/run\/network\/interfaces\.d" /etc/network/interfaces.new; then
sed -i '/source-directory \/run\/network\/interfaces.d/s/^/#/' /etc/network/interfaces.new
fi
2023-06-22 17:35:25 +08:00
chattr +i /etc/network/interfaces.new
fi
fi
# 修复部分网络加载没实时加载
if [ [ -f "/etc/network/interfaces.new" && -f "/etc/network/interfaces" ] ] ; then
chattr -i /etc/network/interfaces
cp -f /etc/network/interfaces.new /etc/network/interfaces
chattr +i /etc/network/interfaces
fi
2023-06-23 13:04:04 +08:00
# 合并文件
2023-06-22 17:35:25 +08:00
if [ [ -f "/etc/network/interfaces.d/50-cloud-init" && -f "/etc/network/interfaces" ] ] ; then
2023-06-23 20:44:38 +08:00
if [ ! -f "/etc/network/interfaces" ] ; then
2023-06-23 13:04:04 +08:00
touch /etc/network/interfaces
2023-06-22 17:35:25 +08:00
fi
2023-06-23 13:04:04 +08:00
chattr -i /etc/network/interfaces
2023-06-23 17:20:48 +08:00
cat /etc/network/interfaces.d/50-cloud-init >> /etc/network/interfaces
2023-06-23 13:04:04 +08:00
rm /etc/network/interfaces.d/50-cloud-init
chattr +i /etc/network/interfaces
2023-06-22 17:35:25 +08:00
fi
2023-06-23 13:34:27 +08:00
# 去除引用
2023-06-23 20:44:38 +08:00
if [ -f "/etc/network/interfaces" ] ; then
2023-06-23 13:34:27 +08:00
chattr -i /etc/network/interfaces
2023-06-23 21:31:25 +08:00
if ! grep -q '^#source \/etc\/network\/interfaces\.d\/' "/etc/network/interfaces" ; then
sed -i '/^source \/etc\/network\/interfaces\.d\// { /^#/! s/^/#/ }' "/etc/network/interfaces"
fi
if ! grep -q '^#source-directory \/etc\/network\/interfaces\.d' "/etc/network/interfaces" ; then
sed -i 's/^source-directory \/etc\/network\/interfaces\.d/#source-directory \/etc\/network\/interfaces.d/' "/etc/network/interfaces"
fi
2023-06-23 13:34:27 +08:00
chattr +i /etc/network/interfaces
fi
2023-06-23 20:44:38 +08:00
if [ -f "/etc/network/interfaces.new" ] ; then
2023-06-23 13:34:27 +08:00
chattr -i /etc/network/interfaces.new
2023-06-23 21:31:25 +08:00
if ! grep -q '^#source \/etc\/network\/interfaces\.d\/' "/etc/network/interfaces.new" ; then
sed -i '/^source \/etc\/network\/interfaces\.d\// { /^#/! s/^/#/ }' "/etc/network/interfaces.new"
fi
if ! grep -q '^#source-directory \/etc\/network\/interfaces\.d' "/etc/network/interfaces.new" ; then
sed -i 's/^source-directory \/etc\/network\/interfaces\.d/#source-directory \/etc\/network\/interfaces.d/' "/etc/network/interfaces.new"
fi
2023-06-23 13:34:27 +08:00
chattr +i /etc/network/interfaces.new
fi
# 反加载
if [ [ -f "/etc/network/interfaces.new" && -f "/etc/network/interfaces" ] ] ; then
2023-06-23 17:20:48 +08:00
chattr -i /etc/network/interfaces.new
2023-06-23 13:34:27 +08:00
cp -f /etc/network/interfaces /etc/network/interfaces.new
2023-06-23 17:20:48 +08:00
chattr +i /etc/network/interfaces.new
2023-06-23 13:34:27 +08:00
fi
2023-06-23 13:04:04 +08:00
# 允许手动配置
# if ! grep -q "iface ${interface} inet manual" "/etc/network/interfaces"; then
# chattr -i /etc/network/interfaces
# echo "Can not find 'iface ${interface} inet manual' in /etc/network/interfaces"
# echo "iface ${interface} inet manual" >> "/etc/network/interfaces"
# chattr +i /etc/network/interfaces
# fi
2023-06-22 17:35:25 +08:00
# 去除空行之外的重复行
remove_duplicate_lines "/etc/network/interfaces"
2023-06-23 20:46:35 +08:00
if [ -f "/etc/network/interfaces.new" ] ; then
remove_duplicate_lines "/etc/network/interfaces.new"
fi
2023-06-22 17:35:25 +08:00
}
fix_interfaces_ipv6_auto_type( ) {
chattr -i $1
while IFS = read -r line
do
# 检测以 "iface" 开头且包含 "inet6 auto" 的行
if [ [ $line = = " iface ${ interface } inet6 auto " ] ] ; then
# 将 "auto" 替换为 "static"
modified_line = " ${ line /auto/static } "
echo " $modified_line "
# 添加静态IPv6配置信息
ipv6_prefixlen = $( ifconfig ${ interface } | grep -oP 'prefixlen \K\d+' | head -n 1)
# 获取IPv6地址
# ipv6_address=$(ifconfig ${interface} | grep -oE 'inet6 ([0-9a-fA-F:]+)' | awk '{print $2}' | head -n 1)
ipv6_address = $( ip -6 addr show dev ${ interface } | awk '/inet6 .* scope global dynamic/{print $2}' )
# 提取地址部分
ipv6_address = ${ ipv6_address %%/* }
ipv6_gateway = $( ip -6 route show | awk '/default via/{print $3}' )
echo " address ${ ipv6_address } / ${ ipv6_prefixlen } "
echo " gateway ${ ipv6_gateway } "
else
echo " $line "
fi
done < $1 > /tmp/interfaces.modified
2023-06-23 20:44:38 +08:00
chattr -i $1
2023-06-22 17:35:25 +08:00
mv -f /tmp/interfaces.modified $1
2023-06-23 20:44:38 +08:00
chattr +i $1
2023-06-22 17:35:25 +08:00
rm -rf /tmp/interfaces.modified
}
2023-06-23 13:04:04 +08:00
check_cdn( ) {
local o_url = $1
for cdn_url in " ${ cdn_urls [@] } " ; do
if curl -sL -k " $cdn_url $o_url " --max-time 6 | grep -q "success" > /dev/null 2>& 1; then
export cdn_success_url = " $cdn_url "
return
fi
sleep 0.5
done
export cdn_success_url = ""
}
check_cdn_file( ) {
check_cdn "https://raw.githubusercontent.com/spiritLHLS/ecs/main/back/test"
if [ -n " $cdn_success_url " ] ; then
_yellow "CDN available, using CDN"
else
_yellow "No CDN available, no use CDN"
fi
}
# 前置环境安装
if [ " $( id -u) " != "0" ] ; then
_red "This script must be run as root" 1>& 2
exit 1
fi
# 确保apt没有问题
apt-get update -y
apt-get full-upgrade -y
if [ $? -ne 0 ] ; then
apt-get install debian-keyring debian-archive-keyring -y
apt-get update -y && apt-get full-upgrade -y
fi
apt_update_output = $( apt-get update 2>& 1)
echo " $apt_update_output " > " $temp_file_apt_fix "
if grep -q 'NO_PUBKEY' " $temp_file_apt_fix " ; then
public_keys = $( grep -oE 'NO_PUBKEY [0-9A-F]+' " $temp_file_apt_fix " | awk '{ print $2 }' )
joined_keys = $( echo " $public_keys " | paste -sd " " )
_yellow " No Public Keys: ${ joined_keys } "
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ${ joined_keys }
apt-get update
if [ $? -eq 0 ] ; then
_green "Fixed"
fi
fi
rm " $temp_file_apt_fix "
install_package wget
install_package curl
install_package sudo
install_package bc
install_package iptables
install_package lshw
# 检测IPV4
ip = $( ip -4 addr show | grep global | awk '{print $2}' | cut -d '/' -f1 | head -n 1)
# 检测物理接口和MAC地址
interface_1 = $( lshw -C network | awk '/logical name:/{print $3}' | head -1)
interface_2 = $( lshw -C network | awk '/logical name:/{print $3}' | sed -n '2p' )
if [ -z " $interface_1 " ] ; then
interface = "eth0"
fi
if ! grep -q " $interface_1 " "/etc/network/interfaces" ; then
2023-06-22 17:35:25 +08:00
if [ -f "/etc/network/interfaces.d/50-cloud-init" ] ; then
2023-06-23 13:04:04 +08:00
if ! grep -q " $interface_1 " "/etc/network/interfaces.d/50-cloud-init" && grep -q " $interface_2 " "/etc/network/interfaces.d/50-cloud-init" ; then
interface = ${ interface_2 }
else
interface = ${ interface_1 }
2023-06-22 17:35:25 +08:00
fi
else
2023-06-23 13:04:04 +08:00
if grep -q " $interface_2 " "/etc/network/interfaces" ; then
interface = ${ interface_2 }
else
interface = ${ interface_1 }
fi
2023-06-22 17:35:25 +08:00
fi
2023-06-23 13:04:04 +08:00
else
interface = ${ interface_1 }
fi
mac_address = $( ip -o link show dev ${ interface } | awk '{print $17}' )
# 检查是否存在特定行
if [ -f "/etc/network/interfaces.d/50-cloud-init" ] ; then
if grep -Fxq "# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:" /etc/network/interfaces.d/50-cloud-init && grep -Fxq "# network: {config: disabled}" /etc/network/interfaces.d/50-cloud-init; then
echo "Creating /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg."
if [ ! -f "/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg" ] ; then
echo "network: {config: disabled}" > /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
fi
fi
fi
# 网络配置修改
rebuild_interfaces
rebuild_cloud_init
fix_interfaces_ipv6_auto_type /etc/network/interfaces
# 检测是否已重启过
if [ ! -f "/root/reboot_pve.txt" ] ; then
echo "1" > "/root/reboot_pve.txt"
_green "Please restart the system for the changes to take effect."
_green "请执行 reboot 重启系统后再次自行本脚本"
exit 1
2023-06-22 17:35:25 +08:00
fi
########## 正式开始安装
cdn_urls = ( "https://cdn.spiritlhl.workers.dev/" "https://cdn3.spiritlhl.net/" "https://cdn1.spiritlhl.net/" "https://ghproxy.com/" "https://cdn2.spiritlhl.net/" )
check_cdn_file
# cloud-init文件修改
rebuild_cloud_init
2023-05-28 17:34:36 +08:00
2023-05-24 13:48:24 +08:00
# /etc/hosts文件修改
2023-02-26 10:32:11 +08:00
hostname = $( hostname)
if [ " ${ hostname } " != "pve" ] ; then
2023-04-04 19:16:25 +08:00
chattr -i /etc/hosts
2023-02-26 10:32:11 +08:00
hosts = $( grep -E " ^[^#]*\s+ ${ hostname } \s+ ${ hostname } \$ " /etc/hosts | grep -v " ${ ip } " )
2023-06-12 21:40:55 +08:00
if [ -n " ${ hosts } " ] ; then
# 注释掉查询到的行
sudo sed -i " s/^ $( echo ${ hosts } | sed 's/\//\\\//g' ) /# &/ " /etc/hosts
# 添加新行
# echo "${ip} ${hostname} ${hostname}" | sudo tee -a /etc/hosts > /dev/null
# _green "已将 ${ip} ${hostname} ${hostname} 添加到 /etc/hosts 文件中"
else
_blue " 已存在 ${ ip } ${ hostname } ${ hostname } 的记录,无需添加 "
2023-06-23 13:04:04 +08:00
_blue " A record for ${ ip } ${ hostname } ${ hostname } already exists, no need to add it "
2023-06-12 21:40:55 +08:00
fi
chattr -i /etc/hostname
hostnamectl set-hostname pve
chattr +i /etc/hostname
hostname = $( hostname)
if ! grep -q "::1 localhost" /etc/hosts; then
echo "::1 localhost" >> /etc/hosts
echo "Added ::1 localhost to /etc/hosts"
fi
if grep -q "^127\.0\.1\.1" /etc/hosts; then
sed -i '/^127\.0\.1\.1/s/^/#/' /etc/hosts
echo "Commented out lines starting with 127.0.1.1 in /etc/hosts"
fi
if ! grep -q " ^127\.0\.0\.1 localhost\.localdomain localhost $" /etc/hosts; then
# 127.0.1.1
echo " ${ ip } ${ hostname } .localdomain ${ hostname } " >> /etc/hosts
echo " Added ${ ip } ${ hostname } .localdomain ${ hostname } to /etc/hosts "
fi
chattr +i /etc/hosts
2023-02-26 10:32:11 +08:00
fi
2023-02-15 10:40:54 +08:00
2023-05-28 17:29:38 +08:00
## 更改网络优先级为IPV4优先
sed -i 's/.*precedence ::ffff:0:0\/96.*/precedence ::ffff:0:0\/96 100/g' /etc/gai.conf && systemctl restart networking
2023-02-26 10:32:11 +08:00
## ChinaIP检测
2023-02-15 11:21:31 +08:00
if [ [ -z " ${ CN } " ] ] ; then
if [ [ $( curl -m 10 -s https://ipapi.co/json | grep 'China' ) != "" ] ] ; then
_yellow "根据ipapi.co提供的信息, 当前IP可能在中国"
read -e -r -p "是否选用中国镜像完成安装? [Y/n] " input
case $input in
[ yY] [ eE] [ sS] | [ yY] )
echo "使用中国镜像"
CN = true
; ;
[ nN] [ oO] | [ nN] )
echo "不使用中国镜像"
; ;
*)
echo "使用中国镜像"
CN = true
; ;
esac
fi
fi
2023-02-15 10:40:54 +08:00
# 再次预检查
apt-get install gnupg -y
if [ $( uname -m) != "x86_64" ] || [ ! -f /etc/debian_version ] || [ $( grep MemTotal /proc/meminfo | awk '{print $2}' ) -lt 2000000 ] || [ $( grep -c ^processor /proc/cpuinfo) -lt 2 ] || [ $( ping -c 3 google.com > /dev/null 2>& 1; echo $? ) -ne 0 ] ; then
2023-02-15 10:56:06 +08:00
_red "Error: This system does not meet the minimum requirements for Proxmox VE installation."
2023-04-01 22:43:23 +08:00
reading "是否要继续安装(非Debian系或不满足最低的配置安装要求会爆上面这个警告)? (回车则默认不继续安装) [y/n] " confirm
2023-02-16 18:33:15 +08:00
echo ""
2023-02-16 21:08:26 +08:00
if [ " $confirm " != "y" ] ; then
2023-02-16 18:33:15 +08:00
exit 1
fi
2023-02-15 10:40:54 +08:00
else
2023-02-15 11:07:15 +08:00
_green "The system meets the minimum requirements for Proxmox VE installation."
2023-02-15 10:40:54 +08:00
fi
# 新增pve源
2023-05-15 15:35:08 +08:00
apt-get install lsb-release -y
2023-02-15 12:26:12 +08:00
version = $( lsb_release -cs)
case $version in
2023-06-12 19:37:42 +08:00
stretch| buster| bullseye)
2023-02-15 12:29:34 +08:00
repo_url = " deb http://download.proxmox.com/debian/pve ${ version } pve-no-subscription "
2023-02-15 11:21:31 +08:00
if [ [ -n " ${ CN } " ] ] ; then
2023-02-15 12:29:34 +08:00
repo_url = " deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian/pve ${ version } pve-no-subscription "
2023-02-15 11:21:31 +08:00
fi
; ;
2023-06-12 19:37:42 +08:00
bookworm)
repo_url = " deb http://download.proxmox.com/debian/pve ${ version } pvetest "
if [ [ -n " ${ CN } " ] ] ; then
repo_url = " deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian/pve ${ version } pvetest "
fi
; ;
2023-02-15 11:21:31 +08:00
*)
_red "Error: Unsupported Debian version"
2023-02-16 18:37:04 +08:00
reading "是否要继续安装(非Debian系会爆上面这个警告)? (回车则默认不继续安装) [y/n] " confirm
echo ""
2023-02-16 21:08:26 +08:00
if [ " $confirm " != "y" ] ; then
2023-02-16 18:37:04 +08:00
exit 1
fi
repo_url = "deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription"
if [ [ -n " ${ CN } " ] ] ; then
repo_url = "deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian/pve bullseye pve-no-subscription"
fi
2023-02-15 11:21:31 +08:00
; ;
esac
2023-04-03 22:01:51 +08:00
2023-06-12 17:57:16 +08:00
case $version in
stretch)
if [ ! -f "/etc/apt/trusted.gpg.d/proxmox-ve-release-4.x.gpg" ] ; then
wget http://download.proxmox.com/debian/proxmox-ve-release-4.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-4.x.gpg
chmod +r /etc/apt/trusted.gpg.d/proxmox-ve-release-4.x.gpg
fi
if [ ! -f "/etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg" ] ; then
wget http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg
chmod +r /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg
fi
; ;
buster)
if [ ! -f "/etc/apt/trusted.gpg.d/proxmox-ve-release-5.x.gpg" ] ; then
wget http://download.proxmox.com/debian/proxmox-ve-release-5.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-5.x.gpg
chmod +r /etc/apt/trusted.gpg.d/proxmox-ve-release-5.x.gpg
fi
if [ ! -f "/etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg" ] ; then
wget http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg
chmod +r /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg
fi
; ;
bullseye)
if [ ! -f "/etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg" ] ; then
wget http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg
chmod +r /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg
fi
if [ ! -f "/etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg" ] ; then
wget http://download.proxmox.com/debian/proxmox-release-bullseye.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg
chmod +r /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg
fi
; ;
bookworm)
if [ ! -f "/etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg" ] ; then
wget http://download.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
chmod +r /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
fi
; ;
*)
_red "Error: Unsupported Debian version"
reading "是否要继续安装(非Debian系会爆上面这个警告)? (回车则默认不继续安装) [y/n] " confirm
echo ""
if [ " $confirm " != "y" ] ; then
exit 1
fi
; ;
esac
2023-04-03 22:01:51 +08:00
2023-02-20 20:14:49 +08:00
if ! grep -q "^deb.*pve-no-subscription" /etc/apt/sources.list; then
2023-06-22 14:42:39 +08:00
echo " $repo_url " >> /etc/apt/sources.list
2023-06-18 22:31:43 +08:00
fi
2023-06-22 14:42:39 +08:00
# 备份网络设置
cp /etc/network/interfaces /etc/network/interfaces.bak
cp /etc/network/interfaces.new /etc/network/interfaces.new.bak
2023-06-22 15:10:11 +08:00
rebuild_interfaces
# 下载pve
2023-06-22 17:35:25 +08:00
# 确保apt没有问题
2023-06-22 15:10:11 +08:00
apt-get update -y && apt-get full-upgrade -y
if [ $? -ne 0 ] ; then
apt-get install debian-keyring debian-archive-keyring -y
apt-get update -y && apt-get full-upgrade -y
fi
apt_update_output = $( apt-get update 2>& 1)
echo " $apt_update_output " > " $temp_file_apt_fix "
if grep -q 'NO_PUBKEY' " $temp_file_apt_fix " ; then
public_keys = $( grep -oE 'NO_PUBKEY [0-9A-F]+' " $temp_file_apt_fix " | awk '{ print $2 }' )
joined_keys = $( echo " $public_keys " | paste -sd " " )
_yellow " No Public Keys: ${ joined_keys } "
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ${ joined_keys }
apt-get update
if [ $? -eq 0 ] ; then
_green "Fixed"
fi
fi
rm " $temp_file_apt_fix "
output = $( apt-get update 2>& 1)
if echo $output | grep -q "NO_PUBKEY" ; then
2023-06-22 21:14:21 +08:00
_yellow "try sudo apt-key adv --keyserver keyserver.ubuntu.com --recvrebuild_interface-keys missing key"
2023-06-22 15:10:11 +08:00
exit 1
fi
2023-06-22 17:35:25 +08:00
# 修复可能存在的auto类型
2023-06-23 20:44:38 +08:00
rebuild_interfaces
2023-06-23 13:04:04 +08:00
fix_interfaces_ipv6_auto_type /etc/network/interfaces
2023-06-22 17:35:25 +08:00
# 正式安装
2023-06-22 15:10:11 +08:00
install_package proxmox-ve
install_package postfix
install_package open-iscsi
rebuild_interfaces
2023-06-22 14:42:39 +08:00
2023-04-12 08:58:15 +08:00
# 如果是国内服务器则替换CT源为国内镜像源
if [ [ -n " ${ CN } " ] ] ; then
2023-06-22 14:42:39 +08:00
cp -rf /usr/share/perl5/PVE/APLInfo.pm /usr/share/perl5/PVE/APLInfo.pm.bak
sed -i 's|http://download.proxmox.com|https://mirrors.tuna.tsinghua.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm
sed -i 's|http://mirrors.ustc.edu.cn/proxmox|https://mirrors.tuna.tsinghua.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm
2023-04-12 08:58:15 +08:00
fi
2023-04-04 12:21:17 +08:00
# 安装必备模块并替换apt源中的无效订阅
cp /etc/apt/sources.list.d/pve-enterprise.list /etc/apt/sources.list.d/pve-enterprise.list.bak
2023-04-04 12:56:37 +08:00
# echo "deb http://download.proxmox.com/debian/pve $(lsb_release -sc) pve-no-subscription" > /etc/apt/sources.list.d/pve-enterprise.list
rm -rf /etc/apt/sources.list.d/pve-enterprise.list
2023-04-04 12:21:17 +08:00
apt-get update
2023-06-12 17:57:16 +08:00
install_package sudo
install_package iproute2
2023-06-22 20:53:06 +08:00
case $version in
stretch)
install_package ifupdown
; ;
buster)
2023-06-23 13:04:04 +08:00
install_package ifupdown2
2023-06-22 20:53:06 +08:00
; ;
bullseye)
install_package ifupdown2
; ;
bookworm)
install_package ifupdown2
; ;
*)
exit 1
; ;
esac
2023-06-12 17:57:16 +08:00
install_package net-tools
install_package novnc
2023-06-18 22:31:43 +08:00
install_package cloud-init
2023-05-24 14:01:22 +08:00
rebuild_cloud_init
2023-06-18 22:31:43 +08:00
# install_package isc-dhcp-server
2023-04-04 12:21:17 +08:00
2023-04-04 18:07:11 +08:00
# 打印内核
2023-04-04 13:09:31 +08:00
running_kernel = $( uname -r)
_green " Running kernel: $( pveversion) "
installed_kernels = ( $( dpkg -l 'pve-kernel-*' | awk '/^ii/ {print $2}' | cut -d'-' -f3- | sort -V) )
latest_kernel = ${ installed_kernels [-1] }
2023-04-04 13:29:16 +08:00
_green " PVE latest kernel: $latest_kernel "
2023-04-04 18:07:11 +08:00
# update-grub
2023-06-12 17:57:16 +08:00
install_package ipcalc
2023-06-23 13:04:04 +08:00
if [ -f "/etc/network/interfaces" ] ; then
# 检查/etc/network/interfaces文件中是否有iface eth0 inet dhcp行 - 看来还是得转动态为静态判断东西
if grep -q "iface eth0 inet dhcp" /etc/network/interfaces; then
# 获取ipv4、subnet、gateway信息
gateway = $( ip route | awk '/default/ {print $3}' )
interface_info = $( ip -o -4 addr show dev $interface | awk '{print $4}' )
ipv4 = $( echo $interface_info | cut -d'/' -f1)
subnet = $( echo $interface_info | cut -d'/' -f2)
subnet = $( ipcalc -n " $ipv4 / $subnet " | grep -oP 'Netmask:\s+\K.*' | awk '{print $1}' )
chattr -i /etc/network/interfaces
sed -i " /iface $interface inet dhcp/c\
iface $interface inet static\n \
address $ipv4 \n \
netmask $subnet \n \
gateway $gateway \n \
dns-nameservers 8.8.8.8 8.8.4.4" /etc/network/interfaces
2023-06-17 20:43:59 +08:00
fi
2023-06-23 13:04:04 +08:00
chattr +i /etc/network/interfaces
2023-04-04 18:07:11 +08:00
fi
2023-04-04 18:24:14 +08:00
systemctl restart networking
2023-04-04 19:12:24 +08:00
if [ ! -s "/etc/resolv.conf" ]
then
2023-05-11 12:10:53 +08:00
cp /etc/resolv.conf /etc/resolv.conf.bak
2023-04-04 19:16:25 +08:00
chattr -i /etc/resolv.conf
2023-06-22 15:04:10 +08:00
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
2023-04-04 19:16:25 +08:00
chattr +i /etc/resolv.conf
2023-04-04 19:12:24 +08:00
fi
2023-06-13 09:14:59 +08:00
wget ${ cdn_success_url } https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/check-dns.sh -O /usr/local/bin/check-dns.sh
wget ${ cdn_success_url } https://raw.githubusercontent.com/spiritLHLS/pve/main/scripts/check-dns.service -O /etc/systemd/system/check-dns.service
2023-04-04 21:14:34 +08:00
chmod +x /usr/local/bin/check-dns.sh
chmod +x /etc/systemd/system/check-dns.service
2023-04-04 19:51:11 +08:00
systemctl daemon-reload
systemctl enable check-dns.service
systemctl start check-dns.service
2023-02-15 10:56:06 +08:00
# 打印安装后的信息
2023-02-15 10:40:54 +08:00
url = " https:// ${ ip } :8006/ "
2023-06-23 13:04:04 +08:00
_green " Installation complete, please open HTTPS web page $url "
_green "The username and password are the username and password used by the server (e.g. root and root user's password)"
_green "If the login is correct please do not rush to reboot the system, go to execute the commands of the pre-configured environment and then reboot the system"
2023-02-15 11:12:21 +08:00
_green " 安装完毕, 请打开HTTPS网页 $url "
2023-02-26 10:46:31 +08:00
_green "用户名、密码就是服务器所使用的用户名、密码(如root和root用户的密码)"
2023-06-12 13:30:36 +08:00
_green "如果登录无误请不要急着重启系统,去执行预配置环境的命令后再重启系统"
2023-06-23 13:24:10 +08:00
rm -rf /root/reboot_pve.txt