-
-
Save jixunmoe/6d195b2b2369c2cba80425213d3dc2cc to your computer and use it in GitHub Desktop.
OVZ 小鸡,CentOS 转 Alpine 脚本
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
set -ex | |
# Converts OpenVZ VPS to Alpine Linux | |
# WARNING: This script will wipe any data in your VPS! | |
# GPLv2; Partly based on https://gitlab.com/drizzt/vps2arch | |
# https://gist.github.com/trimsj/c1fefd650b5f49ceb8f3efc1b6a1404d | |
# 修改 by Jixun | |
# 测试于国内被墙严重的 Gullo's Hosting OVZ 小鸡 🐔 | |
# 此处填写或调用前导出 | |
# 如果不正确填写需要之后手动修正 IPv6 访问 | |
# IPv6=___ip | |
# IPv6_netmask=___mask (default: 80) | |
# IPv6_gateway=___gateway | |
if [[ -z "$IPv6_netmask" ]] ; then | |
IPv6_netmask=80 | |
fi | |
ipv6_comment= | |
if [[ -z "$IPv6" ]] || [[ -z "$IPv6_gateway" ]] ; then | |
echo IPv6 will be disabled. | |
ipv6_comment='# ' | |
fi | |
OVZ=6 | |
[[ "3" == $(uname -r | cut -c-1) ]] && OVZ=7 | |
# 从 linuxcontainers 网站获取更新信息 | |
export server=https://images.linuxcontainers.org | |
export os_ver='alpine;3.10;amd64;default;' | |
function get_download_url { | |
wget --quiet -O- "${1}/meta/1.0/index-system" \ | |
| grep "$2" \ | |
| tail -1 \ | |
| cut -d ';' -f6 | |
} | |
export img_path=$(get_download_url $server $os_ver) | |
# 下载并解压镜像 | |
# ROOT 必须为根目录下,否则可能出问题。 | |
export ROOT=/tmp-alpine | |
[ -e $ROOT ] && rm -rf $ROOT | |
mkdir -p $ROOT | |
wget "${server}/${img_path}/rootfs.tar.xz" | |
tar -C $ROOT -xf rootfs.tar.xz | |
#wget http://dl-cdn.alpinelinux.org/alpine/v3.10/releases/x86_64/alpine-minirootfs-3.10.1-x86_64.tar.gz -O rootfs.tar.gz | |
#tar -C $ROOT -xf rootfs.tar.gz | |
cd / | |
# 删除 inittab 里的 getty 行,并更新容器类型到 openvz。 | |
sed -i '/getty/d' $ROOT/etc/inittab | |
[ -f "$ROOT/etc/rc.conf" ] && sed -i 's/rc_sys="lxc"/rc_sys="openvz"/' $ROOT/etc/rc.conf | |
# 保存 root 密码以及 ssh 公钥信息 | |
sed -i '/^root:/d' $ROOT/etc/shadow | |
grep '^root:' /etc/shadow >> $ROOT/etc/shadow | |
[ -d /root/.ssh ] && cp -a /root/.ssh $ROOT/root/ | |
hostname=$(hostname) | |
# 储存网络信息 (venet0) | |
# 也许可以直接备份? | |
function backup_interfaces | |
{ | |
cp /etc/network/interfaces $ROOT/etc/network/interfaces | |
} | |
function generate_interfaces | |
{ | |
dev=venet0 | |
ip=$(ip addr show dev $dev | grep global | awk '($1=="inet") {print $2}' | cut -d/ -f1 | head -1) | |
# 将新编写的文件拷贝过去 | |
cat > $ROOT/etc/network/interfaces << EOF | |
auto lo | |
iface lo inet loopback | |
auto $dev | |
iface $dev inet static | |
address $ip | |
netmask 255.255.255.255 | |
up ip route add default dev $dev | |
${ipv6_comment}iface $dev inet6 static | |
${ipv6_comment}address ${IPv6} | |
${ipv6_comment}netmask ${IPv6_netmask} | |
${ipv6_comment}gateway ${IPv6_gateway} | |
${ipv6_comment}pre-up echo 0 > /proc/sys/net/ipv6/conf/venet0/accept_ra | |
# ovz6 sets hostname here | |
hostname $hostname | |
EOF | |
} | |
if [ -f /etc/network/interfaces ] ; then | |
backup_interfaces | |
else | |
generate_interfaces | |
fi | |
echo -n "$hostname" > $ROOT/etc/hostname | |
# 拷贝 resolv.conf (DNS 服务器) | |
cp /etc/resolv.conf $ROOT/etc/resolv.conf | |
cp /etc/ssh/sshd_config $ROOT/etc/ssh/sshd_config.old || true | |
# 进行清理;删除所有 /(dev|proc|sys|$ROOT) 外的文件。 | |
find / \( ! -path '/dev/*' -and ! -path '/proc/*' -and ! -path '/sys/*' -and ! -path "$ROOT/*" \) -delete || true | |
# 将数据全部挪过来然后移除 | |
$ROOT/lib/ld-musl-x86_64.so.1 $ROOT/bin/busybox cp -a $ROOT/* / | |
export PATH="/usr/sbin:/usr/bin:/sbin:/bin" | |
# 删除临时数据 | |
rm -rf $ROOT | |
# Alpine 下更新 | |
apk update | |
apk upgrade | |
# Install packages | |
apk add openssh | |
apk add ca-certificates | |
if [[ "7" == "${OVZ}" ]]; then | |
echo OpenVZ 7 requires bash to be present... | |
apk add bash | |
fi | |
# 修正证书错误 | |
update-ca-certificates | |
apk fix wget | |
# 允许 Root 登入 (*) | |
rc-update add sshd default | |
rc-update add mdev sysinit | |
rc-update add devfs sysinit | |
export PATH="/usr/sbin:/usr/bin:/sbin:/bin" | |
# 快捷指令,可以在这里多填写几个。 | |
/bin/mkdir -p /etc/profile.d | |
cat << EOF > /etc/profile.d/alias.sh | |
alias ll='ls -al' | |
EOF | |
# 等待硬盘同步,然后重启。 | |
echo sync... | |
sync | |
echo 'perform any action before your reboot [use reboot -f]' | |
echo '(e.g. adjust ssh config/passwd/public key/install package)' | |
/bin/ash -l |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment