mrrl-mdev-conf

mdevd configuration for mrrl; fork of Alpine's mdev-conf
git clone https://ccx.te2000.cz/git/mrrl-mdev-conf
Log | Files | Refs | README | LICENSE

commit e62950a049c0a66b6a35c6d6539885f876f52f1c
parent ff08724c1dc05bec3943dd6963adcd236840276b
Author: Natanael Copa <ncopa@alpinelinux.org>
Date:   Wed, 20 Jul 2022 13:27:26 +0200

Import scripts and tests

Diffstat:
A.gitignore | 2++
AMakefile | 23+++++++++++++++++++++++
Advbdev | 18++++++++++++++++++
Amdev.conf | 141+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apersistent-storage | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aptpdev | 15+++++++++++++++
Atests/persistent-storage_test | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/ptpdev_test | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atests/test_env.sh | 15+++++++++++++++
Ausbdev | 25+++++++++++++++++++++++++
10 files changed, 540 insertions(+), 0 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -0,0 +1,2 @@ +Kyuafile +tests/Kyuafile diff --git a/Makefile b/Makefile @@ -0,0 +1,23 @@ +.PHONY: all check +all: + +tests/Kyuafile: $(wildcard tests/*_test) + echo "syntax(2)" > $@.tmp + echo 'test_suite("mdev-conf")' >> $@.tmp + for i in $(notdir $(wildcard tests/*_test)); do \ + echo "atf_test_program{name='$$i',timeout=1}" >> $@.tmp ; \ + done + mv $@.tmp $@ + +Kyuafile: + echo "syntax(2)" > $@.tmp + echo "test_suite('mdev-conf')" >> $@.tmp + echo "include('tests/Kyuafile')" >> $@.tmp + mv $@.tmp $@ + +check: tests/Kyuafile Kyuafile + kyua test || { kyua report --verbose && exit 1; } + + +clean: + rm -f tests/Kyuafile Kyuafile diff --git a/dvbdev b/dvbdev @@ -0,0 +1,18 @@ +#!/bin/sh + +# MDEV=dvb0.demux1 -> ADAPTER=dvb0 -> N=0 +ADAPTER=${MDEV%.*} +N=${ADAPTER#dvb} +# MDEV=dvb0.demux1 -> DEVB_DEV=demux1 +DVB_DEV=${MDEV#*.} + +case "$ACTION" in + add|"") + mkdir -p dvb/adapter${N} + mv ${MDEV} dvb/adapter${N}/${DVB_DEV} + ;; + remove) + rm -f dvb/adapter${N}/${DVB_DEV} + rmdir dvb/adapter${N} 2>/dev/null + rmdir dvb/ 2>/dev/null +esac diff --git a/mdev.conf b/mdev.conf @@ -0,0 +1,141 @@ +# +# This is a sample mdev.conf. +# + +# Devices: +# Syntax: %s %d:%d %s +# devices user:group mode + +$MODALIAS=.* root:root 0660 @modprobe -q -b "$MODALIAS" + +# null does already exist; therefore ownership has to be changed with command +null root:root 0666 @chmod 666 $MDEV +zero root:root 0666 +grsec root:root 0660 +full root:root 0666 + +random root:root 0666 +urandom root:root 0444 +hwrandom root:root 0660 + +console root:tty 0600 + +# load frambuffer console when first frambuffer is found +fb0 root:video 0660 @modprobe -q -b fbcon +vchiq root:video 0660 + +fd0 root:floppy 0660 +kmem root:root 0640 +mem root:root 0640 +port root:root 0640 +ptmx root:tty 0666 + +# Kernel-based Virtual Machine. +kvm root:kvm 660 + +# ram.* +ram([0-9]*) root:disk 0660 >rd/%1 +loop([0-9]+) root:disk 0660 >loop/%1 + +# persistent storage +dasd.* root:disk 0660 */lib/mdev/persistent-storage +mmcblk.* root:disk 0660 */lib/mdev/persistent-storage +nbd.* root:disk 0660 */lib/mdev/persistent-storage +nvme.* root:disk 0660 */lib/mdev/persistent-storage +sd[a-z].* root:disk 0660 */lib/mdev/persistent-storage +sr[0-9]+ root:cdrom 0660 */lib/mdev/persistent-storage +vd[a-z].* root:disk 0660 */lib/mdev/persistent-storage +xvd[a-z].* root:disk 0660 */lib/mdev/persistent-storage + +md[0-9] root:disk 0660 + +tty root:tty 0666 +tty[0-9] root:root 0600 +tty[0-9][0-9] root:tty 0660 +ttyS[0-9]* root:uucp 0660 +pty.* root:tty 0660 +vcs[0-9]* root:tty 0660 +vcsa[0-9]* root:tty 0660 + +# rpi bluetooth +#ttyAMA0 root:tty 660 @btattach -B /dev/$MDEV -P bcm -S 115200 -N & + +ttyACM[0-9] root:dialout 0660 @ln -sf $MDEV modem +ttyUSB[0-9] root:dialout 0660 @ln -sf $MDEV modem +ttyLTM[0-9] root:dialout 0660 @ln -sf $MDEV modem +ttySHSF[0-9] root:dialout 0660 @ln -sf $MDEV modem +slamr root:dialout 0660 @ln -sf $MDEV slamr0 +slusb root:dialout 0660 @ln -sf $MDEV slusb0 +fuse root:root 0666 + +# dri device +dri/.* root:video 0660 +card[0-9] root:video 0660 =dri/ + +# alsa sound devices and audio stuff +pcm.* root:audio 0660 =snd/ +control.* root:audio 0660 =snd/ +midi.* root:audio 0660 =snd/ +seq root:audio 0660 =snd/ +timer root:audio 0660 =snd/ + +adsp root:audio 0660 >sound/ +audio root:audio 0660 >sound/ +dsp root:audio 0660 >sound/ +mixer root:audio 0660 >sound/ +sequencer.* root:audio 0660 >sound/ + +SUBSYSTEM=sound;.* root:audio 0660 + +# PTP devices +ptp[0-9] root:root 0660 */lib/mdev/ptpdev + +# virtio-ports +SUBSYSTEM=virtio-ports;vport.* root:root 0600 @mkdir -p virtio-ports; ln -sf ../$MDEV virtio-ports/$(cat /sys/class/virtio-ports/$MDEV/name) + +# misc stuff +agpgart root:root 0660 >misc/ +psaux root:root 0660 >misc/ +rtc root:root 0664 >misc/ + +# input stuff +event[0-9]+ root:input 0640 =input/ +mice root:input 0640 =input/ +mouse[0-9] root:input 0640 =input/ +js[0-9] root:input 0640 =input/ +ts[0-9] root:input 0600 =input/ + +# v4l stuff +vbi[0-9] root:video 0660 >v4l/ +video[0-9]+ root:video 0660 >v4l/ + +# dvb stuff +dvb.* root:video 0660 */lib/mdev/dvbdev + +# load drivers for usb devices +usb[0-9]+ root:root 0660 */lib/mdev/usbdev + +# net devices +# 666 is fine: https://www.kernel.org/doc/Documentation/networking/tuntap.txt +net/tun[0-9]* root:netdev 0666 +net/tap[0-9]* root:netdev 0666 + +# zaptel devices +zap(.*) root:dialout 0660 =zap/%1 +dahdi!(.*) root:dialout 0660 =dahdi/%1 +dahdi/(.*) root:dialout 0660 =dahdi/%1 + +# raid controllers +cciss!(.*) root:disk 0660 =cciss/%1 +cciss/(.*) root:disk 0660 =cciss/%1 +ida!(.*) root:disk 0660 =ida/%1 +ida/(.*) root:disk 0660 =ida/%1 +rd!(.*) root:disk 0660 =rd/%1 +rd/(.*) root:disk 0660 =rd/%1 + +# tape devices +nst[0-9]+.* root:tape 0660 +st[0-9]+.* root:tape 0660 + +# fallback for any!device -> any/device +(.*)!(.*) root:root 0660 =%1/%2 diff --git a/persistent-storage b/persistent-storage @@ -0,0 +1,83 @@ +#!/bin/sh + +symlink_action() { + case "$ACTION" in + add) ln -sf "$1" "$2";; + remove) rm -f "$2";; + esac +} + +: ${SYSFS:=/sys} + +# cdrom symlink +case "$MDEV" in + sr*|xvd*) + caps="$(cat $SYSFS/block/$MDEV/capability 2>/dev/null)" + if [ $(( 0x${caps:-0} & 8 )) -gt 0 ]; then + symlink_action $MDEV cdrom + fi +esac + +# by-id symlinks +mkdir -p disk/by-id + +partition=$(cat $SYSFS/class/block/$MDEV/partition 2>/dev/null) +case "$partition" in + [0-9]*) partsuffix="-part$partition";; +esac + +wwid=$(cat $SYSFS/class/block/$MDEV/wwid 2>/dev/null) +: ${wwid:=$(cat $SYSFS/class/block/$MDEV/device/wwid 2>/dev/null)} + +if [ -n "$wwid" ]; then + case "$MDEV" in + nvme*) symlink_action ../../$MDEV disk/by-id/nvme-${wwid}${partsuffix};; + esac + case "$wwid" in + naa.*) symlink_action ../../$MDEV disk/by-id/wwn-0x${wwid#naa.};; + esac +fi + +serial=$(sed -E -e 's/^\s+//' -e 's/\s+$//' -e 's/ /_/g' \ + $SYSFS/class/block/$MDEV/device/serial 2>/dev/null) + +model=$(sed -E -e 's/^\s+//' -e 's/\s+$//' -e 's/ /_/g' \ + $SYSFS/class/block/$MDEV/device/model 2>/dev/null) + +if [ -n "$serial" ] && [ -n "$model" ]; then + case "$MDEV" in + nvme*) symlink_action ../../$MDEV disk/by-id/nvme-${model}_${serial}${partsuffix};; + esac +fi + +# virtio-blk +if [ -n "$serial" ]; then + case "$MDEV" in + vd*) symlink_action ../../$MDEV disk/by-id/virtio-${serial}${partsuffix};; + esac +fi + +# by-uuid, by-partuuid +eval $(blkid /dev/$MDEV | cut -d: -f2-) +if [ -n "$UUID" ]; then + mkdir -p disk/by-uuid + symlink_action ../../$MDEV disk/by-uuid/$UUID +fi +if [ -n "$PARTUUID" ]; then + mkdir -p disk/by-partuuid + symlink_action ../../$MDEV disk/by-partuuid/$PARTUUID +fi + +# backwards compatibility with /dev/usbdisk for /dev/sd* +if [ "${MDEV#sd}" != "$MDEV" ]; then + sysdev=$(readlink $SYSFS/class/block/$MDEV) + case "$sysdev" in + *usb[0-9]*) + # require vfat for devices without partition + if ! [ -e $SYSFS/block/$MDEV ] || [ TYPE="vfat" ]; then + symlink_action $MDEV usbdisk + fi + ;; + esac +fi + diff --git a/ptpdev b/ptpdev @@ -0,0 +1,15 @@ +#!/bin/sh + +symlink_action() { + case "$ACTION" in + add) ln -sf "$1" "$2";; + remove) rm -f "$2";; + esac +} + +clock_name=$(cat ${SYSFS:-/sys}/class/ptp/$MDEV/clock_name 2>/dev/null | sed -e 's/ /_/g') +case "$clock_name" in + KVM_virtual_PTP) symlink_action $MDEV ptp_kvm ;; + ptp_vmw) symlink_action $MDEV ptp_vmw ;; + hyperv) symlink_action $MDEV ptp_hyperv ;; +esac diff --git a/tests/persistent-storage_test b/tests/persistent-storage_test @@ -0,0 +1,160 @@ +#!/usr/bin/env atf-sh + +. $(atf_get_srcdir)/test_env.sh +init_tests \ + persistent_storage_cdrom \ + persistent_storage_nvme_wwid \ + persistent_storage_sda_wwid \ + persistent_storage_nvme_model_serial \ + persistent_storage_virtio_serial \ + persistent_storage_by_uuid \ + persistent_storage_by_partuuid \ + persistent_storage_usbdisk_symlink \ + persistent_storage_usbdisk_partition_symlink + +mdevscript=$(atf_get_srcdir)/../persistent-storage +export SYSFS=sys + +persistent_storage_cdrom_body() { + for dev in sr0 xvdc; do + mkdir -p sys/block/$dev + echo 109 > sys/block/$dev/capability + + MDEV=$dev ACTION=add atf_check \ + sh $mdevscript + atf_check -o match:"$dev" \ + readlink cdrom + + MDEV=$dev ACTION=remove atf_check \ + sh $mdevscript + atf_check -s not-exit:0 -o not-match:"$dev" \ + readlink cdrom + done +} + +persistent_storage_nvme_wwid_body() { + mkdir -p sys/class/block/nvme0n1 + echo eui.0025386b61b01dcd > sys/class/block/nvme0n1/wwid + + MDEV=nvme0n1 ACTION=add atf_check \ + sh $mdevscript + atf_check -o match:"nvme0n1" \ + readlink disk/by-id/nvme-eui.0025386b61b01dcd + + MDEV=nvme0n1 ACTION=remove atf_check \ + sh $mdevscript + atf_check -s not-exit:0 \ + readlink disk/by-id/nvme-eui.0025386b61b01dcd +} + +persistent_storage_sda_wwid_body() { + mkdir -p sys/class/block/sda/device + echo naa.5002538f4158fd7b > sys/class/block/sda/device/wwid + + MDEV=sda ACTION=add atf_check \ + sh $mdevscript + atf_check -o match:"sda" \ + readlink disk/by-id/wwn-0x5002538f4158fd7b + + MDEV=sda ACTION=remove atf_check \ + sh $mdevscript + atf_check -s not-exit:0 \ + readlink disk/by-id/wwn-0x5002538f4158fd7b +} + +persistent_storage_nvme_model_serial_body() { + mkdir -p sys/class/block/nvme0n1/device + echo 'Samsung SSD 960 EVO 500GB ' > sys/class/block/nvme0n1/device/model + echo 'S3EUNX0HB01245Y ' > sys/class/block/nvme0n1/device/serial + + MDEV=nvme0n1 ACTION=add atf_check \ + sh $mdevscript + atf_check -o match:"nvme0n1" \ + readlink disk/by-id/nvme-Samsung_SSD_960_EVO_500GB_S3EUNX0HB01245Y +} + +persistent_storage_virtio_serial_body() { + mkdir -p sys/class/block/vda/device + echo 'foobar' > sys/class/block/vda/device/serial + + MDEV=vda ACTION=add atf_check \ + sh $mdevscript + atf_check -o match:"vda" \ + readlink disk/by-id/virtio-foobar +} + +persistent_storage_by_uuid_body() { + local fs_uuid="2022-05-15-22-31-31-00" + + cat <<-EOF > blkid + #!/bin/sh + # blkid mock + case \$1 in + /dev/sr0) + echo "/dev/sr0: BLOCK_SIZE=\"2048\" UUID=\"$fs_uuid\" LABEL=\"cidata\" TYPE=\"iso9660\"" + ;; + esac + EOF + chmod +x blkid + export PATH="$PWD:$PATH" + + MDEV=sr0 ACTION=add atf_check \ + sh $mdevscript + atf_check -o match:"sr0" \ + readlink disk/by-uuid/"$fs_uuid" +} + +persistent_storage_by_partuuid_body() { + local partuuid="f6daa453-3150-46a2-b6f9-863e38fcd2aa" + mkdir bin + + cat <<-EOF > bin/blkid + #!/bin/sh + # blkid mock + case \$1 in + /dev/vda1) + echo '/dev/vda1: LABEL="testlabel" UUID="9850e420-fecd-4d61-bf8e-50c8babebbb2" BLOCK_SIZE="512" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="$partuuid"' + ;; + esac + EOF + chmod +x bin/blkid + export PATH="$PWD/bin:$PATH" + + MDEV=vda1 ACTION=add atf_check \ + sh $mdevscript + atf_check -o match:"vda1" \ + readlink disk/by-partuuid/"$partuuid" +} + +persistent_storage_usbdisk_symlink_body() { + mkdir -p sys/class/block sys/block bin + ln -s ../../devices/pci0000:00/0000:00:14.0/usb2/2-10/2-10:1.0/host4/target4:0:0/4:0:0:0 sys/class/block/sdc + ln -s ../devices/pci0000:00/0000:00:14.0/usb2/2-10/2-10:1.0/host4/target4:0:0/4:0:0:0 sys/block/sdc + + cat <<-EOF > bin/blkid + #!/bin/sh + # blkid mock + case \$1 in + /dev/sdc) + echo '/dev/sdc: UUID="436D-F3F4" BLOCK_SIZE="512" TYPE="vfat"' + ;; + esac + EOF + chmod +x bin/blkid + export PATH="$PWD/bin:$PATH" + + MDEV=sdc ACTION=add atf_check \ + sh $mdevscript + atf_check -o match:"sdc" \ + readlink usbdisk +} + +persistent_storage_usbdisk_partition_symlink_body() { + mkdir -p sys/class/block + ln -s ../../devices/pci0000:00/0000:00:14.0/usb2/2-10/2-10:1.0/host4/target4:0:0/4:0:0:0 sys/class/block/sdc1 + + MDEV=sdc1 ACTION=add atf_check \ + sh $mdevscript + atf_check -o match:"sdc1" \ + readlink usbdisk +} diff --git a/tests/ptpdev_test b/tests/ptpdev_test @@ -0,0 +1,58 @@ +#!/usr/bin/env atf-sh + +. $(atf_get_srcdir)/test_env.sh +init_tests \ + ptpdev_kvm \ + ptpdev_vmw \ + ptpdev_hyperv + +mdevscript=$(atf_get_srcdir)/../ptpdev +export SYSFS=sys + +ptpdev_kvm_body() { + mkdir -p sys/class/ptp/ptp0 + echo "KVM virtual PTP" > sys/class/ptp/ptp0/clock_name + + MDEV=ptp0 ACTION=add atf_check \ + sh $mdevscript + atf_check -o match:"ptp0" \ + readlink ptp_kvm + + MDEV=ptp0 ACTION=remove atf_check \ + sh $mdevscript + atf_check -s not-exit:0 \ + readlink ptp_kvm +} + +ptpdev_vmw_body() { + mkdir -p sys/class/ptp/ptp1 + echo "ptp vmw" > sys/class/ptp/ptp1/clock_name + + MDEV=ptp1 ACTION=add atf_check \ + sh $mdevscript + + atf_check -o match:"ptp1" \ + readlink ptp_vmw + + MDEV=ptp1 ACTION=remove atf_check \ + sh $mdevscript + atf_check -s not-exit:0 \ + readlink ptp_vmw +} + +ptpdev_hyperv_body() { + mkdir -p sys/class/ptp/ptp2 + echo hyperv > sys/class/ptp/ptp2/clock_name + + MDEV=ptp2 ACTION=add atf_check \ + sh $mdevscript + + atf_check -o match:"ptp2" \ + readlink ptp_hyperv + + MDEV=ptp2 ACTION=remove atf_check \ + sh $mdevscript + atf_check -s not-exit:0 \ + readlink ptp_hyperv +} + diff --git a/tests/test_env.sh b/tests/test_env.sh @@ -0,0 +1,15 @@ + +init_tests() { + TESTS="$@" + export TESTS + for t; do + atf_test_case $t + done +} + +atf_init_test_cases() { + for t in $TESTS; do + atf_add_test_case $t + done +} + diff --git a/usbdev b/usbdev @@ -0,0 +1,25 @@ +#!/bin/sh + +# mdev -s will not set SUBSYSTEM or DEVNAME so we trigger a hotplug event +if [ "$SUBSYSTEM" != "usb" ] || [ "$DEVTYPE" != "usb_device" ]; then + uev=/sys/bus/usb/devices/$MDEV/uevent + [ -e "$uev" ] && echo "add" > "$uev" + exit +fi + +[ -n "$DEVNAME" ] || exit + +case "$ACTION" in +add) + mkdir -p "${DEVNAME%/*}" + mv $MDEV $DEVNAME + # autoload driver + for i in /sys/$DEVPATH/*/modalias; do + [ -e "$i" ] && echo $i + done | xargs sort -u | xargs modprobe -a 2>/dev/null + ;; +remove) + rm $DEVNAME + ;; +esac +