0%

chroot下玩转群晖虚拟机

概要

​ 仅需要实现软路由的朋友请移步《群晖官方套件VirtualDSM实现LEDE X64软路由》 ,有更简单的方法。下面主要讲的chroot环境下的折腾方法,一般作为学习用就可以了,同志们,折腾的过程是痛并快乐的,昨晚破天荒10点半睡觉,感觉整个人都活过来了。所以身体还是最重要的。
​ 在实现LEDE软路由过程中会发现网络无法访问问题,后来经过反复折腾,NAS硬重启N次后,发现chroot里设置的网络,一旦网线插拔变动,网络设置又会让群晖主系统更改,甚至导致群晖无法访问,需要长按关机才能恢复(今天得知其实可以通过群晖的pc端软件synology assistant来重制网络,我图样了)。

​ 通篇以群晖916+ 8G版为例,应该也适用其他x86平台的。
​ 首先你的NAS要是x86的cpu平台,否则没有KVM支持,性能捉急。

先到群晖管理界面,打开SSH。命令行操作请谨慎,请在知道命令含义的前提下执行,谨慎操作。
ssh到群晖上,查看内核模块,有两个地方都有,应该是同一个东西。

ls -l /lib/modules/kvm*
或者
ls -l /usr/lib/modules/kvm*
有的话执行
sudo insmod /lib/modules/kvm.ko
sudo insmod /lib/modules/kvm-intel.ko

kvm-intel.ko,和kvm.ko都存在的话,恭喜你,可以入坑折腾了。
由于群晖自带的linux系统缺乏相关软件,自己编译安装相当麻烦。不过可以借助套件中心里的debian-chroot来完成。大家可以参考这个图文并茂的文章http://tieba.baidu.com/p/3257838822。我实在没有这个精力去截图写了,抱歉。

1.打开套件中心,新增“来源”:http://packages.synocommunity.com/
2.到“社群”标签中找到debian-chroot安装

​ 关于chroot,自己科普吧。总之相当于另外开辟了一个类似“容器”的地方,共享主机的内核和硬件资源,但是“系统盘”里的文件都是新的。
这个自带的debian-chroot还可以用,我之前试过,后来我用vp$的debian自建了一个chroot,里面软件都是比较新的,用到了qemu的2.7版本。
然后就进入了类似vp$一样的debian系统了,自己配置源,执行如下命令安装qemu-kvm:

sudo apt-get install qemu-kvm libvirt-bin bridge-utils uml-utilities

到了这里其实已经可以开始通过直接执行命令行的qemu-system-x86_64来安装和开启系统了。我一开始是粗暴的做法:

DISKIMG=./win7.img
SLIC=./Sony[Sony-VAIO-Sony]2.1.BIN
WIN7IMG=./cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso
VIRTIMG=./virtio-win-0.1.126.iso

qemu-img create -f qcow2 ${DISKIMG} 50G

qemu-system-x86_64 -acpitable file=${SLIC}
-daemonize
-usbdevice tablet -cpu host -m 2048 –enable-kvm
-drive file=${DISKIMG},if=virtio,cache=writeback
-cdrom ${WIN7IMG}
-drive file=${VIRTIMG},index=3,media=cdrom
-rtc base=localtime,clock=host -smp cores=2,threads=1
-net nic,model=virtio,vlan=0,macaddr=52-54-00-12-34-01
-net tap,vlan=0,ifname=tap1,script=no
-boot c -soundhw es1370
-vga qxl -device virtio-serial-pci
-chardev spicevmc,id=spicechannel0,name=vdagent
-vnc :1

是不是看得头大,不管你怎么想,我就是这么折腾过来的。后面利用libvirt来高效管理各种虚拟机,还是蛮方便的。

本节要做的是有个概念即可,装好debian-chroot即可。我们用最简单的方法来管理。

chroot篇

