mirror of
https://github.com/vdsm/virtual-dsm.git
synced 2025-11-06 18:13:43 +08:00
Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
461b5598a9 | ||
|
|
47ed2e8bac | ||
|
|
1c78e3c8b1 | ||
|
|
9f17dfa949 | ||
|
|
3de29b6c00 | ||
|
|
037d52957a | ||
|
|
c7ccc912b5 | ||
|
|
72cbf87986 | ||
|
|
317024d327 | ||
|
|
121c487383 | ||
|
|
fd92b60218 | ||
|
|
771429c5d3 | ||
|
|
674b6e5bda | ||
|
|
7c65e2740f | ||
|
|
d462c6d7a2 | ||
|
|
d5637e8da0 | ||
|
|
1b75bd3c44 | ||
|
|
2551413040 | ||
|
|
44d3e23545 | ||
|
|
d340361320 | ||
|
|
f8f8c16200 | ||
|
|
47fd7931eb | ||
|
|
7ac9c242da | ||
|
|
78d330055f | ||
|
|
06cf0a4edc | ||
|
|
e26c208cc7 | ||
|
|
c2f4823d8b | ||
|
|
ca01bf8cb9 | ||
|
|
a5b2b655dd | ||
|
|
0f2f3b2ea8 | ||
|
|
0705c1c21b | ||
|
|
e4de05ce88 | ||
|
|
a24b62ae67 | ||
|
|
b5a9361b68 | ||
|
|
0e35e4a6d9 | ||
|
|
208a6e6636 | ||
|
|
3fec9bf5ef | ||
|
|
8d8efeb341 | ||
|
|
e9f27899a6 |
25
.github/workflows/build.yml
vendored
25
.github/workflows/build.yml
vendored
@@ -44,6 +44,8 @@ jobs:
|
|||||||
TAGS=()
|
TAGS=()
|
||||||
TAGS=("${{ github.repository }}:latest")
|
TAGS=("${{ github.repository }}:latest")
|
||||||
TAGS+=("${{ github.repository }}:${VERSION}")
|
TAGS+=("${{ github.repository }}:${VERSION}")
|
||||||
|
#TAGS+=("${{ secrets.DOCKERHUB_MIRROR }}:latest")
|
||||||
|
#TAGS+=("${{ secrets.DOCKERHUB_MIRROR }}:${VERSION}")
|
||||||
TAGS+=("ghcr.io/${{ github.repository }}:latest")
|
TAGS+=("ghcr.io/${{ github.repository }}:latest")
|
||||||
TAGS+=("ghcr.io/${{ github.repository }}:${VERSION}")
|
TAGS+=("ghcr.io/${{ github.repository }}:${VERSION}")
|
||||||
|
|
||||||
@@ -86,25 +88,6 @@ jobs:
|
|||||||
name: Clear Docker credentials
|
name: Clear Docker credentials
|
||||||
run: |
|
run: |
|
||||||
rm -f ${HOME}/.docker/config.json
|
rm -f ${HOME}/.docker/config.json
|
||||||
-
|
|
||||||
name: Get previous tag
|
|
||||||
id: previousTag
|
|
||||||
run: |
|
|
||||||
name=$(git --no-pager tag --sort=creatordate --merged ${{ github.ref_name }} | tail -1)
|
|
||||||
echo "previousTag: $name"
|
|
||||||
echo "previousTag=$name" >> $GITHUB_ENV
|
|
||||||
-
|
|
||||||
name: Generate changelog
|
|
||||||
id: changelog
|
|
||||||
uses: requarks/changelog-action@v1
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
fromTag: ${{ github.ref_name }}
|
|
||||||
toTag: ${{ env.previousTag }}
|
|
||||||
writeToFile: false
|
|
||||||
reverseOrder: true
|
|
||||||
includeInvalidCommits: true
|
|
||||||
excludeTypes: "docs,build,chore"
|
|
||||||
-
|
-
|
||||||
name: Create a release
|
name: Create a release
|
||||||
uses: action-pack/github-release@v2
|
uses: action-pack/github-release@v2
|
||||||
@@ -113,10 +96,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
tag: "v${{ steps.prepare.outputs.version }}"
|
tag: "v${{ steps.prepare.outputs.version }}"
|
||||||
title: "v${{ steps.prepare.outputs.version }}"
|
title: "v${{ steps.prepare.outputs.version }}"
|
||||||
body: |
|
|
||||||
${{ steps.changelog.outputs.changes }}
|
|
||||||
|
|
||||||
**Full Changelog**: https://github.com/${{ github.repository }}/compare//${{ env.previousTag }}...v${{ steps.prepare.outputs.version }}
|
|
||||||
-
|
-
|
||||||
name: Increment version variable
|
name: Increment version variable
|
||||||
uses: action-pack/bump@v2
|
uses: action-pack/bump@v2
|
||||||
|
|||||||
2
.github/workflows/hub.yml
vendored
2
.github/workflows/hub.yml
vendored
@@ -19,6 +19,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
repository: ${{ github.repository }}
|
repository: ${{ secrets.DOCKERHUB_REPO }}
|
||||||
short-description: ${{ github.event.repository.description }}
|
short-description: ${{ github.event.repository.description }}
|
||||||
readme-filepath: ./readme.md
|
readme-filepath: ./readme.md
|
||||||
|
|||||||
11
Dockerfile
11
Dockerfile
@@ -7,16 +7,16 @@ FROM qemux/qemu-host as builder
|
|||||||
# RUN go mod download
|
# RUN go mod download
|
||||||
# RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o /qemu-host.bin .
|
# RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o /qemu-host.bin .
|
||||||
|
|
||||||
FROM debian:bookworm-slim
|
FROM debian:trixie-slim
|
||||||
|
|
||||||
ARG DEBCONF_NOWARNINGS="yes"
|
ARG DEBCONF_NOWARNINGS="yes"
|
||||||
ARG DEBIAN_FRONTEND noninteractive
|
ARG DEBIAN_FRONTEND noninteractive
|
||||||
|
|
||||||
RUN apt-get update && apt-get -y upgrade && \
|
RUN apt-get update && apt-get -y upgrade && \
|
||||||
apt-get --no-install-recommends -y install \
|
apt-get --no-install-recommends -y install \
|
||||||
|
tini \
|
||||||
curl \
|
curl \
|
||||||
cpio \
|
cpio \
|
||||||
tini \
|
|
||||||
wget \
|
wget \
|
||||||
fdisk \
|
fdisk \
|
||||||
unzip \
|
unzip \
|
||||||
@@ -57,11 +57,14 @@ ARG BUILD_ARG=0
|
|||||||
ARG VERSION_ARG="0.0"
|
ARG VERSION_ARG="0.0"
|
||||||
ENV VERSION=$VERSION_ARG
|
ENV VERSION=$VERSION_ARG
|
||||||
|
|
||||||
|
LABEL org.opencontainers.image.licenses="MIT"
|
||||||
|
LABEL org.opencontainers.image.title="Virtual DSM"
|
||||||
LABEL org.opencontainers.image.created=${DATE_ARG}
|
LABEL org.opencontainers.image.created=${DATE_ARG}
|
||||||
LABEL org.opencontainers.image.revision=${BUILD_ARG}
|
LABEL org.opencontainers.image.revision=${BUILD_ARG}
|
||||||
LABEL org.opencontainers.image.version=${VERSION_ARG}
|
LABEL org.opencontainers.image.version=${VERSION_ARG}
|
||||||
LABEL org.opencontainers.image.source=https://github.com/kroese/virtual-dsm/
|
LABEL org.opencontainers.image.source="https://github.com/vdsm/virtual-dsm/"
|
||||||
LABEL org.opencontainers.image.url=https://hub.docker.com/r/kroese/virtual-dsm/
|
LABEL org.opencontainers.image.url="https://hub.docker.com/r/vdsm/virtual-dsm/"
|
||||||
|
LABEL org.opencontainers.image.description="Virtual DSM in a docker container"
|
||||||
|
|
||||||
HEALTHCHECK --interval=60s --retries=2 CMD /run/check.sh
|
HEALTHCHECK --interval=60s --retries=2 CMD /run/check.sh
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -u
|
set -u
|
||||||
|
|
||||||
VERSION="7"
|
VERSION="8"
|
||||||
HEADER="VirtualDSM Agent"
|
HEADER="VirtualDSM Agent"
|
||||||
|
|
||||||
# Functions
|
# Functions
|
||||||
@@ -38,7 +38,7 @@ function downloadUpdate {
|
|||||||
|
|
||||||
# Auto update the agent
|
# Auto update the agent
|
||||||
|
|
||||||
URL="https://raw.githubusercontent.com/kroese/virtual-dsm/master/agent/agent.sh"
|
URL="https://raw.githubusercontent.com/vdsm/virtual-dsm/master/agent/agent.sh"
|
||||||
|
|
||||||
remote_size=$(curl -sIk -m 4 "${URL}" | grep -i "content-length:" | tr -d " \t" | cut -d ':' -f 2)
|
remote_size=$(curl -sIk -m 4 "${URL}" | grep -i "content-length:" | tr -d " \t" | cut -d ':' -f 2)
|
||||||
remote_size=${remote_size//$'\r'}
|
remote_size=${remote_size//$'\r'}
|
||||||
@@ -100,6 +100,8 @@ function installPackages {
|
|||||||
trap finish SIGINT SIGTERM
|
trap finish SIGINT SIGTERM
|
||||||
|
|
||||||
ts=$(date +%s%N)
|
ts=$(date +%s%N)
|
||||||
|
|
||||||
|
echo ""
|
||||||
echo "❯ Started $HEADER v$VERSION..."
|
echo "❯ Started $HEADER v$VERSION..."
|
||||||
|
|
||||||
checkNMI
|
checkNMI
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ start() {
|
|||||||
|
|
||||||
if [ ! -f "$SCRIPT" ]; then
|
if [ ! -f "$SCRIPT" ]; then
|
||||||
|
|
||||||
URL="https://raw.githubusercontent.com/kroese/virtual-dsm/master/agent/agent.sh"
|
URL="https://raw.githubusercontent.com/vdsm/virtual-dsm/master/agent/agent.sh"
|
||||||
|
|
||||||
if ! curl -sfk -m 10 -o "${SCRIPT}" "${URL}"; then
|
if ! curl -sfk -m 10 -o "${SCRIPT}" "${URL}"; then
|
||||||
error 'Failed to download agent script.' > /dev/ttyS0
|
error 'Failed to download agent script.' > /dev/ttyS0
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ version: "3"
|
|||||||
services:
|
services:
|
||||||
dsm:
|
dsm:
|
||||||
container_name: dsm
|
container_name: dsm
|
||||||
image: kroese/virtual-dsm:latest
|
image: vdsm/virtual-dsm:latest
|
||||||
environment:
|
environment:
|
||||||
CPU_CORES: "1"
|
CPU_CORES: "1"
|
||||||
DISK_SIZE: "16G"
|
DISK_SIZE: "16G"
|
||||||
|
|||||||
92
readme.md
92
readme.md
@@ -1,6 +1,6 @@
|
|||||||
<h1 align="center">Virtual DSM for Docker<br />
|
<h1 align="center">Virtual DSM for Docker<br />
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="https://github.com/kroese/virtual-dsm/raw/master/.github/screen.jpg" title="Screenshot" style="max-width:100%;" width="432" />
|
<img src="https://github.com/vdsm/virtual-dsm/raw/master/.github/screen.jpg" title="Screenshot" style="max-width:100%;" width="432" />
|
||||||
</div>
|
</div>
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@ Virtual DSM in a docker container.
|
|||||||
- Multi-platform
|
- Multi-platform
|
||||||
- KVM acceleration
|
- KVM acceleration
|
||||||
- GPU passthrough
|
- GPU passthrough
|
||||||
- Graceful shutdown
|
- Graceful shutdowns
|
||||||
- Upgrades supported
|
- Upgrades supported
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
@@ -27,28 +27,28 @@ Via `docker-compose.yml`
|
|||||||
```yaml
|
```yaml
|
||||||
version: "3"
|
version: "3"
|
||||||
services:
|
services:
|
||||||
dsm:
|
dsm:
|
||||||
container_name: dsm
|
container_name: dsm
|
||||||
image: kroese/virtual-dsm:latest
|
image: vdsm/virtual-dsm:latest
|
||||||
environment:
|
environment:
|
||||||
DISK_SIZE: "16G"
|
DISK_SIZE: "16G"
|
||||||
devices:
|
devices:
|
||||||
- /dev/kvm
|
- /dev/kvm
|
||||||
- /dev/vhost-net
|
- /dev/vhost-net
|
||||||
cap_add:
|
cap_add:
|
||||||
- NET_ADMIN
|
- NET_ADMIN
|
||||||
ports:
|
ports:
|
||||||
- 5000:5000
|
- 5000:5000
|
||||||
volumes:
|
volumes:
|
||||||
- /opt/dsm:/storage
|
- /opt/dsm:/storage
|
||||||
restart: on-failure
|
restart: on-failure
|
||||||
stop_grace_period: 1m
|
stop_grace_period: 1m
|
||||||
```
|
```
|
||||||
|
|
||||||
Via `docker run`
|
Via `docker run`
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-timeout 60 kroese/virtual-dsm:latest
|
docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-timeout 60 vdsm/virtual-dsm:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
## FAQ
|
## FAQ
|
||||||
@@ -59,7 +59,7 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
environment:
|
environment:
|
||||||
DISK_SIZE: "256G"
|
DISK_SIZE: "256G"
|
||||||
```
|
```
|
||||||
|
|
||||||
This can also be used to resize the existing disk to a larger capacity without data loss.
|
This can also be used to resize the existing disk to a larger capacity without data loss.
|
||||||
@@ -70,7 +70,7 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
volumes:
|
volumes:
|
||||||
- /home/user/data:/storage
|
- /home/user/data:/storage
|
||||||
```
|
```
|
||||||
|
|
||||||
Replace the example path `/home/user/data` with the desired storage folder.
|
Replace the example path `/home/user/data` with the desired storage folder.
|
||||||
@@ -81,7 +81,7 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
environment:
|
environment:
|
||||||
ALLOCATE: "N"
|
ALLOCATE: "N"
|
||||||
```
|
```
|
||||||
|
|
||||||
Keep in mind that this will not affect any of your existing disks, it only applies to newly created disks.
|
Keep in mind that this will not affect any of your existing disks, it only applies to newly created disks.
|
||||||
@@ -92,8 +92,8 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
environment:
|
environment:
|
||||||
CPU_CORES: "4"
|
CPU_CORES: "4"
|
||||||
RAM_SIZE: "2048M"
|
RAM_SIZE: "2048M"
|
||||||
```
|
```
|
||||||
|
|
||||||
* ### How do I verify if my system supports KVM?
|
* ### How do I verify if my system supports KVM?
|
||||||
@@ -127,16 +127,16 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
services:
|
services:
|
||||||
dsm:
|
dsm:
|
||||||
container_name: dsm
|
container_name: dsm
|
||||||
..<snip>..
|
..<snip>..
|
||||||
networks:
|
networks:
|
||||||
vdsm:
|
vdsm:
|
||||||
ipv4_address: 192.168.0.100
|
ipv4_address: 192.168.0.100
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
vdsm:
|
vdsm:
|
||||||
external: true
|
external: true
|
||||||
```
|
```
|
||||||
|
|
||||||
An added benefit of this approach is that you won't have to perform any port mapping anymore since all ports will be exposed by default.
|
An added benefit of this approach is that you won't have to perform any port mapping anymore since all ports will be exposed by default.
|
||||||
@@ -151,11 +151,11 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
environment:
|
environment:
|
||||||
DHCP: "Y"
|
DHCP: "Y"
|
||||||
devices:
|
devices:
|
||||||
- /dev/vhost-net
|
- /dev/vhost-net
|
||||||
device_cgroup_rules:
|
device_cgroup_rules:
|
||||||
- 'c *:* rwm'
|
- 'c *:* rwm'
|
||||||
```
|
```
|
||||||
|
|
||||||
Please note that even if you don't need DHCP, it's still recommended to enable this feature as it prevents NAT issues and increases performance by using a `macvtap` interface.
|
Please note that even if you don't need DHCP, it's still recommended to enable this feature as it prevents NAT issues and increases performance by using a `macvtap` interface.
|
||||||
@@ -166,21 +166,23 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
environment:
|
environment:
|
||||||
URL: "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_VirtualDSM_42218.pat"
|
URL: "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_VirtualDSM_42218.pat"
|
||||||
```
|
```
|
||||||
|
|
||||||
With this method, you are able to switch between different versions while keeping your file data.
|
With this method, you are able to switch between different versions while keeping your file data.
|
||||||
|
|
||||||
* ### How do I passthrough my GPU?
|
* ### How do I passthrough my GPU?
|
||||||
|
|
||||||
To enable this feature, add the following lines to your compose file:
|
To passthrough your GPU, add the following lines to your compose file:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
environment:
|
environment:
|
||||||
GPU: "Y"
|
GPU: "Y"
|
||||||
devices:
|
devices:
|
||||||
- /dev/dri
|
- /dev/dri
|
||||||
```
|
```
|
||||||
|
|
||||||
|
This can be used to enable facial recognition in Synology Photos for example.
|
||||||
|
|
||||||
* ### What are the differences compared to the standard DSM?
|
* ### What are the differences compared to the standard DSM?
|
||||||
|
|
||||||
@@ -196,11 +198,11 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
|||||||
|
|
||||||
Only run this container on Synology hardware, any other use is not permitted by their EULA. The product names, logos, brands, and other trademarks referred to within this project are the property of their respective trademark holders. This project is not affiliated, sponsored, or endorsed by Synology, Inc.
|
Only run this container on Synology hardware, any other use is not permitted by their EULA. The product names, logos, brands, and other trademarks referred to within this project are the property of their respective trademark holders. This project is not affiliated, sponsored, or endorsed by Synology, Inc.
|
||||||
|
|
||||||
[build_url]: https://github.com/kroese/virtual-dsm/
|
[build_url]: https://github.com/vdsm/virtual-dsm/
|
||||||
[hub_url]: https://hub.docker.com/r/kroese/virtual-dsm
|
[hub_url]: https://hub.docker.com/r/vdsm/virtual-dsm
|
||||||
[tag_url]: https://hub.docker.com/r/kroese/virtual-dsm/tags
|
[tag_url]: https://hub.docker.com/r/vdsm/virtual-dsm/tags
|
||||||
|
|
||||||
[Build]: https://github.com/kroese/virtual-dsm/actions/workflows/build.yml/badge.svg
|
[Build]: https://github.com/vdsm/virtual-dsm/actions/workflows/build.yml/badge.svg
|
||||||
[Size]: https://img.shields.io/docker/image-size/kroese/virtual-dsm/latest?color=066da5&label=size
|
[Size]: https://img.shields.io/docker/image-size/vdsm/virtual-dsm/latest?color=066da5&label=size
|
||||||
[Pulls]: https://img.shields.io/docker/pulls/kroese/virtual-dsm.svg?style=flat&label=pulls&logo=docker
|
[Pulls]: https://img.shields.io/docker/pulls/kroese/virtual-dsm.svg?style=flat&label=pulls&logo=docker
|
||||||
[Version]: https://img.shields.io/docker/v/kroese/virtual-dsm/latest?arch=amd64&sort=semver&color=066da5
|
[Version]: https://img.shields.io/docker/v/vdsm/virtual-dsm/latest?arch=amd64&sort=semver&color=066da5
|
||||||
|
|||||||
31
run/disk.sh
31
run/disk.sh
@@ -136,13 +136,6 @@ if [[ SIZE -ne DATA_SIZE ]]; then
|
|||||||
error "Virtual disk has the wrong size: ${SIZE}" && exit 89
|
error "Virtual disk has the wrong size: ${SIZE}" && exit 89
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AGENT="${STORAGE}/${BASE}.agent"
|
|
||||||
[ -f "$AGENT" ] && AGENT_VERSION=$(cat "${AGENT}") || AGENT_VERSION=1
|
|
||||||
|
|
||||||
if ((AGENT_VERSION < 5)); then
|
|
||||||
info "The installed VirtualDSM Agent v${AGENT_VERSION} is an outdated version, please upgrade it."
|
|
||||||
fi
|
|
||||||
|
|
||||||
DISK_OPTS="\
|
DISK_OPTS="\
|
||||||
-device virtio-scsi-pci,id=hw-synoboot,bus=pcie.0,addr=0xa \
|
-device virtio-scsi-pci,id=hw-synoboot,bus=pcie.0,addr=0xa \
|
||||||
-drive file=${BOOT},if=none,id=drive-synoboot,format=raw,cache=${DISK_CACHE},aio=${DISK_IO},discard=${DISK_DISCARD},detect-zeroes=on \
|
-drive file=${BOOT},if=none,id=drive-synoboot,format=raw,cache=${DISK_CACHE},aio=${DISK_IO},discard=${DISK_DISCARD},detect-zeroes=on \
|
||||||
@@ -185,6 +178,8 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
: ${DEVICE:=''} # Docker variable to passthrough a block device, like /dev/vdc1.
|
: ${DEVICE:=''} # Docker variable to passthrough a block device, like /dev/vdc1.
|
||||||
|
: ${DEVICE2:=''}
|
||||||
|
: ${DEVICE3:=''}
|
||||||
|
|
||||||
if [ -n "${DEVICE}" ]; then
|
if [ -n "${DEVICE}" ]; then
|
||||||
|
|
||||||
@@ -196,3 +191,25 @@ if [ -n "${DEVICE}" ]; then
|
|||||||
-device scsi-hd,bus=hw-userdata4.0,channel=0,scsi-id=0,lun=0,drive=drive-userdata4,id=userdata4,rotation_rate=${DISK_ROTATION},bootindex=6"
|
-device scsi-hd,bus=hw-userdata4.0,channel=0,scsi-id=0,lun=0,drive=drive-userdata4,id=userdata4,rotation_rate=${DISK_ROTATION},bootindex=6"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -n "${DEVICE2}" ]; then
|
||||||
|
|
||||||
|
[ ! -b "${DEVICE2}" ] && error "Device ${DEVICE2} cannot be found! Please add it to the 'devices' section of your compose file." && exit 56
|
||||||
|
|
||||||
|
DISK_OPTS="${DISK_OPTS} \
|
||||||
|
-device virtio-scsi-pci,id=hw-userdata5,bus=pcie.0,addr=0x5 \
|
||||||
|
-drive file=${DEVICE2},if=none,id=drive-userdata5,format=raw,cache=${DISK_CACHE},aio=${DISK_IO},discard=${DISK_DISCARD},detect-zeroes=on \
|
||||||
|
-device scsi-hd,bus=hw-userdata5.0,channel=0,scsi-id=0,lun=0,drive=drive-userdata5,id=userdata5,rotation_rate=${DISK_ROTATION},bootindex=7"
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${DEVICE3}" ]; then
|
||||||
|
|
||||||
|
[ ! -b "${DEVICE3}" ] && error "Device ${DEVICE3} cannot be found! Please add it to the 'devices' section of your compose file." && exit 57
|
||||||
|
|
||||||
|
DISK_OPTS="${DISK_OPTS} \
|
||||||
|
-device virtio-scsi-pci,id=hw-userdata6,bus=pcie.0,addr=0x6 \
|
||||||
|
-drive file=${DEVICE3},if=none,id=drive-userdata6,format=raw,cache=${DISK_CACHE},aio=${DISK_IO},discard=${DISK_DISCARD},detect-zeroes=on \
|
||||||
|
-device scsi-hd,bus=hw-userdata6.0,channel=0,scsi-id=0,lun=0,drive=drive-userdata6,id=userdata6,rotation_rate=${DISK_ROTATION},bootindex=8"
|
||||||
|
|
||||||
|
fi
|
||||||
|
|||||||
12
run/gpu.sh
12
run/gpu.sh
@@ -28,3 +28,15 @@ if ! apt-mark showinstall | grep -q "xserver-xorg-video-intel"; then
|
|||||||
apt-get -qq --no-install-recommends -y install xserver-xorg-video-intel > /dev/null
|
apt-get -qq --no-install-recommends -y install xserver-xorg-video-intel > /dev/null
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if ! apt-mark showinstall | grep -q "qemu-system-modules-opengl"; then
|
||||||
|
|
||||||
|
info "Installing OpenGL module..."
|
||||||
|
|
||||||
|
export DEBCONF_NOWARNINGS="yes"
|
||||||
|
export DEBIAN_FRONTEND="noninteractive"
|
||||||
|
|
||||||
|
apt-get -qq update
|
||||||
|
apt-get -qq --no-install-recommends -y install qemu-system-modules-opengl > /dev/null
|
||||||
|
|
||||||
|
fi
|
||||||
|
|||||||
@@ -242,9 +242,6 @@ mkdir -p "$LOC"
|
|||||||
cp /agent/service.sh "$LOC/agent.sh"
|
cp /agent/service.sh "$LOC/agent.sh"
|
||||||
chmod 755 "$LOC/agent.sh"
|
chmod 755 "$LOC/agent.sh"
|
||||||
|
|
||||||
# Store agent version
|
|
||||||
echo "7" > "$STORAGE"/"$BASE".agent
|
|
||||||
|
|
||||||
info "Install: Installing system partition..."
|
info "Install: Installing system partition..."
|
||||||
|
|
||||||
LABEL="1.44.1-42218"
|
LABEL="1.44.1-42218"
|
||||||
|
|||||||
@@ -234,7 +234,11 @@ fi
|
|||||||
if [[ "${DHCP}" == [Yy1]* ]]; then
|
if [[ "${DHCP}" == [Yy1]* ]]; then
|
||||||
|
|
||||||
if [[ "$GATEWAY" == "172."* ]]; then
|
if [[ "$GATEWAY" == "172."* ]]; then
|
||||||
error "You can only enable DHCP while the container is on a macvlan network!" && exit 86
|
if [[ "${DEBUG}" == [Yy1]* ]]; then
|
||||||
|
info "Warning: Are you sure the container is on a macvlan network?"
|
||||||
|
else
|
||||||
|
error "You can only enable DHCP while the container is on a macvlan network!" && exit 86
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Configuration for DHCP IP
|
# Configuration for DHCP IP
|
||||||
|
|||||||
23
run/power.sh
23
run/power.sh
@@ -39,28 +39,14 @@ _graceful_shutdown() {
|
|||||||
|
|
||||||
echo && error "Could not send shutdown command to the guest ($RESPONSE)"
|
echo && error "Could not send shutdown command to the guest ($RESPONSE)"
|
||||||
|
|
||||||
# If we cannot shutdown the usual way, fallback to the NMI method
|
# Send a NMI interrupt which will be detected by the agent script
|
||||||
|
if ! echo 'nmi' | nc -q 1 -w 1 localhost "${QEMU_MONPORT}" > /dev/null ; then
|
||||||
AGENT="${STORAGE}/${BASE}.agent"
|
|
||||||
[ -f "$AGENT" ] && AGENT_VERSION=$(cat "${AGENT}") || AGENT_VERSION=1
|
|
||||||
|
|
||||||
if ((AGENT_VERSION > 1)); then
|
|
||||||
|
|
||||||
# Send a NMI interrupt which will be detected by the kernel
|
|
||||||
if ! echo 'nmi' | nc -q 1 -w 1 localhost "${QEMU_MONPORT}" > /dev/null ; then
|
|
||||||
AGENT_VERSION=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ((AGENT_VERSION < 2)); then
|
|
||||||
|
|
||||||
echo && info "Please update the VirtualDSM Agent to allow for gracefull shutdowns..."
|
|
||||||
|
|
||||||
kill -15 "$(cat "${_QEMU_PID}")"
|
kill -15 "$(cat "${_QEMU_PID}")"
|
||||||
pkill -f qemu-system-x86_64 || true
|
pkill -f qemu-system-x86_64 || true
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
while [ "$(cat ${_QEMU_SHUTDOWN_COUNTER})" -lt "${QEMU_POWERDOWN_TIMEOUT}" ]; do
|
while [ "$(cat ${_QEMU_SHUTDOWN_COUNTER})" -lt "${QEMU_POWERDOWN_TIMEOUT}" ]; do
|
||||||
@@ -72,7 +58,8 @@ _graceful_shutdown() {
|
|||||||
if echo 'info version'| nc -q 1 -w 1 localhost "${QEMU_MONPORT}" >/dev/null 2>&1 ; then
|
if echo 'info version'| nc -q 1 -w 1 localhost "${QEMU_MONPORT}" >/dev/null 2>&1 ; then
|
||||||
|
|
||||||
sleep 1
|
sleep 1
|
||||||
#info "Shutting down, waiting... ($(cat ${_QEMU_SHUTDOWN_COUNTER})/${QEMU_POWERDOWN_TIMEOUT})"
|
CNT="$(cat ${_QEMU_SHUTDOWN_COUNTER})/${QEMU_POWERDOWN_TIMEOUT}"
|
||||||
|
[[ "${DEBUG}" == [Yy1]* ]] && info "Shutting down, waiting... (${CNT})"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user