jo-master
Anmeldungsdatum: 17. Juli 2010
Beiträge: 95
|
ich dachte, ich finde etwas zeit und poste gleich die fertigen skripte. bin aber noch nicht fertig. deshalb erstmal die fehler:
on_pamexec_setgroup.sh: es wird nicht geprüft, ob die seat-gruppe existiert unmounter-helper.sh: dieses skript läuft mit user-rechten und kann nicht auf die log-datei zugreifen / der übergebene mount-punkt kann sowohl /dev/* als auch /media/* sein
hier ein paar verbesserungsvorschläge, deren implementation ich hier in den nächsten paar tagen poste (ist schon fast fertig):
on_seat_usbhub.sh: zum mounten das device-label und nicht device-name verwenden / mount mit sync-option mount soll auch für mehrere seats gleichzeitig möglich sein logrotate für /var/log/multiseat.log
@fpaetzke: danke schonmal für deinen lösungsweg. da wäre ich nicht so schnell drauf gekommen.
|
fpaetzke
Anmeldungsdatum: 28. Februar 2012
Beiträge: Zähle...
|
ich würde vorschlagen, eine kürzere kdm konfiguration zu notieren. die 500+ zeilen sind doch etwas unübersichtlich. die wesentlichen parameter hab ich hier notiert: http://fpaetzke.de/ZweiUserEinPc.html @jo-master:
ich freu mich auf deine änderungen. ich hab meine konfiguration auch automatisiert und arbeite grad an plug & play.
ich werd das nachher mal bei github posten. edit:
https://github.com/fpaetzke/multiseat
|
jo-master
Anmeldungsdatum: 17. Juli 2010
Beiträge: 95
|
sorry, dass meine konfigs noch fehlen. ich war die letzten tage damit beschäfftig mein system zu retten.
aber ein echtes ubuntu lässt sich auch vom blitzschlag nicht kleinkriegen. konfig folgt bald.
|
jo-master
Anmeldungsdatum: 17. Juli 2010
Beiträge: 95
|
den zugriff mehrerer seats auf den gleichen speicher musste ich nun verwerfen. (obwohl schon alles fertig ist ☹) ich habe nicht beachtet, dass die gruppeninformationen erst nach einem re-login zur verfügung stehen. mein system sieht wie folgt aus: systemlink: /etc/multiseat/unmounter.sh → /sbin/umount.multiseat-unmounter für jeden seat einen mount- und umount-eintrag in /etc/polkit-1/localauthority/51-multiseat.d/ /etc/multiseat/unmounter.sh: (korrigiert: 07.05)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 | #! /bin/bash
if [ $# != 1 ]; then
echo "Not Authorized!"
exit
fi
if [ ${#DISPLAY} \< 2 ]; then
echo "Not Authorized!"
exit
fi
dev=$1 # /dev/sdX or /media/label
if [ ${dev:0:5} = "/dev/" ]; then
mnt=$(mount | grep "$dev" | sed -e "s/.* on //" | sed -e "s/ type .*//")
else
mnt=$(echo "$dev" | sed -e "s/\/$//")
dev=$(mount | grep "$mnt" | sed -e "s/ on .*//")
fi
terminal_nr=${DISPLAY:1:1} # 0, 1, 2, 3 ...
group=$(stat -c %G $mnt) #seatX?
if [ ${group:0:7} != "ms-seat" ]; then
echo "Not Authorized! It's your Device?"
exit
fi
if [ ${group:7} != $(expr $terminal_nr + 1) ]; then
echo "Not Authorized! It's your Device?"
exit
fi
udisks --unmount $dev
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | # select device: only storage devices and sd-cards
KERNEL!="sd*[0-9]|mmcblk[0-9]p[0-9]", GOTO="multiseat_automounter_end"
# check if filesystem exists
ENV{ID_FS_TYPE}=="", GOTO="multiseat_automounter_end"
# ckeck partition label
# Get a label if present, otherwise specify one
ENV{ID_FS_LABEL_ENC}!="", ENV{MountLabel}="$env{ID_FS_LABEL_ENC}"
ENV{ID_FS_LABEL_ENC}=="", ENV{MountLabel}="%k"
# run multiseat-automounter and disable all udisk-based desktop automounters
ACTION=="add|change|remove", \
ENV{UDISKS_PRESENTATION_NOPOLICY}="1", \
RUN+="/etc/multiseat/automounter.sh %k $env{MountLabel} $env{ACTION} $env{DEVPATH} $env{ID_FS_TYPE} $env{ID_FS_UUID}"
# end label
LABEL="multiseat_automounter_end"
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104 | #! /bin/bash
logfile=/var/log/multiseat.log
mountrules=/etc/multiseat/mount-rules
t=" "
device=$1 # kernel device: sdb1, sdc3, etc
label=$2 # partition label
action=$3 # add, remove
devpath=$4 # /devices/...
fstype=$5 # vfat, ntfs, etc
uuid=$6 # UUID of device
#devgroup="ms-mount-$device"
# ignore devices in fstab
if [ -n "$(grep ^/dev/$device\ /etc/fstab)" ]; then
exit
elif [ -n "$(grep ^UUID=$uuid\ /etc/fstab)" ]; then
exit
elif [ -n "$(grep ^LABEL=$label\ /etc/fstab)" ]; then
exit
fi
# write log
echo "$(date) automounter.sh" >> $logfile
echo "$t Device: $device ($label)" >> $logfile
echo "$t Action: $action" >> $logfile
echo "$t FS Type: $fstype" >> $logfile
echo "$t Path: $devpath" >> $logfile
echo "$t UUID: $uuid" >> $logfile
if [ $action = "add" -o $action = "change" ]; then
# ignore already mounted devices
if [ -n "$(mount | grep ^/dev/$device\ )" ]; then
exit
fi
# # prepare device group
# groupdel "$devgroup"
# groupadd -f "$devgroup"
# gid=$(grep ^"$devgroup" /etc/group | cut -d: -f3)
# set permission group
gid=0
for SEAT in $(cd "$mountrules"; ls)
do
group="ms-$SEAT"
# check matches by path
if [ -r "$mountrules/$SEAT/by-path" ]; then
LINES=$(cat "$mountrules/$SEAT/by-path")
for MATCHSTR in $LINES
do
if [[ "$devpath" == $MATCHSTR ]]; then
# seatmem=$(grep ^$group /etc/group | \
# cut -d: -f4 | tr "," " ")
# for newmem in $seatmem
# do
# usermod -a -G "$devgroup" "$newmem"
# done
# break
gid=$(grep ^"$group" /etc/group | cut -d: -f3)
break 2
fi
done
fi
done
# set mount options
# global
mount_options="relatime,sync,uhelper=multiseat-unmounter"
# filesystem depended
if [ "$fstype" = vfat -o "$fstype" = "ntfs" ]; then
mount_options="$mount_options,uid=0,gid=$gid,umask=007"
fi
# mount
mkdir /media/$label
chown 0:$gid /media/$label
chmod 770 /media/$label
mount /dev/$device /media/$label -o "$mount_options"
elif [ $action = "remove" ]; then
# umount
umount /media/$label
rmdir /media/$label
# groupdel "$devgroup"
fi
|
/devices/pci0000:00/0000:00:16.2/usb3/3-3/3-3.4/3-3.4:1.0/*
/devices/pci0000:00/0000:00:16.2/usb3/3-3/3-3.4/3-3.4:1.0/host14/target14:0:0/14:0:0:0/block/sdc/sdc1 ...
session optional pam_exec.so /etc/multiseat/pamexec.sh | #! /bin/bash
# parse args and run scripts
run-parts /etc/multiseat/pamexec-scripts
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 | #! /bin/bash
logfile=/var/log/multiseat.log
t=" "
group="ms-seat$(expr ${PAM_TTY:1:1} + 1)"
# write log
echo "$(date) pamexec-scripts: 01_seat_group" >> $logfile
echo "$t Terminal: $PAM_TTY" >> $logfile
echo "$t User: $PAM_USER" >> $logfile
echo "$t Action: $PAM_TYPE" >> $logfile
echo "$t Group: $group" >> $logfile
if [ $PAM_TYPE = "open_session" ]; then
# remove all user from group
groupdel "$group"
#add $PAM_USER to seat group
groupadd -f "$group"
usermod -a -G "$group" "$PAM_USER"
elif [ $PAM_TYPE = "close_session" ]; then
# remove all users from seat group
groupdel "$group"
fi
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 | #! /bin/bash
logfile=/var/log/multiseat.log
t=" "
# write log
echo "$(date) pamexec-scripts: 02_pulse-access_group" >> $logfile
echo "$t User: $PAM_USER" >> $logfile
echo "$t Action: $PAM_TYPE" >> $logfile
if [ $PAM_TYPE = "open_session" ]; then
#add $PAM_USER to pulse-access group
usermod -a -G pulse-access "$PAM_USER"
elif [ $PAM_TYPE = "close_session" ]; then
# remove $PAM_USER from pulse-access group
groups_left=$(id -nG $PAM_USER | \
sed -e "s/pulse-access//" -e "s/ / /g" -e "s/ /,/g")
usermod -G "$groups_left" "$PAM_USER"
fi
|
/var/log/multseat.log {
monthly
rotate 12
size 10MB
compress
delaycompress
missingok
notifempty
create 644 root root
} ich denke mit so einem generischen system kommt man dem ziel eines multiseat-pakets (zb.: seatadd, seatsel, usw) einen schritt näher. es fehlt aber noch einiges an entwicklung beim automounter, um möglichst viele speichergeräte zu erkennen. solche eine struktur, wie in mount-rules schlage ich auch für eingabegeräte vor. dadurch lässt sich das ganze deutlich besser konfigurieren ohne gleich ganze udev-regeln schreiben zu müssen. diese müssen nur einmal generisch formuliert werden.
|
jo-master
Anmeldungsdatum: 17. Juli 2010
Beiträge: 95
|
ich habe noch einen bug gefunden, den ich nicht erklären kann:
die mittels pam eingetragene gruppe »ms-seatX« wird in der aktuellen session nicht erkannt (test mit kommando: »id«) wird der pc runtergefahren wird vom gdm kein »close_session« ereignis mehr ausgelöst und der benutzer bleibt in der gruppe erhalten. (deshalb habe ich das problem bisher auch nicht bemerkt.)
hat jemand eine idee?
|
fpaetzke
Anmeldungsdatum: 28. Februar 2012
Beiträge: 16
|
jo-master schrieb:
über pam_group oder pam_exec gesetzt?
is das der standard gdm oder der ms-branch?
ansonsten solltest du auch beim login die ms-gruppen leeren. allein schon wenn sich jemand nicht ausloggt und der rechner rebootet wird ist die gruppe dann nicht leer.
|
jo-master
Anmeldungsdatum: 17. Juli 2010
Beiträge: 95
|
da über gruppen-rechte kein gemeinsamer zugriff auf usb-speicher realisierbar ist, kann man als lösung für solche probleme auch den user der entsprechenden seat-gruppe als eigentümer des mount-punktes setzten. dann ist es nicht wichtig, ob in der aktuellen gnome-, kde-, usw.-session die gruppeninformation übernommen wurde. durchschaut habe ich das problem jedoch noch nicht.
|
jo-master
Anmeldungsdatum: 17. Juli 2010
Beiträge: 95
|
z.b. automounter.sh:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108 | #! /bin/bash
logfile=/var/log/multiseat.log
mountrules=/etc/multiseat/mount-rules
t=" "
device=$1 # kernel device: sdb1, sdc3, etc
label=$2 # partition label
action=$3 # add, remove
devpath=$4 # /devices/...
fstype=$5 # vfat, ntfs, etc
uuid=$6 # UUID of device
#devgroup="ms-mount-$device"
# ignore devices in fstab
if [ -n "$(grep ^/dev/$device\ /etc/fstab)" ]; then
exit
elif [ -n "$(grep ^UUID=$uuid\ /etc/fstab)" ]; then
exit
elif [ -n "$(grep ^LABEL=$label\ /etc/fstab)" ]; then
exit
fi
# write log
echo "$(date) automounter.sh" >> $logfile
echo "$t Device: $device ($label)" >> $logfile
echo "$t Action: $action" >> $logfile
echo "$t FS Type: $fstype" >> $logfile
echo "$t Path: $devpath" >> $logfile
echo "$t UUID: $uuid" >> $logfile
if [ $action = "add" -o $action = "change" ]; then
# ignore already mounted devices
if [ -n "$(mount | grep ^/dev/$device\ )" ]; then
exit
fi
# # prepare device group
# groupdel "$devgroup"
# groupadd -f "$devgroup"
# gid=$(grep ^"$devgroup" /etc/group | cut -d: -f3)
# set permission group
gid=0
uid=0
for SEAT in $(cd "$mountrules"; ls)
do
group="ms-$SEAT"
# check matches by path
if [ -r "$mountrules/$SEAT/by-path" ]; then
LINES=$(cat "$mountrules/$SEAT/by-path")
for MATCHSTR in $LINES
do
if [[ "$devpath" == $MATCHSTR ]]; then
# seatmem=$(grep ^$group /etc/group | \
# cut -d: -f4 | tr "," " ")
# for newmem in $seatmem
# do
# usermod -a -G "$devgroup" "$newmem"
# done
# break
gid=$(grep ^"$group" /etc/group | cut -d: -f3)
username=$(grep ^"$group" /etc/group | \
cut -d: -f4 | cut -d, -f1)
uid=$(id -u $username)
break 2
fi
done
fi
done
# set mount options
# global
mount_options="relatime,sync,uhelper=multiseat-unmounter"
# filesystem depended
if [ "$fstype" = vfat -o "$fstype" = "ntfs" ]; then
mount_options="$mount_options,uid=$uid,gid=$gid,umask=007"
fi
# mount
mkdir /media/$label
chown $uid:$gid /media/$label
chmod 770 /media/$label
mount /dev/$device /media/$label -o "$mount_options"
elif [ $action = "remove" ]; then
# umount
umount /media/$label
rmdir /media/$label
# groupdel "$devgroup"
fi
|
|
jo-master
Anmeldungsdatum: 17. Juli 2010
Beiträge: 95
|
um die konfiguration einfacher zu gestallten habe ich udev und die input/mount-konfiguration getrennt. dazu habe ich ein weiteres script eingeführt: getseat.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 | #! /bin/bash
# declaration
pathprefix=/etc/multiseat/seat-rules
seat=0
# parse arguments
devicetype=$1 # mount, input
devpath=$2 # /devices/...
# set path
rulespath="$pathprefix/$devicetype"
# get default
if [ -r "$rulespath/default" ]; then
defaultval=$(cat "$rulespath/default" | sed -n 1p)
if [ ${defaultval:0:4} = "seat" ]; then
seat=${defaultval:4}
fi
fi
# check rules and use first matching one
for SEATDIR in $(cd "$rulespath"; ls | grep -i ^"seat")
do
# check matches by path
if [ -r "$rulespath/$SEATDIR/by-path" ]; then
LINES=$(cat "$rulespath/$SEATDIR/by-path")
for MATCHSTR in $LINES
do
if [[ "$devpath" == $MATCHSTR ]]; then
seat=${SEATDIR:4}
break 2
fi
done
fi
done
# return result
echo "$seat"
|
dazu gehörig folgende ordnerstruktur in /etc/multiseat/:
das mount und udev-input-skript wurden wie folgt angepasst: 99-multiseat-input.rules
| # select device: input
SUBSYSTEM!="input", GOTO="multiseat_input_end"
# assign to seat
PROGRAM="/etc/multiseat/getseat.sh input $env{DEVPATH}", ENV{ID_INPUT.tags}="ms-seat%c"
# end label
LABEL="multiseat_input_end"
|
automounter.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 | #! /bin/bash
logfile=/var/log/multiseat.log
getseat="/etc/multiseat/getseat.sh"
t=" "
device=$1 # kernel device: sdb1, sdc3, etc
label=$2 # partition label
action=$3 # add, remove
devpath=$4 # /devices/...
fstype=$5 # vfat, ntfs, etc
uuid=$6 # UUID of device
# ignore devices in fstab
if [ -n "$(grep ^/dev/$device\ /etc/fstab)" ]; then
exit
elif [ -n "$(grep ^UUID=$uuid\ /etc/fstab)" ]; then
exit
elif [ -n "$(grep ^LABEL=$label\ /etc/fstab)" ]; then
exit
fi
# write log
echo "$(date) automounter.sh" >> $logfile
echo "$t Device: $device ($label)" >> $logfile
echo "$t Action: $action" >> $logfile
echo "$t FS Type: $fstype" >> $logfile
echo "$t Path: $devpath" >> $logfile
echo "$t UUID: $uuid" >> $logfile
if [ $action = "add" -o $action = "change" ]; then
# ignore already mounted devices
if [ -n "$(mount | grep ^/dev/$device\ )" ]; then
exit
fi
# set owner and group of mount point
gid=0
uid=0
seat=$($getseat "mount" "$devpath")
group="ms-seat$seat"
if [ -n "$(grep ^"$group" /etc/group)" ]; then
gid=$(grep ^"$group" /etc/group | cut -d: -f3)
username=$(grep ^"$group" /etc/group | cut -d: -f4 | cut -d, -f1)
if [ -n "$username" ]; then
uid=$(id -u $username)
fi
fi
# set mount options
# global
mount_options="relatime,sync,uhelper=multiseat-unmounter"
# filesystem depended
if [ "$fstype" = vfat -o "$fstype" = "ntfs" ]; then
mount_options="$mount_options,uid=$uid,gid=$gid,umask=007"
fi
# mount
mkdir /media/$label
chown $uid:$gid /media/$label
chmod 770 /media/$label
mount /dev/$device /media/$label -o "$mount_options"
elif [ $action = "remove" ]; then
# umount
umount /media/$label
rmdir /media/$label
fi
|
die erweiterung, dass seats auch nach anderen kriterien als den gerätepfad zugeorndet werden, ist auch recht einfach zu implementieren.
|
jo-master
Anmeldungsdatum: 17. Juli 2010
Beiträge: 95
|
kann jemand folgenden bug bestätigen? das mounten von usb speichern mit spezifischen benutzerrechten via uid und gid führt zu extrem langsamen zugriffzeiten (weniger als 1/10 der normalen geschwindigkeit). folgendes system kam zum einsatz:
|
JackyOH
Anmeldungsdatum: 24. März 2007
Beiträge: Zähle...
|
Hi, hat jemand auch Probleme mit dem neuen nvidia 302/304 Treiber? Ich habe zwei Seats und bisher hat alles einwandfrei funktioniert. Beim neuen Treiber stürzt der erste X-Server ab, wenn der zweite aktiviert wird. Kann das noch jemand bestätigen? Im Arch-Forum habe ich übrigens ähnliches gefunden https://bbs.archlinux.org/viewtopic.php?pid=1137805, leider ohne Lösung. ☹
|
JackyOH
Anmeldungsdatum: 24. März 2007
Beiträge: 80
|
so gerade eben hab sah ich im arch forum die lösung. man muss nur eine zeile eintragen. anders als im forum beschrieben funktionierte das bei mir nur, wenn ich das bei beiden konfig-dateien eingetragen habe. | Section "Device"
...
Option "ProbeAllGpus" "false"
...
EndSection
|
|
jo-master
Anmeldungsdatum: 17. Juli 2010
Beiträge: 95
|
hab die fertifgstellung auf 01.01.2013 gesetzt. über weihnachten habe ich zeit den multiseat-kram am ubuntu 12.10 durchzugehen und ein paar skripte zu beenden.
|
march
(Themenstarter)
Anmeldungsdatum: 12. Juni 2005
Beiträge: 17329
|
Danke für das Feedback. ☺
|
MPW
Anmeldungsdatum: 4. Januar 2009
Beiträge: 3729
|
jo-master schrieb: hab die fertifgstellung auf 01.01.2013 gesetzt. über weihnachten habe ich zeit den multiseat-kram am ubuntu 12.10 durchzugehen und ein paar skripte zu beenden.
Hat sich von 12.04 auf 12.10 eigentlich was geändert bzgl. Multi Seat? Ich überlege meinen Desktop PC, der Multi Seat nutzt, upzudaten?
|