这里是记录安装新chroot文件系统的教程。参照这篇https://wiki.debian.org/chroot
操作以debian为例。

  • 参照

    https://wiki.debian.org/chroot

    (只需要执行前面2个命令即可)

    apt-get install binutils debootstrap
    mkdir -p /srv/chroot/chroottarget
    debootstrap testing /srv/chroot/chroottarget http://httpredir.debian.org/debian

  • 然后执行打包:

    tar jpcf chroottarget.tar.bz2 /srv/chroot/chroottarget(主要加-p保留原来权限)

  • 拷贝到群晖本地,ssh到群晖上面,备份原来的

    mv /volume*/@appstore/debian-chroot/var/chroottarget/ /volume*/@appstore/debian-chroot/var/chroottarget.bak 这里的*代表你安装套件的时候选择的磁盘位置,如volume3,下同。

    然后执行

    tar jxpf chroottarget.tar.bz2 -C /volume*/@appstore/debian-chroot/var/

  • 然后参照https://markpith.wordpress.com/2015/10/26/debian-chroot-on-synology-nas/进行优化chroot系统

sudo /var/packages/debian-chroot/scripts/start-stop-status chroot 进入chroot系统,这里就是一个完整的debian testing文件系统。

接下来的操作都在chroot里做,熟悉debian的同学就轻车熟路了。
编辑/etc/apt/sources.list

###### Debian Main Repos
deb http://ftp.us.debian.org/debian/ stretch main contrib non-free
deb-src http://ftp.us.debian.org/debian/ stretch main contrib non-free

###### Debian Update Repos
deb http://security.debian.org/ stretch/updates main contrib non-free
deb http://ftp.us.debian.org/debian/ stretch-proposed-updates main contrib non-free
deb-src http://security.debian.org/ stretch/updates main contrib non-free
deb-src http://ftp.us.debian.org/debian/ stretch-proposed-updates main contrib non-free

然后执行

更新源,更新系统默认编码和时区:
apt-get update
apt-get upgrade

apt-get install locales
dpkg-reconfigure locales
dpkg-reconfigure tzdata
创建一个和群晖自带系统一样的用户名,这样可以共享同一个home目录,先切到群晖系统下(可以多开几个窗口),查看用户uid,gid
id -u username (username改成你自己的)
id -g username
回到chroot,执行
adduser username –uid XXXX –gid YYYY –home /home/username (这里的username和XXXX,YYYY自己替换)

好了后
apt-get install sudo
adduser username sudo
为了更方便进入chroot系统,安装ssh
apt-get install ssh
修改/etc/ssh/sshd_config 文件,可以配置端口,时间关系,这里不多介绍。

回到群晖系统,修改套件的启动脚本,加入home挂载,cgroup挂载(libvirt要用到)

我在/var/packages/debian-chroot/scripts/start-stop-status文件中新增如下

start_daemon函数中加挂载,和起ssh服务
grep -q “${CHROOTTARGET}/sys/fs/cgroup “ /proc/mounts || mount –rbind /sys/fs/cgroup ${CHROOTTARGET}/sys/fs/cgroup
grep -q “${CHROOTTARGET}/home “ realpath /var/services/homes || mount -o bind realpath /var/services/homes ${CHROOTTARGET}/home

chroot ${CHROOTTARGET} /etc/init.d/ssh start

stop_daemon函数中加卸载,停ssh服务
chroot ${CHROOTTARGET} /etc/init.d/ssh stop
umount ${CHROOTTARGET}/home
umount -R ${CHROOTTARGET}/sys/fs/cgroup

好了,手工了,重启下debian-chroot套件

/var/packages/debian-chroot/scripts/start-stop-status stop
/var/packages/debian-chroot/scripts/start-stop-status start 没有restart,奇怪了

接下来干正事了:

安装qemu,kvm

sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients libvirt-daemon bridge-utils uml-utilities

完工,看下一节。

libvirt篇

首先进入chroot系统,执行

/etc/init.d/dbus start
/etc/init.d/libvirtd start
/etc/init.d/virtlogd start

启动几个必须的服务,你可以加入到脚本。

