內容目錄

一键安装 multipass 虚拟机 script

macOS / unix shell 下,使用 multipass 命令建立虚拟机并在虚拟机内安装套件。
具体安装了什么,说明都在 echo 里。。。。

#! sh
echo
echo "===================================================================================="
echo "=== macOS 下自动建立 multipass 虚拟机 ==="
echo " 会修改为ustc源、挂载主机目录、自动安装ssh并为远端Vscode设定多文件开启、安装XRDP服务、安装SAMBA服务并共享目录。"
echo
echo ### 1. 建立 multipass 虚拟机

echo "useage: $0 [vm_name [ubuntu_ver [share_path]]]"
echo "参数依序为:虚拟机名稱、选择ubuntu镜像的版次、虚拟机SAMBA共享的目录"
echo
echo ### 1.1 Script 缺省的参数依序为:虚拟机名稱、选择ubuntu镜像的版次。
export vm=u22 
export img=22.04
export vm_share=${vm}_work

echo
echo ### 1.2 虚拟机的 CPU数、记忆体容量、硬盘容量定义在此,依宿主机调整:
export core=8
export mem=10G
export disk=300G


echo
echo ### 1.3 macOS:安装 multipass app (使用万能的 brew):
echo ###     brew install --cask multipass

echo
echo ### 1.4 依据前面的参数建立虚拟机:
if [ "" != "$3" ];then export vm_share=$3; fi
if [ "" != "$2" ];then export img=$2; fi
if [ "" != "$1" ];then export vm=$1; fi 
echo multipass launch  -c $core -m $mem -d $disk -n $vm  $img
multipass launch  -c $core -m $mem -d $disk -n $vm  $img

echo
echo "===================================================================================="
echo ### 2. 国内源处理
echo
echo ### 2.1 apt 更换为中科大 ustc 源
multipass exec $vm --  sudo cp /etc/apt/sources.list /etc/apt/sources.list.org
multipass exec $vm --  sudo sed -i 's@archive.ubuntu.com@mirrors.ustc.edu.cn@g' /etc/apt/sources.list
multipass exec $vm --  sudo sed -i 's@security.ubuntu.com@mirrors.ustc.edu.cn@g' /etc/apt/sources.list
multipass exec $vm --  sudo apt update -y 
multipass exec $vm --  sudo apt upgrade -y
echo
echo ### 2.2 snap 国内proxy设定(视需要)
echo ### multipass exec $vm --  sudo snap install snap-store-proxy
echo ### multipass exec $vm --  sudo snap install snap-store-proxy-client

echo
echo "===================================================================================="
echo ### 3.使用 sshfs 挂载主機共享文件夹给虚拟机
echo
echo ### 3.1. 安装 multipass-sshfs 以挂载主机文件夹
multipass exec $vm --  sudo snap install multipass-sshfs
echo
echo ### 3.2 挂载主机文件夹(到 /mnt 下)如:
multipass mount   /Volumes/Work $vm:/mnt/work 
multipass mount   /Volumes $vm:/mnt/disks 
multipass mount   ~  $vm:/mnt/host
echo
echo ### 3.3 macOS 多了一层权限管理,需要允许 multipassd 的磁盘访问权限:
echo ###   打开设定app --  安全性与隐私 -- 隐私页 -- 左下角解锁 -- 完全磁盘访问权限 -- 勾选允许 multipassd


