Skip to content

Commit

Permalink
Merge branch 'shared_dirs_improvements' into 'main'
Browse files Browse the repository at this point in the history
Make shared dirs persistent

See merge request repositories/renode-linux-runner-action!2
  • Loading branch information
jmichalski-ant committed Feb 15, 2024
2 parents fb10cdc + d77f7eb commit 5a89ebf
Show file tree
Hide file tree
Showing 7 changed files with 112 additions and 17 deletions.
53 changes: 53 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,59 @@ jobs:
git+https://github.com/antmicro/tuttest.git@c44309e0365c54759fb36864fb77bf8b347bd647
repos: https://github.com/antmicro/pyrav4l2.git pyrav4l2

riscv64-shared-dirs-test:
runs-on: ubuntu-latest
needs: send-to-releases
if: ${{ !failure() && !github.event.act }}
steps:
- uses: actions/checkout@v3

- name: prepare shared directiories
run: mkdir shared_dir shared_dir2

- name: test
uses: ./
with:
rootfs-size: +128M
shared-dirs: |
shared_dir /home/shared_dir
shared_dir2 /home/shared_dir2
renode-run: |
echo "shared-dirs-test" > shared_dir/f.txt
echo "shared-dirs-test2" > shared_dir2/f.txt
- name: read shared directories
run: |
$([ "$(cat shared_dir/f.txt)" = "shared-dirs-test" ])
$([ "$(cat shared_dir2/f.txt)" = "shared-dirs-test2" ])
arm32-shared-dirs-test:
runs-on: ubuntu-latest
needs: send-to-releases
if: ${{ !failure() && !github.event.act }}
steps:
- uses: actions/checkout@v3

- name: prepare shared directiories
run: mkdir shared_dir shared_dir2