brctl addbr br-lan
brctl addif br-lan eth0/1

创建虚拟网桥

接下来可以安装虚拟机喽,以安装debian为例:

virt-install –virt-type kvm –network bridge=br-lan –cpu host –vcpus 1 –name jessie-amd64 –memory 512 –cdrom ./debian-8.6.0-amd64-netinst.iso –disk size=4 –os-variant generic –graphics vnc,port=5900

此时可以通过vnc工具,比如vncviewer,tigervnc来连接到安装界面,比如上面的可以通过 群晖IP::5900来访问到。

接下来可以通过virsh来查看虚拟机列表:

chroot@NAS916P:~$ sudo virsh list –all
Id Name State
-—————————————————
- centos7 shut off
- debian8 shut off
- lede shut off
- lede1.9 shut off
- win7 shut off

还可以通过virt-manager可视化工具来安装和配置。

更多详细请参照:http://www.isjian.com/virtualization/kvm-libvirt-qemu-2/

安装LEDE X64实现软路由

NAS宿主机:
由于我的NAS(916+)带两张网卡,所以用来做软路由比较方便,按本篇做法可以实现软路由功能,pppoe拨号,内网dhcp 192.168.1.0网段。正常工作,但是我有个困扰很久的难题,一直无法解决,就是虚拟机LEDE充当路由之后,我该通过什么方式来访问宿主机呢,之前两张网卡被桥接后好像都消失了,原来的IP都无法访问。然后按朋友的帮助,说给eht0, eth1分别建立alias,然后桥接alias,我发现也没有用。
先说说我的配置吧,千万别开机应用网络配置,导致机器无法访问(群晖916没有视频接口,一旦网络没了就没了),由于在chroot里,也不会怕自启动。新建一个文件/etc/network/interfaces.d/qemu

auto lo
iface lo inet loopback

# The primary network interface
auto br-lan
iface br-lan inet static
address 192.168.1.2
gateway 192.168.1.1
netmask 255.255.255.0
bridge_ports eth1

auto br-wan
iface br-wan inet static
address 10.0.0.250
bridge_ports eth0

auto eth0
iface eth0 inet manual

auto eth1
iface eth1 inet manual

然后执行

/etc/init.d/networking restart

LEDE系统:
首先下载本论坛的img文件,具体下载不罗嗦了。
然后执行转换:

qemu-img convert -f raw -O qcow2 lede-V1.9-Update3-x86-64-combined-squashfs.img lede-V1.9-Update3-x86-64-combined-squashfs.qcow2

然后用virt-manger自己导入也可以,用我这个配置文件也可以:

lede dc54a2a7-fe73-4dd6-8dbf-73a21e802bd0 2097152 2097152 4 hvm Westmere destroy restart restart /usr/bin/kvm

通过sudo virsh list –all就可以看到lede虚拟机在其中了。执行sudo virsh start lede,就起来了。然后通过sudo virsh console lede就进入了lede的终端,进行如下配置:
修改 /etc/config/network, 让eth0就是桥接的宿主机的br-lan,来做内网网卡,eth1就是桥接了宿主机的br-wan,来做pppoe拨号。

config interface ‘loopback’
option ifname ‘lo’
option proto ‘static’
option ipaddr ‘127.0.0.1’
option netmask ‘255.0.0.0’

config interface ‘lan’
option type ‘bridge’
option ifname ‘eth0’
option proto ‘static’
option ipaddr ‘192.168.1.1’
option netmask ‘255.255.255.0’
option ip6assign ‘60’

config interface ‘wan’
option ifname ‘eth1’
option _orig_ifname ‘eth1’
option _orig_bridge ‘false’
option proto ‘pppoe’
option username ‘user’
option password ‘pass’
option ipv6 ‘auto’
option metric ‘40’

参考

虚拟化相关参照资料:
http://cromwell-intl.com/linux/virtualization.html
https://wiki.debian.org/SystemVirtualization
https://libvirt.org/formatdomain.html#elementsDisks