echo
echo "===================================================================================="
echo ### 4. 设置ssh服务,并为VSCode设置极限文件数
echo ### 宿主机 VSCode 可透过 ssh 直接编译虚拟机的工程
echo
echo ### 4.1 宿主机使用 `ssh-keygen` 建立 ssh 公钥(若未执行过,需执行一次)
echo ###    使用缺省多次 enter后,公钥放在 ~/.ssh/id_rsa.pub
echo
echo ### 4.2 VM 安装 ssh,并执行 `ssh-keygen` 
echo ###    使用缺省多次 enter后,公钥放在 ~/.ssh/id_rsa.pub
multipass exec $vm -- sudo apt install ssh -y
multipass exec $vm -- ssh-keygen
echo
echo ### 4.3 sshd 守护进程设定
echo ###     打开密码,允许无密码登入、重启 sshd 
multipass exec $vm -- sudo sed -i 's/PasswordAuthentication\ no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
multipass exec $vm -- sudo sed -i 's/#PermitEmptyPasswords\ no/PermitEmptyPasswords yes/g' /etc/ssh/sshd_config
multipass exec $vm -- sudo service sshd restart
echo
echo ### 4.4 绑定VM的ssh别名、并交换公钥
echo ### 绑定虚拟机名称和虚拟机IP
echo "\nHost $vm\n  HostName $(multipass ls | grep $vm | awk '{print $3}')\n  User ubuntu" >> ~/.ssh/config
echo ### 允许主机的本账号,免密ssh进虚拟机
multipass exec $vm -- sed -i "$ a\ $(cat ~/.ssh/id_rsa.pub)" .ssh/authorized_keys
echo ### 允许VM的ubuntu账号,免密ssh进主机
#multipass exec $vm -- cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
echo
echo ### 4.5 将inode数调到最大,以利VSCode工作
echo ###    Vscode 会同时操作多个文件,将inode数给到到最大值(524288)并重置此值。
multipass exec $vm -- sudo sed -i "$ a\fs.inotify.max_user_watches=524288" /etc/sysctl.conf
multipass exec $vm -- sudo sysctl -p
echo
echo "===================================================================================="
echo ### 5. 主机端安装 VSCode 并设置ssh远程连接到虚拟机  
echo
echo ### 5.1 宿主 vscode安装:
echo ###    brew install visual-studio-code
echo
echo ### 5.2 执行 vscode app,并安装 Remote - SSH 扩展:
echo
echo ### 5.3 用 vscode 远端连接虚拟机
echo ###    vscode安装 ssh remote扩展,然后用左下角的连接按钮连接VM
echo ###    第一次连接会发现金钥需求。点选 continue,会把3个金钥放到 ~/ssh/know_hosts中
echo ###    之后vscode会透过ssh在虚拟机安装ssh下的私密服务,以让vscode更好的和VM协同工作。  

#显示虚拟机的安装信息
multipass info $vm 
echo
echo "===================================================================================="
echo ### 6. 虚拟机安装 XRDP 服务以及最简桌面环境
echo
echo ### 6.1 虚拟机安装最简ubuntu桌面套件与xrdp服务
echo
if [ "18.04"!="$img" ]; then
    multipass exec $vm -- sudo apt install -y ubuntu-desktop-minimal xrdp
else
    multipass exec $vm -- sudo apt install -y ubuntu-desktop xrdp
    multipass exec $vm -- sudo apt remove libreoffice* thunderbird* totem* rhythmbox* transmission* -y
fi
multipass exec $vm -- sudo apt autoremove -y

echo
echo ### 6.2. 解决RDP登录时反复验证问题
echo "[Allow Wifi Scan]
Identity=unix-user:*
Action=org.freedesktop.NetworkManager.wifi.scan;org.freedesktop.NetworkManager.enable-disable-wifi;org.freedesktop.NetworkManager.settings.modify.own;org.freedesktop.NetworkManager.settings.modify.system;org.freedesktop.NetworkManager.network-control
ResultAny=yes
ResultInactive=yes
ResultActive=yes" | multipass exec $vm -- sudo tee /etc/polkit-1/localauthority/50-local.d/47-allow-wifiscan.pkla

echo
echo ### 6.3. 解决“色彩管理设备” / “color managed device” 弹窗
echo "[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes" | multipass exec $vm -- sudo tee /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla

echo
echo ### 6.4. 解决“刷新系统软件源需要认证” / “refresh the system repositories” 弹窗
echo "[Allow Refresh Repository all Users]
Identity=unix-user:*
Action=org.freedesktop.packagekit.system-sources-refresh
ResultAny=no
ResultInactive=no
ResultActive=yes" | multipass exec $vm -- sudo tee /etc/polkit-1/localauthority/50-local.d/46-allow-packagekit.pkla

echo
echo ### 6.5. 注释掉 `AutomaticLoginEnable` 和 `AutomaticLogin` 变量:
multipass exec $vm -- sudo sed -i 's/AutomaticLoginEnable/#AutomaticLoginEnable/g' /etc/gdm3/custom.conf
multipass exec $vm -- sudo sed -i 's/AutomaticLogin/#AutomaticLogin/g' /etc/gdm3/custom.conf

echo
echo ### 6.6 重启RDP服务
multipass exec $vm -- sudo systemctl restart xrdp
echo
echo ### 6.7 查看 XRDP服务 和虚拟机现状
multipass exec $vm -- sudo systemctl status xrdp
multipass ls | grep $vm

