Skip to content

Instantly share code, notes, and snippets.

@jixunmoe
Last active April 7, 2022 13:07
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save jixunmoe/6d195b2b2369c2cba80425213d3dc2cc to your computer and use it in GitHub Desktop.
Save jixunmoe/6d195b2b2369c2cba80425213d3dc2cc to your computer and use it in GitHub Desktop.
OVZ 小鸡,CentOS 转 Alpine 脚本
#!/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