mirror of
https://github.com/linuxkit/linuxkit.git
synced 2025-07-19 17:26:28 +00:00
Adding losetup utility package to core pkg
Signed-off-by: Christian Wuerdig <christian.wuerdig@gmail.com>
This commit is contained in:
parent
3f164b3648
commit
8cd16c4904
27
docs/losetup.md
Normal file
27
docs/losetup.md
Normal file
@ -0,0 +1,27 @@
|
||||
# LinuxKit losetup
|
||||
|
||||
Image to setup a loop device backed by a regular file in a [linuxkit](https://github.com/linuxkit/linuxkit)-generated image. The typical use case is to have a portable storage location which can be used to persist settings or other files. Can be combined with the `linuxkit/dm-crypt` package for protection.
|
||||
|
||||
## Usage
|
||||
|
||||
The setup is a one time step during boot:
|
||||
|
||||
```yaml
|
||||
onboot:
|
||||
- name: losetup
|
||||
image: linuxkit/losetup:<hash>
|
||||
command: ["/usr/bin/loopy", "-c", "/var/test.img"]
|
||||
```
|
||||
|
||||
The above will associate the file `/var/test.img` with `/dev/loop0` and will also create it if it's not present.
|
||||
|
||||
The container by default bind-mounts `/var:/var` and `/dev:/dev`. Usually the loop-file will reside on external storage which should be typically mounted under `/var` hence the choice of the defaults. If the loop-file is located somewhere else and you need a different bind-mount for it then do not forget to explicitly bind-mount `/dev:/dev` as well or else `losetup` will fail.
|
||||
|
||||
### Options
|
||||
|
||||
|Option|Default|Required|Notes|
|
||||
|---|---|---|---|
|
||||
|`-c` or `--create`||No|Creates the file if not present. If `--create` is not specified and the file is missing then the loop setup will obviously fail.|
|
||||
|`-s` or `--size`|10|No|If `--create` was specified and the file is not present then this sets the size in MiB of the created file. The file will be filled from `/dev/zero`.|
|
||||
|`-d` or `--dev`|`/dev/loop0`|No|Loop device which should be associated with the file.|
|
||||
|`<file>`||**Yes**|The file to use as backing storage.|
|
18
pkg/losetup/Dockerfile
Normal file
18
pkg/losetup/Dockerfile
Normal file
@ -0,0 +1,18 @@
|
||||
FROM linuxkit/alpine:3683c9a66cd4da40bd7d6c7da599b2dcd738b559 AS mirror
|
||||
RUN mkdir -p /out/etc/apk && cp -r /etc/apk/* /out/etc/apk/
|
||||
RUN apk add --no-cache --initdb -p /out \
|
||||
alpine-baselayout \
|
||||
busybox
|
||||
|
||||
# Remove apk residuals
|
||||
RUN rm -rf /out/etc/apk /out/lib/apk /out/var/cache
|
||||
|
||||
FROM scratch
|
||||
ENTRYPOINT []
|
||||
WORKDIR /
|
||||
COPY --from=mirror /out/ /
|
||||
|
||||
COPY loopy.sh /usr/bin/loopy
|
||||
RUN chmod +x /usr/bin/loopy
|
||||
|
||||
CMD ["/usr/bin/loopy"]
|
7
pkg/losetup/build.yml
Normal file
7
pkg/losetup/build.yml
Normal file
@ -0,0 +1,7 @@
|
||||
image: losetup
|
||||
config:
|
||||
binds:
|
||||
- /dev:/dev
|
||||
- /var:/var
|
||||
capabilities:
|
||||
- CAP_SYS_ADMIN
|
57
pkg/losetup/loopy.sh
Normal file
57
pkg/losetup/loopy.sh
Normal file
@ -0,0 +1,57 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
help()
|
||||
{
|
||||
echo "Usage: $0 [options] <file>"
|
||||
echo
|
||||
echo "Options:"
|
||||
echo " -c, --create Create <file> if not present, default: false"
|
||||
echo " -s, --size NUM Size of <file> in MiB if it gets created, default: 10"
|
||||
echo " -d, --dev DEVICE Use DEVICE as loop device, default: /dev/loop0"
|
||||
echo
|
||||
}
|
||||
|
||||
create=false
|
||||
size_mib=10
|
||||
loop_device="/dev/loop0"
|
||||
|
||||
O=`getopt -l create,size:,dev:,help -- cs:d:h "$@"` || exit 1
|
||||
eval set -- "$O"
|
||||
while true; do
|
||||
case "$1" in
|
||||
-c|--create) create=true; shift;;
|
||||
-s|--size) size_mib=$2; shift 2;;
|
||||
-d|--dev) loop_device=$2; shift 2;;
|
||||
-h|--help) help; exit 0;;
|
||||
--) shift; break;;
|
||||
*) echo "Unknown option $1"; help; exit 1;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "Missing argument <file>"
|
||||
help
|
||||
exit 1
|
||||
fi
|
||||
|
||||
container_file=$1
|
||||
|
||||
if [ ! -b "$loop_device" ]; then
|
||||
echo "Loop device $loop_device doesn't exist! Did you forget to bind-mount '/dev'?"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
if [ ! -f "$container_file" ]; then
|
||||
if [ $create = true ]; then
|
||||
echo "File $container_file not found, creating new one of size $size_mib MiB"
|
||||
dd if="/dev/zero" of="$container_file" bs=1M count=$size_mib
|
||||
else
|
||||
echo "File $container_file not found. Please specify --create or ensure it's present."
|
||||
exit 2
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Associating file $container_file with loop device $loop_device"
|
||||
losetup "$loop_device" "$container_file"
|
12
test/cases/040_packages/012_losetup/check.sh
Executable file
12
test/cases/040_packages/012_losetup/check.sh
Executable file
@ -0,0 +1,12 @@
|
||||
#!/bin/sh
|
||||
|
||||
function failed {
|
||||
printf "losetup test suite FAILED\n" >&1
|
||||
exit 1
|
||||
}
|
||||
|
||||
LOOPFILE=$(losetup /dev/loop0 2>/dev/null | cut -d' ' -f3)
|
||||
|
||||
[ "$LOOPFILE" = "/var/test.img" ] || failed
|
||||
|
||||
printf "losetup test suite PASSED\n" >&1
|
25
test/cases/040_packages/012_losetup/test.sh
Normal file
25
test/cases/040_packages/012_losetup/test.sh
Normal file
@ -0,0 +1,25 @@
|
||||
#!/bin/sh
|
||||
# SUMMARY: Check that the losetup package works
|
||||
# LABELS:
|
||||
# REPEAT:
|
||||
|
||||
set -e
|
||||
|
||||
# Source libraries. Uncomment if needed/defined
|
||||
#. "${RT_LIB}"
|
||||
. "${RT_PROJECT_ROOT}/_lib/lib.sh"
|
||||
|
||||
NAME=losetup
|
||||
|
||||
clean_up() {
|
||||
rm -rf ${NAME}-*
|
||||
}
|
||||
trap clean_up EXIT
|
||||
|
||||
# Test code goes here
|
||||
linuxkit build -format kernel+initrd -name "${NAME}" test.yml
|
||||
RESULT="$(linuxkit run $NAME)"
|
||||
echo "${RESULT}"
|
||||
echo "${RESULT}" | grep -q "suite PASSED"
|
||||
|
||||
exit 0
|
28
test/cases/040_packages/012_losetup/test.yml
Normal file
28
test/cases/040_packages/012_losetup/test.yml
Normal file
@ -0,0 +1,28 @@
|
||||
kernel:
|
||||
image: linuxkit/kernel:4.14.88
|
||||
cmdline: "console=ttyS0 console=ttyAMA0"
|
||||
init:
|
||||
- linuxkit/init:c563953a2277eb73a89d89f70e4b6dcdcfebc2d1
|
||||
- linuxkit/runc:83d0edb4552b1a5df1f0976f05f442829eac38fe
|
||||
onboot:
|
||||
- name: losetup
|
||||
image: linuxkit/losetup:aaceeea49ac519bc3b87da239436dd997d67b431
|
||||
command: ["/usr/bin/loopy", "-c", "/var/test.img"]
|
||||
- name: test
|
||||
image: alpine:3.8
|
||||
net: host
|
||||
binds:
|
||||
- /check.sh:/check.sh
|
||||
- /dev:/dev
|
||||
command: ["sh", "./check.sh"]
|
||||
- name: poweroff
|
||||
image: linuxkit/poweroff:afe8f7dd0d47a7991c54519b0f09124cb8c4e300
|
||||
command: ["/bin/sh", "/poweroff.sh", "10"]
|
||||
files:
|
||||
- path: check.sh
|
||||
source: ./check.sh
|
||||
trust:
|
||||
org:
|
||||
- linuxkit
|
||||
image:
|
||||
- alpine:3.8
|
Loading…
Reference in New Issue
Block a user