echo
echo ### 6.8 主机安装 RDP Client app
echo macOS 在 App Store 中搜寻 RDP,下载微软的 “Microsoft Remote Desktop” 安装。
echo 从前面的 multipass ls | grep $vm 命令可看到虚拟机 名称和 IP,用于设定RDP连接参数。
echo 加上账号是 ubuntu,暂时不用密码,就可以设定此虚拟机的环境 RDP

echo
echo "===================================================================================="
echo ### 7 安装 OpenVPN 与 NetworkManager 的管理 GUI
echo "    renderer: NetworkManager" | multipass exec $vm -- sudo tee -a /etc/netplan/50-cloud-init.yaml
multipass exec $vm -- sudo apt install -y openvpn network-manager-openvpn network-manager-openvpn-gnome
multipass exec $vm -- sudo netplan apply
echo
echo ### 7.1 安装 OpenVPN服务器提供的设定文件(GUI手动) 
echo 需要自行自服务器下载 ovpn文件,然后在 RDP下 透过 NetworkManager 添加VPN设定文件。。。
#

echo
echo "===================================================================================="
echo ### 8 安装 Google Chrome (从官网安装 amd64 版的 deb 包)
multipass exec $vm -- wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
multipass exec $vm -- sudo dpkg -i google-chrome-stable_current_amd64.deb
echo 安装后可以透过 RDP执行 chrome,会有一些 keyring 密码与初始化要求。。。


echo
echo "===================================================================================="
echo ### 9 使用SAMBA协议共享虚拟机文件夹
echo ### samba协议是微软Windows预设的局域网文件共享协议,macOS内建支持。linux系统需要安装服务。
echo setup SAMBA server 

echo ### 9.1 安装Samba服务
multipass exec $vm -- sudo apt install samba samba-common -y

echo ### 9.2 配置需要多人共享的目录(可选)
echo ### 改变需要共享目录的权限,让其他人可以更改文件和目录,
echo ### 以 $vm_share 为例(若多人使用同一服务器建议在每个用户家目录单独共享,不建议共享整个home目录,防止误操作删除他人文件)
multipass exec $vm -- mkdir -p /home/ubuntu/$vm_share
multipass exec $vm -- sudo chmod 770 /home/ubuntu/$vm_share 

echo ### 9.3 添加samba用户密码
echo ### 添加samba用户/密码,用于其他人或设备认证,这里添加的用户需要在系统账号中存在,否则添加失败
multipass exec $vm -- sudo smbpasswd -a ubuntu

echo ### 9.4 配置samba
echo ### 先备份,再修改 /etc/samba/smb.conf  配置文件,添加共享文件夹。
multipass exec $vm -- sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.old

echo ### 在 /etc/samba/smb.conf 尾端添加一个共享文件夹:
echo "[$vm_share]\
    \n  comment = $vm $vm_share dir\
    \n  path = /home/ubuntu/$vm_share\
    \n  guest ok = no\
    \n  browseable = yes\
    \n  create mask = 0775\
    \n  directory mask = 0775\
    \n  valid users = ubuntu,root\
    \n  write list = ubuntu,root" | multipass exec $vm -- sudo tee -a  /etc/samba/smb.conf


echo
echo ### 9.5 重启SAMBA服务:
multipass exec $vm -- sudo service smbd restart

echo
echo ### 9.6 在宿主机下就能用刚刚设定的 ubuntu 的 smb 密码,存取 $vm_share 文件夹了。
echo macOS 在 browser 地址栏输入 smb://$vm/$vm_share 就能打开 Finder,输入SAMBA用户密码,连接网盘了。



echo
echo "===================================================================================="
echo ### 10. agl
echo

#echo 10.1 AGL host tool prepare on ubuntu 20.04
# multipass exec $vm -- sudo apt install gawk wget git-core diffstat unzip texinfo gcc-multilib \
#     build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \
#     xz-utils debianutils iputils-ping libsdl1.2-dev xterm curl -y

echo 10.1 AGL host tool prepare on ubuntu 22.04
multipass exec $vm -- sudo apt install gawk wget git diffstat unzip texinfo gcc-multilib \ 
     build-essential chrpath socat cpio python2 python3 python3-pip python3-pexpect \
     xz-utils debianutils iputils-ping libsdl1.2-dev xterm curl -y

echo
echo 10.2 AGL download
echo these code shound be executed on the VM, not through the host multipass ..
最後修改日期: 2023 年 3 月 27 日

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。