diff --git a/roles/deploy-xorg/files/scripts/nvidia-xconf-gen.py b/roles/deploy-xorg/files/scripts/nvidia-xconf-gen.py new file mode 100755 index 0000000000000000000000000000000000000000..f26446971f04c022e19897edf5d9d05cefe61da7 --- /dev/null +++ b/roles/deploy-xorg/files/scripts/nvidia-xconf-gen.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +from jinja2 import Template +import itertools +import subprocess +import datetime +import os +import sys +import time +import socket +from subprocess import call +import re +import json + +def grab_card_ids(): + # This method runs nvidia-smi to grab the card ids, then returns a list + + if not os.path.isfile("/bin/nvidia-smi"): + print("nvidia-smi binary not found!") + exit(1) + + cmd = ["/bin/nvidia-smi", "--query-gpu=pci.bus_id","--format=csv,noheader"] + p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + cards = [] + + for line in p.stdout.readlines(): + line = line.rstrip().split(":")[2] + pcibus_num = int(re.sub('[.:]', '', line).rstrip("0"),16) + card = "PCI:0:{}:0".format(str(pcibus_num)) + cards.append(card) + return cards + +def grab_card_boardname(): + if not os.path.isfile("/bin/nvidia-smi"): + print("nvidia-smi binary not found!") + exit(1) + + cmd = ["/bin/nvidia-smi", "--query-gpu=name","--format=csv,noheader"] + cards = [] + p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + for line in p.stdout.readlines(): + line = line.rstrip() + cards.append(line) + return cards + +def write_xorg_conf(cards): + num_of_cards = len(cards) + 1 + boardname = (grab_card_boardname())[0] + gpus = [] + + for i in range(1, num_of_cards): + monitors = [] + screens = [] + res = list(itertools.combinations(cards,i)) + + for j in range(i): + monitors.append("Monitor"+str(j)) + screens.append("Screen"+str(j)) + + for card in res: + filename = "/etc/X11/xorg.conf." + str(i) + str(res.index(card)) + #gpus[filename] = filename + + gpus.append({'filename':filename,'boardname':boardname,'monitors':monitors,'screens':screens,'devices':card}) + + + print(json.dumps(gpus)) + +if __name__ == "__main__": + +# cards = grab_card_ids() +# write_xorg_conf(cards) + cards = grab_card_ids() + write_xorg_conf(cards) + + +''' with open("xorgconftest.j2") as f: + template = Template(f.read()) + +num_of_monitors = 2 + +monitors = [] +screens = [] +busid = ["PCI:0:6:0","PCI:0:7:0","PCI:0:8:0","PCI:0:9:0"] + +for i in range(num_of_monitors): + monitors.append("Monitor" + str(i)) + screens.append("Screen" + str(i)) + +#output = template.render(monitors=monitors,devices=busid) +#print(output) + +res = itertools.combinations(busid,2) +listres = list(res) + +for i in listres: + output = template.render(monitors=monitors,devices=i,screens=screens) + filename = "xorg.conf." + str(listres.index(i)) + print(filename) + f = open(filename,"w") + f.write(output) + f.close() ''' diff --git a/roles/deploy-xorg/tasks/main.yml b/roles/deploy-xorg/tasks/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..32afb6d4c07a79ebc436c4559fa1d3fcf87cf581 --- /dev/null +++ b/roles/deploy-xorg/tasks/main.yml @@ -0,0 +1,16 @@ +--- +- name: run nvidia-xconf-gen + script: scripts/nvidia-xconf-gen.py + register: nvidiacards + check_mode: no + +- name: set env for nvidia_card_lists + set_fact: + nvidiacardslist: "{{ nvidiacards.stdout | from_json }}" + +- name: generate nvidia-xorg-conf + sudo: true + template: + src: xorg.conf.j2 + dest: "{{ item['filename'] }}" + with_items: "{{ nvidiacardslist }}" diff --git a/roles/deploy-xorg/templates/blacklist-nouveau.conf.j2 b/roles/deploy-xorg/templates/blacklist-nouveau.conf.j2 new file mode 100644 index 0000000000000000000000000000000000000000..96993361f370408d6cb1e6fe227b69e63e0f4cab --- /dev/null +++ b/roles/deploy-xorg/templates/blacklist-nouveau.conf.j2 @@ -0,0 +1,3 @@ +blacklist nouveau +options nouveau modeset=0 + diff --git a/roles/deploy-xorg/templates/grub.conf.j2 b/roles/deploy-xorg/templates/grub.conf.j2 new file mode 100644 index 0000000000000000000000000000000000000000..26b822130ddcf46ec8b43965e41ea02ab3352d2d --- /dev/null +++ b/roles/deploy-xorg/templates/grub.conf.j2 @@ -0,0 +1,17 @@ +# grub.conf generated by anaconda +# +# Note that you do not have to rerun grub after making changes to this file +# NOTICE: You do not have a /boot partition. This means that +# all kernel and initrd paths are relative to /, eg. +# root (hd0,0) +# kernel /boot/vmlinuz-version ro root=/dev/vda1 +# initrd /boot/initrd-[generic-]version.img +#boot=/dev/vda +default=0 +timeout=5 +splashimage=(hd0,0)/boot/grub/splash.xpm.gz +hiddenmenu +title CentOS (2.6.32-504.el6.x86_64) + root (hd0,0) + kernel /boot/vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/vda1 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto elevator=noop biosdevname=0 console=ttyS0 rdblacklist=nouveau nouveau.modeset=0 rd_NO_LVM rd_NO_DM rhgb quiet + initrd /boot/initramfs-2.6.32-504.el6.x86_64.img diff --git a/roles/deploy-xorg/templates/nvidia-persistenced.service b/roles/deploy-xorg/templates/nvidia-persistenced.service new file mode 100644 index 0000000000000000000000000000000000000000..b4918a3debcbe7052a8b35e81a70531f3edfcfff --- /dev/null +++ b/roles/deploy-xorg/templates/nvidia-persistenced.service @@ -0,0 +1,36 @@ +# +# Copyright (c) 2013 NVIDIA Corporation +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# +# This is a sample systemd service file, designed to show how the NVIDIA +# Persistence Daemon can be started. +# + +[Unit] +Description=NVIDIA Persistence Daemon +Wants=syslog.target + +[Service] +Type=forking +ExecStart=/usr/bin/nvidia-persistenced --persistence-mode --user nvidia-persistenced +ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced + +[Install] +WantedBy=multi-user.target diff --git a/roles/deploy-xorg/templates/nvidia.conf.j2 b/roles/deploy-xorg/templates/nvidia.conf.j2 new file mode 100644 index 0000000000000000000000000000000000000000..d5c81c1f576c20be851dc2061c395f11238aad27 --- /dev/null +++ b/roles/deploy-xorg/templates/nvidia.conf.j2 @@ -0,0 +1,2 @@ +options nvidia NVreg_DeviceFileMode=0666 + diff --git a/roles/deploy-xorg/templates/xorg.conf.j2 b/roles/deploy-xorg/templates/xorg.conf.j2 new file mode 100644 index 0000000000000000000000000000000000000000..2fc5f043c03e710be306d3b740cb6f5963216860 --- /dev/null +++ b/roles/deploy-xorg/templates/xorg.conf.j2 @@ -0,0 +1,78 @@ +# nvidia-xconfig: X configuration file generated by nvidia-xconfig +# nvidia-xconfig: version 375.66 (buildmeister@swio-display-x86-rhel47-06) Mon May 1 15:45:32 PDT 2017 +Section "DRI" + Mode 0666 +EndSection + +Section "ServerLayout" + + #InputDevice "Keyboard0" "CoreKeyboard" + #InputDevice "Mouse0" "CorePointer" + Identifier "Layout0" + {% for screen in item.screens %} + {% if item.screens.index(screen) == 0 %} + Screen 0 "Screen{{item.screens.index(screen)}}" + {% else %} + Screen {{item.screens.index(screen)}} "Screen{{item.screens.index(screen)}}" RightOf "Screen{{item.screens.index(screen)-1}}" + {% endif %} + {% endfor %} + #InputDevice "Keyboard0" "CoreKeyboard" + #InputDevice "Mouse0" "CorePointer" +EndSection + +Section "Files" + FontPath "/usr/share/fonts/default/Type1" +EndSection + +Section "InputDevice" + + # generated from default + Identifier "Mouse0" + Driver "mouse" + Option "Protocol" "auto" + Option "Device" "/dev/input/mice" + Option "Emulate3Buttons" "no" + Option "ZAxisMapping" "4 5" +EndSection + +Section "InputDevice" + + # generated from default + Identifier "Keyboard0" + Driver "kbd" +EndSection +{% for monitor in item.monitors %} +Section "Monitor" + Identifier "{{monitor}}" + VendorName "Unknown" + ModelName "Unknown" + HorizSync 28.0 - 33.0 + VertRefresh 43.0 - 72.0 + Option "DPMS" +EndSection +{% endfor %} +{% for device in item.devices %} +Section "Device" + Identifier "Device{{item.devices.index(device)}}" + Driver "nvidia" + VendorName "NVIDIA Corporation" + boardname "{{item.boardname}}" + BusID "{{device}}" +EndSection +{% endfor %} +{% for screen in item.screens %} +Section "Screen" + Identifier "Screen{{item.screens.index(screen)}}" + Device "Device{{item.screens.index(screen)}}" + Monitor "Monitor{{item.screens.index(screen)}}" + DefaultDepth 24 + Option "UseDisplayDevice" "None" + Option "ProbeAllGpus" "false" + SubSection "Display" + Virtual 1920 1200 + Depth 24 + EndSubSection +EndSection +{% endfor -%} + + diff --git a/roles/deploy-xorg/templates/xserver.j2 b/roles/deploy-xorg/templates/xserver.j2 new file mode 100644 index 0000000000000000000000000000000000000000..737d03ba940650104a96e56b861bdaf255c517f4 --- /dev/null +++ b/roles/deploy-xorg/templates/xserver.j2 @@ -0,0 +1,5 @@ +#%PAM-1.0 +auth sufficient pam_rootok.so +auth sufficient pam_permit.so +account required pam_permit.so +session optional pam_keyinit.so force revoke