1*94c4a1e1SFrank Piva#!/bin/bash 2*94c4a1e1SFrank Piva 3*94c4a1e1SFrank Pivaget_user_id() 4*94c4a1e1SFrank Piva{ 5*94c4a1e1SFrank Piva local user=$1 6*94c4a1e1SFrank Piva local my_uid 7*94c4a1e1SFrank Piva local my_gid 8*94c4a1e1SFrank Piva 9*94c4a1e1SFrank Piva if ! my_uid=`id -u $user`; then 10*94c4a1e1SFrank Piva adduser --shell /bin/bash $user 11*94c4a1e1SFrank Piva passwd -d $user 12*94c4a1e1SFrank Piva fi 13*94c4a1e1SFrank Piva 14*94c4a1e1SFrank Piva my_gid=`id -g $user` 15*94c4a1e1SFrank Piva echo "$my_uid:$my_gid" 16*94c4a1e1SFrank Piva} 17*94c4a1e1SFrank Piva 18*94c4a1e1SFrank Pivaremove_container() 19*94c4a1e1SFrank Piva{ 20*94c4a1e1SFrank Piva local container=$1 21*94c4a1e1SFrank Piva 22*94c4a1e1SFrank Piva docker stop $container 23*94c4a1e1SFrank Piva docker rm $container 24*94c4a1e1SFrank Piva} 25*94c4a1e1SFrank Piva 26*94c4a1e1SFrank Pivaadd_container() 27*94c4a1e1SFrank Piva{ 28*94c4a1e1SFrank Piva local container=$1 29*94c4a1e1SFrank Piva docker run --name $container --hostname=server.example.com \ 30*94c4a1e1SFrank Piva --device=/dev/ublk-control \ 31*94c4a1e1SFrank Piva --device-cgroup-rule='a *:* rmw' \ 32*94c4a1e1SFrank Piva --tmpfs /tmp --tmpfs /run --volume /sys/fs/cgroup:/sys/fs/cgroup:ro \ 33*94c4a1e1SFrank Piva --detach -i fedora:38 34*94c4a1e1SFrank Piva docker exec -i $container dnf install -y git libtool automake autoconf g++ liburing-devel 35*94c4a1e1SFrank Piva docker exec -i $container git config --global http.version HTTP/1.1 36*94c4a1e1SFrank Piva} 37*94c4a1e1SFrank Piva 38*94c4a1e1SFrank Pivainstall_ublk() 39*94c4a1e1SFrank Piva{ 40*94c4a1e1SFrank Piva local container=$1 41*94c4a1e1SFrank Piva 42*94c4a1e1SFrank Piva docker exec -i $container git clone -b next https://github.com/ming1/ubdsrv.git 43*94c4a1e1SFrank Piva docker exec -i -w /ubdsrv $container autoreconf -i 44*94c4a1e1SFrank Piva docker exec -i -w /ubdsrv $container ./configure 45*94c4a1e1SFrank Piva docker exec -i -w /ubdsrv $container make -j4 install 46*94c4a1e1SFrank Piva} 47*94c4a1e1SFrank Piva 48*94c4a1e1SFrank Pivatest_ublk() 49*94c4a1e1SFrank Piva{ 50*94c4a1e1SFrank Piva local container=$1 51*94c4a1e1SFrank Piva local ugid=$2 52*94c4a1e1SFrank Piva local ublk_script=`mktemp` 53*94c4a1e1SFrank Piva 54*94c4a1e1SFrank Piva echo "#!/bin/bash" >> $ublk_script 55*94c4a1e1SFrank Piva echo "ublk add -t null -n 10 --unprivileged" >> $ublk_script 56*94c4a1e1SFrank Piva echo "ublk list" >> $ublk_script 57*94c4a1e1SFrank Piva echo "sleep 2" >> $ublk_script 58*94c4a1e1SFrank Piva echo "ls -l /dev/ublk[bc]10" >> $ublk_script 59*94c4a1e1SFrank Piva echo "dd if=/dev/zero of=/dev/ublkb10 bs=1M count=64" >> $ublk_script 60*94c4a1e1SFrank Piva echo "ublk del -n 10" >> $ublk_script 61*94c4a1e1SFrank Piva echo "sleep 2" >> $ublk_script 62*94c4a1e1SFrank Piva echo "ls -l /dev/ublk[bc]10" >> $ublk_script 63*94c4a1e1SFrank Piva 64*94c4a1e1SFrank Piva chmod +x $ublk_script 65*94c4a1e1SFrank Piva chown $ugid $ublk_script 66*94c4a1e1SFrank Piva 67*94c4a1e1SFrank Piva docker cp -a $ublk_script $container:/test.sh 68*94c4a1e1SFrank Piva docker exec -u $ugid -i $container bash -c "cat /test.sh" 69*94c4a1e1SFrank Piva docker exec -u $ugid -i $container bash -c ". /test.sh" 70*94c4a1e1SFrank Piva rm -f $ublk_script 71*94c4a1e1SFrank Piva} 72*94c4a1e1SFrank Piva 73*94c4a1e1SFrank Pivaublk_clean() 74*94c4a1e1SFrank Piva{ 75*94c4a1e1SFrank Piva local container=$1 76*94c4a1e1SFrank Piva local this_log=$2 77*94c4a1e1SFrank Piva 78*94c4a1e1SFrank Piva cat $this_log 79*94c4a1e1SFrank Piva remove_container $container > /dev/null 2>&1 80*94c4a1e1SFrank Piva rm "$this_log" 81*94c4a1e1SFrank Piva exit -1 82*94c4a1e1SFrank Piva} 83*94c4a1e1SFrank Piva 84*94c4a1e1SFrank PivaC="ublk_docker" 85*94c4a1e1SFrank PivaUG="" 86*94c4a1e1SFrank PivaULOG=`mktemp` 87*94c4a1e1SFrank Piva 88*94c4a1e1SFrank Pivaif ! UG=`get_user_id ublk_docker`; then 89*94c4a1e1SFrank Piva echo "no ublk_docker user for running test" 90*94c4a1e1SFrank Piva exit -1 91*94c4a1e1SFrank Pivafi 92*94c4a1e1SFrank Piva 93*94c4a1e1SFrank Pivaecho "setup container" 94*94c4a1e1SFrank Pivaif ! add_container $C >> "$ULOG"; then 95*94c4a1e1SFrank Piva echo "add container failed" 96*94c4a1e1SFrank Piva ublk_clean $C "$ULOG" 97*94c4a1e1SFrank Pivafi 98*94c4a1e1SFrank Piva 99*94c4a1e1SFrank Pivaecho "install ublk from github" 100*94c4a1e1SFrank Pivaif ! install_ublk $C >> "$ULOG" 2>&1; then 101*94c4a1e1SFrank Piva echo "install ublk failed" 102*94c4a1e1SFrank Piva ublk_clean $C "$ULOG" 103*94c4a1e1SFrank Pivafi 104*94c4a1e1SFrank Piva 105*94c4a1e1SFrank Pivaecho "add/del ublk inside container by user ublk_docker($UG)" 106*94c4a1e1SFrank Pivaif ! test_ublk $C $UG; then 107*94c4a1e1SFrank Piva echo "test ublk in container failed" 108*94c4a1e1SFrank Piva ublk_clean $C "$ULOG" 109*94c4a1e1SFrank Pivafi 110*94c4a1e1SFrank Piva 111*94c4a1e1SFrank Pivaecho "remove container" 112*94c4a1e1SFrank Pivaremove_container $C >> "$ULOG" 113*94c4a1e1SFrank Pivarm "$ULOG" 114