- name: test
uses: ./
with:
arch: arm32
rootfs-size: +128M
shared-dirs: |
shared_dir /home/shared_dir
shared_dir2 /home/shared_dir2
renode-run: |
echo "shared-dirs-test" > shared_dir/f.txt
echo "shared-dirs-test2" > shared_dir2/f.txt
- name: read shared directories
run: |
$([ "$(cat shared_dir/f.txt)" = "shared-dirs-test" ])
$([ "$(cat shared_dir2/f.txt)" = "shared-dirs-test2" ])
arm32-test:
runs-on: ubuntu-latest
needs: send-to-releases
Expand Down
8 changes: 5 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ This is achieved by running an emulated Linux system inside [Renode](https://ren

### OS configuration

- [`rootfs-size`](#rootfs-size) - Set the size of the rootfs image. Default: `auto`
- [`rootfs-size`](#rootfs-size) - Set the size of the rootfs image. Default: `auto`.
- [`image-type`](#image) - `native` or `docker`. Read about the differences in the [image section](#image)
- [`image`](#image) - URL path to a Linux rootfs `tar.xz` archive for the specified architecture or a Docker image identifier. If not specified, the action will use the default one. See releases for examples
- [`tasks`](#tasks) - Allows you to change the way the system is initialized. See [Tasks](#tasks) for more details.
Expand Down Expand Up @@ -132,7 +132,9 @@ We are working on adding `arm64` support.

You can specify many directories that will be added to the rootfs. All files from these directories will be available in the specified target directories.

In the following example, files from the `project-files` directory will be extracted to the `/opt/project` directory. If no destination directory is specified, the files will be extracted to `/home`.
In the following example, files from the `project-files` directory will be extracted to the `/opt/project` directory. If no destination directory is specified, the files will be extracted to `/home`.

At the end of the action contents of the shared directories will be copied back from the mounted filesystem.

```yaml
- uses: antmicro/renode-linux-runner-action@v1
Expand Down Expand Up @@ -226,7 +228,7 @@ If you need additional software, you can mount your own filesystem. More informa

## Rootfs size

The size of the mounted rootfs can be specified with the `rootfs-size` parameter. The parameter accepts sizes in bytes (e.g. `1000000000`), kilobytes (e.g. `50000K`), megabytes (e.g. `512M`) or gigabytes (e.g. `1G`). The default `rootfs-size` value is `auto`; with this setting the size is calculated automatically.
The size of the mounted rootfs can be specified with the `rootfs-size` parameter. The parameter accepts sizes in bytes (e.g. `1000000000`), kilobytes (e.g. `50000K`), megabytes (e.g. `512M`) or gigabytes (e.g. `1G`). The default `rootfs-size` value is `auto`; with this setting the size is calculated automatically. Preceding the value with `+` sign (e.g. `+value`) sets the size to `auto` + `value`.

```yaml
- uses: antmicro/renode-linux-runner-action@v1
Expand Down
2 changes: 1 addition & 1 deletion action/device/hifive_unleashed/init.resc
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ machine LoadPlatformDescription @action/device/hifive_unleashed/platform.repl

# rootfs
machine LoadPlatformDescriptionFromString 'virtio: Storage.VirtIOBlockDevice @ sysbus 0x100d0000 { IRQ -> plic@50 }'
virtio LoadImage @images/rootfs.img
virtio LoadImage @images/rootfs.img true

showAnalyzer uart0
e51 LogFunctionNames true
Expand Down
2 changes: 1 addition & 1 deletion action/device/zynq_7000/init.resc
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ ttc1 Frequency 33333333

# rootfs
machine LoadPlatformDescriptionFromString 'virtio: Storage.VirtIOBlockDevice @ sysbus 0xe0104000 { IRQ -> gic@63 }'
virtio LoadImage @images/rootfs.img
virtio LoadImage @images/rootfs.img true

# This setting increases emulation speed, thus mitigates networks errors and speedup user scripts.
machine SetAdvanceImmediately true
Expand Down
42 changes: 31 additions & 11 deletions action/images.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,36 @@ def prepare_kernel_and_initramfs(kernel: str):
error("Kernel not found! Action expects Image or vmlinux file.")


def rootfs_size(size_str: str) -> int:
"""
Returns rootfs size
Parameters
----------
size_str: str
rootfs-size action parameter value
"""

units = {
"B": 1,
"K": 1024,
"M": 1024**2,
"G": 1024**3
}

if size_str == "auto" or size_str.startswith("+"):
size = 0
for path, _, files in os.walk("images/rootfs"):
for f in files:
fp = os.path.join(path, f)
if not os.path.islink(fp):
size += os.path.getsize(fp)

additional_size = int(size_str[:-1]) * units[size_str[-1]] if size_str.startswith("+") and size_str[-1] in units else 0
return max(size * 2, 5 * 10**7) + additional_size
return int(size_str)


def burn_rootfs_image(
user_directory: str,
image: str,
Expand Down Expand Up @@ -185,18 +215,8 @@ def burn_rootfs_image(
dirs_exist_ok=True
)

if image_size == "auto":
size = 0
for path, _, files in os.walk("images/rootfs"):
for f in files:
fp = os.path.join(path, f)
if not os.path.islink(fp):
size += os.path.getsize(fp)

image_size = f'{max(size * 2, 5 * 10**7)}'
try:

run(["truncate", "images/rootfs.img", "-s", image_size], check=True)
run(["truncate", "images/rootfs.img", "-s", f"{rootfs_size(image_size)}"], check=True)
run(["mkfs.ext4", "-d", "images/rootfs", "images/rootfs.img"],
check=True,
stdout=DEVNULL)
Expand Down
14 changes: 13 additions & 1 deletion action/run-in-renode.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,17 @@
from common import get_file, error, archs
from devices import add_devices
from dependencies import add_repos, add_packages
from images import prepare_shared_directories, prepare_kernel_and_initramfs, burn_rootfs_image
from images import prepare_shared_directories, prepare_kernel_and_initramfs, burn_rootfs_image, shared_directories_actions
from dispatcher import CommandDispatcher
from subprocess import run

from datetime import datetime

import sys
import json
import yaml
import shutil
import os


DEFAULT_IMAGE_PATH = "https://github.com/{}/releases/download/{}/image-{}-default.tar.xz"
Expand Down Expand Up @@ -146,3 +149,12 @@ def test_task(test_task_str: str):
dispatcher.add_task(test_task(args.get("renode-run", "")))

dispatcher.evaluate()

run(["mkdir", "rootfs"], check=True)
run(["sudo", "mount", "images/rootfs.img", "rootfs"], check=True)

for dir in shared_directories_actions:
src = f"rootfs/{dir.target}"
dst = f"{user_directory}/{dir.host}" if not dir.host.startswith('/') else dir.host
if os.path.exists(src):
shutil.copytree(src, dst, dirs_exist_ok=True)
8 changes: 8 additions & 0 deletions action/tasks/save_shared_dirs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
name: save_shared_dirs
shell: target
requires: [action_test]
echo: true
timeout: 5
fail-fast: false
commands:
- sync

0 comments on commit 5a89ebf

Please sign in to comment.