<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://daq00.triumf.ca/DaqWiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lmartin</id>
	<title>DaqWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://daq00.triumf.ca/DaqWiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lmartin"/>
	<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php/Special:Contributions/Lmartin"/>
	<updated>2026-05-10T23:40:06Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=7725</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=7725"/>
		<updated>2024-04-18T23:26:43Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: /* setup nfs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= About Ubuntu =&lt;br /&gt;
&lt;br /&gt;
AAA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
#echo server time1.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
#echo server time2.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
#echo server time3.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE1: if time1, time2, time3 are already listed in /etc/crony/chrony.conf, please remove them and restart chrony.&lt;br /&gt;
&lt;br /&gt;
NOTE2: if time1, time2, time3 are not listed in &amp;quot;chronyc tracking&amp;quot; or if they are not selected by &amp;quot;chronyc tracking&amp;quot;, check that /etc/crony/chrony.conf contains &amp;quot;sourcedir /etc/chrony/sources.d&amp;quot;. old versions of this file may not have it.&lt;br /&gt;
&lt;br /&gt;
NOTE3: read https://chrony-project.org/faq.html#_should_i_prefer_chrony_over_timesyncd_if_i_do_not_need_to_run_a_server&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools sysstat smartmontools lm-sensors traceroute time minicom screen git lsof debsums tmux iptables&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
yes | apt -y install flex bison&lt;br /&gt;
yes | apt -y install neofetch&lt;br /&gt;
yes | apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
yes | apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
yes | apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
yes | apt -y install mariadb-client ### mysql client&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install i2c-tools libi2c-dev libi2c0&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
yes | apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
yes | apt -y install apt install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libavahi-compat-libdnssd-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.2.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
* apt install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
* restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
* xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
(does not work anymore!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ftp.ca.debian.org/debian/pool/main/libp/libpng/libpng12-0_1.2.50-2+deb8u2_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.50-2+deb8u2_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install 32-bit libraries for PHYSICA ==&lt;br /&gt;
&lt;br /&gt;
these instructions are for running 32-bit physica executable built for SL6 on ubuntu LTS 20.04&lt;br /&gt;
&lt;br /&gt;
install physica sources (cannot build, do not have g77)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/packages&lt;br /&gt;
git clone https://bitbucket.org/ttriumfdaq/physica.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
install 32-bit libraries using ubuntu package manager:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install lib32z1 # libz.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy 32-bit SL6 shared libraries to /lib32&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libX11.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libgd.so.2 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libpng12.so.0 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libreadline.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libncurses.so.5 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libg2c.so.0 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libxcb.so.1 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libXpm.so.4 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libjpeg.so.62 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libfontconfig.so.1 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libfreetype.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libtinfo.so.5 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libXau.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libexpat.so.1 /lib32/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ldd should report:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trinatdaq:trinat&amp;gt; ldd /usr/local/physica/physica.exe&lt;br /&gt;
	linux-gate.so.1 (0xf7fa2000)&lt;br /&gt;
	libX11.so.6 =&amp;gt; /lib32/libX11.so.6 (0xf7e43000)&lt;br /&gt;
	libgd.so.2 =&amp;gt; /lib32/libgd.so.2 (0xf7dfe000)&lt;br /&gt;
	libpng12.so.0 =&amp;gt; /lib32/libpng12.so.0 (0xf7dd6000)&lt;br /&gt;
	libz.so.1 =&amp;gt; /lib32/libz.so.1 (0xf7db8000)&lt;br /&gt;
	libreadline.so.6 =&amp;gt; /lib32/libreadline.so.6 (0xf7d7e000)&lt;br /&gt;
	libncurses.so.5 =&amp;gt; /lib32/libncurses.so.5 (0xf7d5b000)&lt;br /&gt;
	libg2c.so.0 =&amp;gt; /lib32/libg2c.so.0 (0xf7d3d000)&lt;br /&gt;
	libm.so.6 =&amp;gt; /lib32/libm.so.6 (0xf7c39000)&lt;br /&gt;
	libgcc_s.so.1 =&amp;gt; /lib32/libgcc_s.so.1 (0xf7c1a000)&lt;br /&gt;
	libc.so.6 =&amp;gt; /lib32/libc.so.6 (0xf7a2f000)&lt;br /&gt;
	libxcb.so.1 =&amp;gt; /lib32/libxcb.so.1 (0xf7a05000)&lt;br /&gt;
	libdl.so.2 =&amp;gt; /lib32/libdl.so.2 (0xf79ff000)&lt;br /&gt;
	libXpm.so.4 =&amp;gt; /lib32/libXpm.so.4 (0xf79ee000)&lt;br /&gt;
	libjpeg.so.62 =&amp;gt; /lib32/libjpeg.so.62 (0xf7997000)&lt;br /&gt;
	libfontconfig.so.1 =&amp;gt; /lib32/libfontconfig.so.1 (0xf7962000)&lt;br /&gt;
	libfreetype.so.6 =&amp;gt; /lib32/libfreetype.so.6 (0xf78c9000)&lt;br /&gt;
	libtinfo.so.5 =&amp;gt; /lib32/libtinfo.so.5 (0xf78b0000)&lt;br /&gt;
	/lib/ld-linux.so.2 (0xf7fa4000)&lt;br /&gt;
	libXau.so.6 =&amp;gt; /lib32/libXau.so.6 (0xf78ad000)&lt;br /&gt;
	libexpat.so.1 =&amp;gt; /lib32/libexpat.so.1 (0xf7885000)&lt;br /&gt;
trinatdaq:trinat&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set login environment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
setenv TRIUMF_FONTS $HOME/packages/physica/fonts&lt;br /&gt;
setenv PHYSICA_DIR $HOME/packages/physica&lt;br /&gt;
alias physica $PHYSICA_DIR/physica-SL6-32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/packages/physica&lt;br /&gt;
physica&lt;br /&gt;
@rangauss.pcm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install kubuntu-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install lxqt&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
KO - is this still needed? does it cause any security problems?&lt;br /&gt;
&lt;br /&gt;
x2go instructions, thanks to Art O.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:x2go/stable&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
#GRUB_TIMEOUT_STYLE=hidden&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reboot ==&lt;br /&gt;
&lt;br /&gt;
this completes installation of the base system.&lt;br /&gt;
&lt;br /&gt;
following sections modify basic ubuntu to fix known problems and to enable special stuff.&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
!!! only if ROOT on ZFS !!!&lt;br /&gt;
&lt;br /&gt;
There is an error in the zsys package that causes bpool to run out of space,&lt;br /&gt;
see [[#Ubuntu zsys]] for more details.&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp etc/zsys.conf /etc/&lt;br /&gt;
zsysctl service reload&lt;br /&gt;
zsysctl service gc&lt;br /&gt;
zpool list bpool&lt;br /&gt;
zfs list bpool&lt;br /&gt;
df /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, debian 11) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit /etc/nsswitch.conf to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable hourly update of nis maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone http://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ONE MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys # broken, do not use&lt;br /&gt;
apt remove sddm # login manager&lt;br /&gt;
apt remove avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt remove modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module&lt;br /&gt;
* enable new configurations&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
* apt-get update # update package list&lt;br /&gt;
* apt-get dist-upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
* apt-get autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS =&lt;br /&gt;
&lt;br /&gt;
!!! after installing all the packages, after updating the system, after updating the linux kernel, after rebooting into latest kernel !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install zfsutils-linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Follow generic ZFS instructions: [[ZFS]]&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Update Ubuntu LTS 20.04 to LTS 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daqubuntu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== midm9a ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daq17 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daq00 ==&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
== isdaq08 ==&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== boot from ZFS ==&lt;br /&gt;
&lt;br /&gt;
* use UEFI boot with syslinux, see here: https://daq.triumf.ca/DaqWiki/index.php/SLinstall#Configure_UEFI_boot&lt;br /&gt;
* apt install zfs-initramfs&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* ZFS structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# zfs list&lt;br /&gt;
NAME                                               USED  AVAIL     REFER  MOUNTPOINT&lt;br /&gt;
rpool                                              147G  1.62T       96K  /&lt;br /&gt;
rpool/ROOT                                        17.8G  1.62T       96K  none&lt;br /&gt;
rpool/ROOT/ubuntu_00aaaa                          17.8G  1.62T     6.22G  /&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy OS image to rpool/ROOT/ubuntu_00aaaa&lt;br /&gt;
* zfs set mountpoint=/ rpool&lt;br /&gt;
* zfs set mountpoint=none rpool/ROOT&lt;br /&gt;
* zfs set mountpoint=/ rpool/ROOT/ubuntu_00aaaa&lt;br /&gt;
* zfs get all | grep mountpoint&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rpool                     mountpoint            /                      local&lt;br /&gt;
rpool/ROOT                mountpoint            none                   local&lt;br /&gt;
rpool/ROOT/ubuntu_00aaaa  mountpoint            /                      local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in linux kernel command line (syslinux.cfg), set &amp;quot;root=&amp;quot; to &amp;quot;root=ZFS=rpool/ROOT/ubuntu_00aaaa&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== boot from ZFS mirror ==&lt;br /&gt;
&lt;br /&gt;
=== setup the EFI partitions ===&lt;br /&gt;
&lt;br /&gt;
* assuming /dev/sdb is already setup for EFI boot, setup /dev/sda the same way:&lt;br /&gt;
* partition the second boot disk same as first boot disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# gdisk -l /dev/sdb&lt;br /&gt;
Found valid GPT with protective MBR; using GPT.&lt;br /&gt;
Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
   1            2048         1050623   512.0 MiB   EF00  EFI system partition&lt;br /&gt;
   2         1050624      3907029134   1.8 TiB     8300  Linux filesystem&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkfs.msdos /dev/sdX1&lt;br /&gt;
* create mount points&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/fstab&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1 &lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
* df | grep boot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# df | grep boot&lt;br /&gt;
/dev/sdb1                    523248    98100     425148  19% /boot/efi-sdb&lt;br /&gt;
/dev/sda1                    523248        4     523244   1% /boot/efi-sda&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy boot files to new boot disk&lt;br /&gt;
* cd /boot/efi-sdX; rsync -av . /boot/efi-sdY&lt;br /&gt;
* set BIOS to boot from &amp;quot;UEFI Hard drive&amp;quot;, disable legacy boot (except for booting from USB key in legacy mode)&lt;br /&gt;
* if using UEFI boot syslinux per these instructions, linux kernel update has to be done manually:&lt;br /&gt;
* run ~/git/scripts/etc/update_efi_mirror.perl, follow instructions that it prints.&lt;br /&gt;
&lt;br /&gt;
=== setup zfs partitions ===&lt;br /&gt;
&lt;br /&gt;
use partitions compatible with Ubuntu &amp;quot;install on ZFS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* gdisk &amp;quot;o&amp;quot; to create new GPT partition table&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +512M ef00 to create EFI partition&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +2G 8200 to create linux swap partition (not used)&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +2G BE00 to create ZFS bpool partition&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; xxx BF00 create ZFS rpool partition&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# gdisk -l /dev/sda&lt;br /&gt;
Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
   1            2048         1050623   512.0 MiB   EF00  EFI System Partition&lt;br /&gt;
   2         1050624         5244927   2.0 GiB     8200  &lt;br /&gt;
   3         5244928         9439231   2.0 GiB     BE00  &lt;br /&gt;
   4         9439232       234441614   107.3 GiB   BF00  &lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup zfs mirror ===&lt;br /&gt;
&lt;br /&gt;
* see here: https://daq.triumf.ca/DaqWiki/index.php/ZFS#Convert_pool_from_single_to_mirror&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Feb 19 16:47 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801081-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Feb 19 16:47 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801101-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: none requested&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                             STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                            ONLINE       0     0     0&lt;br /&gt;
          ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool attach rpool ata-WDC_WDS200T2B0A-00SM50_205007801101-part2 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801081-part2&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
        continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Feb 19 16:54:39 2021&lt;br /&gt;
        12.6G scanned at 3.16G/s, 1.02G issued at 262M/s, 12.6G total&lt;br /&gt;
        1.02G resilvered, 8.09% done, 0 days 00:00:45 to go&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                               STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                              ONLINE       0     0     0&lt;br /&gt;
          mirror-0                                         ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801081-part2  ONLINE       0     0     0  (resilvering)&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 12.7G in 0 days 00:00:40 with 0 errors on Fri Feb 19 16:55:19 2021&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                               STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                              ONLINE       0     0     0&lt;br /&gt;
          mirror-0                                         ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801081-part2  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part3&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part3 -&amp;gt; ../../sda3&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3 -&amp;gt; ../../sdb3&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable booting from second SSD: (instead of /dev/sda1, /dev/sdb1, use UUID=xxx)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm9b:~# echo &amp;quot;/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
root@midm9b:~# echo &amp;quot;/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* ensure dnsmasq starts after all interfaces are up (Ubuntu-22)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/dnsmasq.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/dnsmasq.service.d/local.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: root-path does not actually work, it is hardwired pxelinux.cfg/default file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
mkdir /etc/systemd/system/mini-httpd.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/mini-httpd.service.d/local.conf&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing (Ubuntu LTS 22.04)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* enable NFS over UDP, edit /etc/nfs.conf add &amp;quot;udp=y&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udp=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart nfs-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
NOTE!!!&lt;br /&gt;
&lt;br /&gt;
THIS IS NOT AN AARCH64 (arm64) CROSSCOMPILER!&lt;br /&gt;
&lt;br /&gt;
NOTE!!!&lt;br /&gt;
&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libgcc-9-dev-arm64-cross&lt;br /&gt;
apt install gcc-arm-linux-gnueabi&lt;br /&gt;
apt install gcc-arm-linux-gnueabihf&lt;br /&gt;
apt install g++-arm-linux-gnueabihf&lt;br /&gt;
apt install g++-arm-linux-gnueabi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* find out the correct -march setting, on the target machine, run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm00:~# g++ -Q --help=target | grep march&lt;br /&gt;
  -march=                     		armv8-a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabi-gcc -o ttcp1 ttcp.c -march=armv7 -static&lt;br /&gt;
arm-linux-gnueabi-gcc -o memcpy.armv7 memcpy.cc -march=armv7 -static -O2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=7671</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=7671"/>
		<updated>2024-02-26T20:19:55Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: /* Install apache httpd proxy for midas and elog */  deleted duplicate paragraph&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= About Ubuntu =&lt;br /&gt;
&lt;br /&gt;
AAA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
#echo server time1.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
#echo server time2.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
#echo server time3.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE1: if time1, time2, time3 are already listed in /etc/crony/chrony.conf, please remove them and restart chrony.&lt;br /&gt;
&lt;br /&gt;
NOTE2: if time1, time2, time3 are not listed in &amp;quot;chronyc tracking&amp;quot; or if they are not selected by &amp;quot;chronyc tracking&amp;quot;, check that /etc/crony/chrony.conf contains &amp;quot;sourcedir /etc/chrony/sources.d&amp;quot;. old versions of this file may not have it.&lt;br /&gt;
&lt;br /&gt;
NOTE3: read https://chrony-project.org/faq.html#_should_i_prefer_chrony_over_timesyncd_if_i_do_not_need_to_run_a_server&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools sysstat smartmontools lm-sensors traceroute time minicom screen git lsof debsums tmux iptables&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
yes | apt -y install flex bison&lt;br /&gt;
yes | apt -y install neofetch&lt;br /&gt;
yes | apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
yes | apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
yes | apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
yes | apt -y install mariadb-client ### mysql client&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
yes | apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
yes | apt -y install apt install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libavahi-compat-libdnssd-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.2.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
* apt install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
* restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
* xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
(does not work anymore!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ftp.ca.debian.org/debian/pool/main/libp/libpng/libpng12-0_1.2.50-2+deb8u2_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.50-2+deb8u2_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install 32-bit libraries for PHYSICA ==&lt;br /&gt;
&lt;br /&gt;
these instructions are for running 32-bit physica executable built for SL6 on ubuntu LTS 20.04&lt;br /&gt;
&lt;br /&gt;
install physica sources (cannot build, do not have g77)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/packages&lt;br /&gt;
git clone https://bitbucket.org/ttriumfdaq/physica.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
install 32-bit libraries using ubuntu package manager:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install lib32z1 # libz.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy 32-bit SL6 shared libraries to /lib32&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libX11.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libgd.so.2 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libpng12.so.0 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libreadline.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libncurses.so.5 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libg2c.so.0 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libxcb.so.1 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libXpm.so.4 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libjpeg.so.62 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libfontconfig.so.1 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libfreetype.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libtinfo.so.5 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libXau.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libexpat.so.1 /lib32/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ldd should report:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trinatdaq:trinat&amp;gt; ldd /usr/local/physica/physica.exe&lt;br /&gt;
	linux-gate.so.1 (0xf7fa2000)&lt;br /&gt;
	libX11.so.6 =&amp;gt; /lib32/libX11.so.6 (0xf7e43000)&lt;br /&gt;
	libgd.so.2 =&amp;gt; /lib32/libgd.so.2 (0xf7dfe000)&lt;br /&gt;
	libpng12.so.0 =&amp;gt; /lib32/libpng12.so.0 (0xf7dd6000)&lt;br /&gt;
	libz.so.1 =&amp;gt; /lib32/libz.so.1 (0xf7db8000)&lt;br /&gt;
	libreadline.so.6 =&amp;gt; /lib32/libreadline.so.6 (0xf7d7e000)&lt;br /&gt;
	libncurses.so.5 =&amp;gt; /lib32/libncurses.so.5 (0xf7d5b000)&lt;br /&gt;
	libg2c.so.0 =&amp;gt; /lib32/libg2c.so.0 (0xf7d3d000)&lt;br /&gt;
	libm.so.6 =&amp;gt; /lib32/libm.so.6 (0xf7c39000)&lt;br /&gt;
	libgcc_s.so.1 =&amp;gt; /lib32/libgcc_s.so.1 (0xf7c1a000)&lt;br /&gt;
	libc.so.6 =&amp;gt; /lib32/libc.so.6 (0xf7a2f000)&lt;br /&gt;
	libxcb.so.1 =&amp;gt; /lib32/libxcb.so.1 (0xf7a05000)&lt;br /&gt;
	libdl.so.2 =&amp;gt; /lib32/libdl.so.2 (0xf79ff000)&lt;br /&gt;
	libXpm.so.4 =&amp;gt; /lib32/libXpm.so.4 (0xf79ee000)&lt;br /&gt;
	libjpeg.so.62 =&amp;gt; /lib32/libjpeg.so.62 (0xf7997000)&lt;br /&gt;
	libfontconfig.so.1 =&amp;gt; /lib32/libfontconfig.so.1 (0xf7962000)&lt;br /&gt;
	libfreetype.so.6 =&amp;gt; /lib32/libfreetype.so.6 (0xf78c9000)&lt;br /&gt;
	libtinfo.so.5 =&amp;gt; /lib32/libtinfo.so.5 (0xf78b0000)&lt;br /&gt;
	/lib/ld-linux.so.2 (0xf7fa4000)&lt;br /&gt;
	libXau.so.6 =&amp;gt; /lib32/libXau.so.6 (0xf78ad000)&lt;br /&gt;
	libexpat.so.1 =&amp;gt; /lib32/libexpat.so.1 (0xf7885000)&lt;br /&gt;
trinatdaq:trinat&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set login environment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
setenv TRIUMF_FONTS $HOME/packages/physica/fonts&lt;br /&gt;
setenv PHYSICA_DIR $HOME/packages/physica&lt;br /&gt;
alias physica $PHYSICA_DIR/physica-SL6-32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/packages/physica&lt;br /&gt;
physica&lt;br /&gt;
@rangauss.pcm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install kubuntu-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install lxqt&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
KO - is this still needed? does it cause any security problems?&lt;br /&gt;
&lt;br /&gt;
x2go instructions, thanks to Art O.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:x2go/stable&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
#GRUB_TIMEOUT_STYLE=hidden&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reboot ==&lt;br /&gt;
&lt;br /&gt;
this completes installation of the base system.&lt;br /&gt;
&lt;br /&gt;
following sections modify basic ubuntu to fix known problems and to enable special stuff.&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
!!! only if ROOT on ZFS !!!&lt;br /&gt;
&lt;br /&gt;
There is an error in the zsys package that causes bpool to run out of space,&lt;br /&gt;
see [[#Ubuntu zsys]] for more details.&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp etc/zsys.conf /etc/&lt;br /&gt;
zsysctl service reload&lt;br /&gt;
zsysctl service gc&lt;br /&gt;
zpool list bpool&lt;br /&gt;
zfs list bpool&lt;br /&gt;
df /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, debian 11) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit /etc/nsswitch.conf to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable hourly update of nis maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone http://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone http://ladd00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ONE MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys # broken, do not use&lt;br /&gt;
apt remove sddm # login manager&lt;br /&gt;
apt remove avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt remove modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module&lt;br /&gt;
* enable new configurations&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
* apt-get update # update package list&lt;br /&gt;
* apt-get dist-upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
* apt-get autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS =&lt;br /&gt;
&lt;br /&gt;
!!! after installing all the packages, after updating the system, after updating the linux kernel, after rebooting into latest kernel !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install zfsutils-linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Follow generic ZFS instructions: [[ZFS]]&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Update Ubuntu LTS 20.04 to LTS 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daqubuntu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== midm9a ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daq17 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daq00 ==&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
== isdaq08 ==&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== boot from ZFS ==&lt;br /&gt;
&lt;br /&gt;
* use UEFI boot with syslinux, see here: https://daq.triumf.ca/DaqWiki/index.php/SLinstall#Configure_UEFI_boot&lt;br /&gt;
* apt install zfs-initramfs&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* ZFS structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# zfs list&lt;br /&gt;
NAME                                               USED  AVAIL     REFER  MOUNTPOINT&lt;br /&gt;
rpool                                              147G  1.62T       96K  /&lt;br /&gt;
rpool/ROOT                                        17.8G  1.62T       96K  none&lt;br /&gt;
rpool/ROOT/ubuntu_00aaaa                          17.8G  1.62T     6.22G  /&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy OS image to rpool/ROOT/ubuntu_00aaaa&lt;br /&gt;
* zfs set mountpoint=/ rpool&lt;br /&gt;
* zfs set mountpoint=none rpool/ROOT&lt;br /&gt;
* zfs set mountpoint=/ rpool/ROOT/ubuntu_00aaaa&lt;br /&gt;
* zfs get all | grep mountpoint&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rpool                     mountpoint            /                      local&lt;br /&gt;
rpool/ROOT                mountpoint            none                   local&lt;br /&gt;
rpool/ROOT/ubuntu_00aaaa  mountpoint            /                      local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in linux kernel command line (syslinux.cfg), set &amp;quot;root=&amp;quot; to &amp;quot;root=ZFS=rpool/ROOT/ubuntu_00aaaa&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== boot from ZFS mirror ==&lt;br /&gt;
&lt;br /&gt;
=== setup the EFI partitions ===&lt;br /&gt;
&lt;br /&gt;
* assuming /dev/sdb is already setup for EFI boot, setup /dev/sda the same way:&lt;br /&gt;
* partition the second boot disk same as first boot disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# gdisk -l /dev/sdb&lt;br /&gt;
Found valid GPT with protective MBR; using GPT.&lt;br /&gt;
Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
   1            2048         1050623   512.0 MiB   EF00  EFI system partition&lt;br /&gt;
   2         1050624      3907029134   1.8 TiB     8300  Linux filesystem&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkfs.msdos /dev/sdX1&lt;br /&gt;
* create mount points&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/fstab&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1 &lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
* df | grep boot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# df | grep boot&lt;br /&gt;
/dev/sdb1                    523248    98100     425148  19% /boot/efi-sdb&lt;br /&gt;
/dev/sda1                    523248        4     523244   1% /boot/efi-sda&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy boot files to new boot disk&lt;br /&gt;
* cd /boot/efi-sdX; rsync -av . /boot/efi-sdY&lt;br /&gt;
* set BIOS to boot from &amp;quot;UEFI Hard drive&amp;quot;, disable legacy boot (except for booting from USB key in legacy mode)&lt;br /&gt;
* if using UEFI boot syslinux per these instructions, linux kernel update has to be done manually:&lt;br /&gt;
* run ~/git/scripts/etc/update_efi_mirror.perl, follow instructions that it prints.&lt;br /&gt;
&lt;br /&gt;
=== setup zfs partitions ===&lt;br /&gt;
&lt;br /&gt;
use partitions compatible with Ubuntu &amp;quot;install on ZFS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* gdisk &amp;quot;o&amp;quot; to create new GPT partition table&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +512M ef00 to create EFI partition&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +2G 8200 to create linux swap partition (not used)&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +2G BE00 to create ZFS bpool partition&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; xxx BF00 create ZFS rpool partition&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# gdisk -l /dev/sda&lt;br /&gt;
Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
   1            2048         1050623   512.0 MiB   EF00  EFI System Partition&lt;br /&gt;
   2         1050624         5244927   2.0 GiB     8200  &lt;br /&gt;
   3         5244928         9439231   2.0 GiB     BE00  &lt;br /&gt;
   4         9439232       234441614   107.3 GiB   BF00  &lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup zfs mirror ===&lt;br /&gt;
&lt;br /&gt;
* see here: https://daq.triumf.ca/DaqWiki/index.php/ZFS#Convert_pool_from_single_to_mirror&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Feb 19 16:47 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801081-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Feb 19 16:47 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801101-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: none requested&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                             STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                            ONLINE       0     0     0&lt;br /&gt;
          ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool attach rpool ata-WDC_WDS200T2B0A-00SM50_205007801101-part2 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801081-part2&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
        continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Feb 19 16:54:39 2021&lt;br /&gt;
        12.6G scanned at 3.16G/s, 1.02G issued at 262M/s, 12.6G total&lt;br /&gt;
        1.02G resilvered, 8.09% done, 0 days 00:00:45 to go&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                               STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                              ONLINE       0     0     0&lt;br /&gt;
          mirror-0                                         ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801081-part2  ONLINE       0     0     0  (resilvering)&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 12.7G in 0 days 00:00:40 with 0 errors on Fri Feb 19 16:55:19 2021&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                               STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                              ONLINE       0     0     0&lt;br /&gt;
          mirror-0                                         ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801081-part2  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part3&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part3 -&amp;gt; ../../sda3&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3 -&amp;gt; ../../sdb3&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable booting from second SSD: (instead of /dev/sda1, /dev/sdb1, use UUID=xxx)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm9b:~# echo &amp;quot;/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
root@midm9b:~# echo &amp;quot;/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: root-path does not actually work, it is hardwired pxelinux.cfg/default file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing (Ubuntu LTS 22.04)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libgcc-9-dev-arm64-cross&lt;br /&gt;
apt install gcc-arm-linux-gnueabi&lt;br /&gt;
apt install gcc-arm-linux-gnueabihf&lt;br /&gt;
apt install g++-arm-linux-gnueabihf&lt;br /&gt;
apt install g++-arm-linux-gnueabi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabi-gcc -o ttcp1 ttcp.c -march=armv7 -static&lt;br /&gt;
arm-linux-gnueabi-gcc -o memcpy.armv7 memcpy.cc -march=armv7 -static -O2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=7659</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=7659"/>
		<updated>2024-02-21T00:22:39Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: /* Install apache httpd proxy for midas and elog */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= About Ubuntu =&lt;br /&gt;
&lt;br /&gt;
AAA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
#echo server time1.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
#echo server time2.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
#echo server time3.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE1: if time1, time2, time3 are already listed in /etc/crony/chrony.conf, please remove them and restart chrony.&lt;br /&gt;
&lt;br /&gt;
NOTE2: if time1, time2, time3 are not listed in &amp;quot;chronyc tracking&amp;quot; or if they are not selected by &amp;quot;chronyc tracking&amp;quot;, check that /etc/crony/chrony.conf contains &amp;quot;sourcedir /etc/chrony/sources.d&amp;quot;. old versions of this file may not have it.&lt;br /&gt;
&lt;br /&gt;
NOTE3: read https://chrony-project.org/faq.html#_should_i_prefer_chrony_over_timesyncd_if_i_do_not_need_to_run_a_server&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools sysstat smartmontools lm-sensors traceroute time minicom screen git lsof debsums tmux iptables&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
yes | apt -y install flex bison&lt;br /&gt;
yes | apt -y install neofetch&lt;br /&gt;
yes | apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
yes | apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
yes | apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
yes | apt -y install mariadb-client ### mysql client&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
yes | apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
yes | apt -y install apt install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libavahi-compat-libdnssd-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.2.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
* apt install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
* restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
* xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
(does not work anymore!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ftp.ca.debian.org/debian/pool/main/libp/libpng/libpng12-0_1.2.50-2+deb8u2_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.50-2+deb8u2_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install 32-bit libraries for PHYSICA ==&lt;br /&gt;
&lt;br /&gt;
these instructions are for running 32-bit physica executable built for SL6 on ubuntu LTS 20.04&lt;br /&gt;
&lt;br /&gt;
install physica sources (cannot build, do not have g77)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/packages&lt;br /&gt;
git clone https://bitbucket.org/ttriumfdaq/physica.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
install 32-bit libraries using ubuntu package manager:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install lib32z1 # libz.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy 32-bit SL6 shared libraries to /lib32&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libX11.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libgd.so.2 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libpng12.so.0 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libreadline.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libncurses.so.5 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libg2c.so.0 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libxcb.so.1 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libXpm.so.4 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libjpeg.so.62 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libfontconfig.so.1 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libfreetype.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libtinfo.so.5 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libXau.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libexpat.so.1 /lib32/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ldd should report:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trinatdaq:trinat&amp;gt; ldd /usr/local/physica/physica.exe&lt;br /&gt;
	linux-gate.so.1 (0xf7fa2000)&lt;br /&gt;
	libX11.so.6 =&amp;gt; /lib32/libX11.so.6 (0xf7e43000)&lt;br /&gt;
	libgd.so.2 =&amp;gt; /lib32/libgd.so.2 (0xf7dfe000)&lt;br /&gt;
	libpng12.so.0 =&amp;gt; /lib32/libpng12.so.0 (0xf7dd6000)&lt;br /&gt;
	libz.so.1 =&amp;gt; /lib32/libz.so.1 (0xf7db8000)&lt;br /&gt;
	libreadline.so.6 =&amp;gt; /lib32/libreadline.so.6 (0xf7d7e000)&lt;br /&gt;
	libncurses.so.5 =&amp;gt; /lib32/libncurses.so.5 (0xf7d5b000)&lt;br /&gt;
	libg2c.so.0 =&amp;gt; /lib32/libg2c.so.0 (0xf7d3d000)&lt;br /&gt;
	libm.so.6 =&amp;gt; /lib32/libm.so.6 (0xf7c39000)&lt;br /&gt;
	libgcc_s.so.1 =&amp;gt; /lib32/libgcc_s.so.1 (0xf7c1a000)&lt;br /&gt;
	libc.so.6 =&amp;gt; /lib32/libc.so.6 (0xf7a2f000)&lt;br /&gt;
	libxcb.so.1 =&amp;gt; /lib32/libxcb.so.1 (0xf7a05000)&lt;br /&gt;
	libdl.so.2 =&amp;gt; /lib32/libdl.so.2 (0xf79ff000)&lt;br /&gt;
	libXpm.so.4 =&amp;gt; /lib32/libXpm.so.4 (0xf79ee000)&lt;br /&gt;
	libjpeg.so.62 =&amp;gt; /lib32/libjpeg.so.62 (0xf7997000)&lt;br /&gt;
	libfontconfig.so.1 =&amp;gt; /lib32/libfontconfig.so.1 (0xf7962000)&lt;br /&gt;
	libfreetype.so.6 =&amp;gt; /lib32/libfreetype.so.6 (0xf78c9000)&lt;br /&gt;
	libtinfo.so.5 =&amp;gt; /lib32/libtinfo.so.5 (0xf78b0000)&lt;br /&gt;
	/lib/ld-linux.so.2 (0xf7fa4000)&lt;br /&gt;
	libXau.so.6 =&amp;gt; /lib32/libXau.so.6 (0xf78ad000)&lt;br /&gt;
	libexpat.so.1 =&amp;gt; /lib32/libexpat.so.1 (0xf7885000)&lt;br /&gt;
trinatdaq:trinat&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set login environment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
setenv TRIUMF_FONTS $HOME/packages/physica/fonts&lt;br /&gt;
setenv PHYSICA_DIR $HOME/packages/physica&lt;br /&gt;
alias physica $PHYSICA_DIR/physica-SL6-32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/packages/physica&lt;br /&gt;
physica&lt;br /&gt;
@rangauss.pcm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install kubuntu-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install lxqt&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
KO - is this still needed? does it cause any security problems?&lt;br /&gt;
&lt;br /&gt;
x2go instructions, thanks to Art O.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:x2go/stable&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
#GRUB_TIMEOUT_STYLE=hidden&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reboot ==&lt;br /&gt;
&lt;br /&gt;
this completes installation of the base system.&lt;br /&gt;
&lt;br /&gt;
following sections modify basic ubuntu to fix known problems and to enable special stuff.&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
!!! only if ROOT on ZFS !!!&lt;br /&gt;
&lt;br /&gt;
There is an error in the zsys package that causes bpool to run out of space,&lt;br /&gt;
see [[#Ubuntu zsys]] for more details.&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp etc/zsys.conf /etc/&lt;br /&gt;
zsysctl service reload&lt;br /&gt;
zsysctl service gc&lt;br /&gt;
zpool list bpool&lt;br /&gt;
zfs list bpool&lt;br /&gt;
df /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, debian 11) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit /etc/nsswitch.conf to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable hourly update of nis maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone http://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone http://ladd00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ONE MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys # broken, do not use&lt;br /&gt;
apt remove sddm # login manager&lt;br /&gt;
apt remove avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt remove modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module&lt;br /&gt;
* enable new configurations&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
* apt-get update # update package list&lt;br /&gt;
* apt-get dist-upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
* apt-get autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS =&lt;br /&gt;
&lt;br /&gt;
!!! after installing all the packages, after updating the system, after updating the linux kernel, after rebooting into latest kernel !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install zfsutils-linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Follow generic ZFS instructions: [[ZFS]]&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Update Ubuntu LTS 20.04 to LTS 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daqubuntu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== midm9a ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daq17 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daq00 ==&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
== isdaq08 ==&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== boot from ZFS ==&lt;br /&gt;
&lt;br /&gt;
* use UEFI boot with syslinux, see here: https://daq.triumf.ca/DaqWiki/index.php/SLinstall#Configure_UEFI_boot&lt;br /&gt;
* apt install zfs-initramfs&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* ZFS structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# zfs list&lt;br /&gt;
NAME                                               USED  AVAIL     REFER  MOUNTPOINT&lt;br /&gt;
rpool                                              147G  1.62T       96K  /&lt;br /&gt;
rpool/ROOT                                        17.8G  1.62T       96K  none&lt;br /&gt;
rpool/ROOT/ubuntu_00aaaa                          17.8G  1.62T     6.22G  /&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy OS image to rpool/ROOT/ubuntu_00aaaa&lt;br /&gt;
* zfs set mountpoint=/ rpool&lt;br /&gt;
* zfs set mountpoint=none rpool/ROOT&lt;br /&gt;
* zfs set mountpoint=/ rpool/ROOT/ubuntu_00aaaa&lt;br /&gt;
* zfs get all | grep mountpoint&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rpool                     mountpoint            /                      local&lt;br /&gt;
rpool/ROOT                mountpoint            none                   local&lt;br /&gt;
rpool/ROOT/ubuntu_00aaaa  mountpoint            /                      local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in linux kernel command line (syslinux.cfg), set &amp;quot;root=&amp;quot; to &amp;quot;root=ZFS=rpool/ROOT/ubuntu_00aaaa&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== boot from ZFS mirror ==&lt;br /&gt;
&lt;br /&gt;
=== setup the EFI partitions ===&lt;br /&gt;
&lt;br /&gt;
* assuming /dev/sdb is already setup for EFI boot, setup /dev/sda the same way:&lt;br /&gt;
* partition the second boot disk same as first boot disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# gdisk -l /dev/sdb&lt;br /&gt;
Found valid GPT with protective MBR; using GPT.&lt;br /&gt;
Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
   1            2048         1050623   512.0 MiB   EF00  EFI system partition&lt;br /&gt;
   2         1050624      3907029134   1.8 TiB     8300  Linux filesystem&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkfs.msdos /dev/sdX1&lt;br /&gt;
* create mount points&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/fstab&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1 &lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
* df | grep boot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# df | grep boot&lt;br /&gt;
/dev/sdb1                    523248    98100     425148  19% /boot/efi-sdb&lt;br /&gt;
/dev/sda1                    523248        4     523244   1% /boot/efi-sda&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy boot files to new boot disk&lt;br /&gt;
* cd /boot/efi-sdX; rsync -av . /boot/efi-sdY&lt;br /&gt;
* set BIOS to boot from &amp;quot;UEFI Hard drive&amp;quot;, disable legacy boot (except for booting from USB key in legacy mode)&lt;br /&gt;
* if using UEFI boot syslinux per these instructions, linux kernel update has to be done manually:&lt;br /&gt;
* run ~/git/scripts/etc/update_efi_mirror.perl, follow instructions that it prints.&lt;br /&gt;
&lt;br /&gt;
=== setup zfs partitions ===&lt;br /&gt;
&lt;br /&gt;
use partitions compatible with Ubuntu &amp;quot;install on ZFS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* gdisk &amp;quot;o&amp;quot; to create new GPT partition table&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +512M ef00 to create EFI partition&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +2G 8200 to create linux swap partition (not used)&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +2G BE00 to create ZFS bpool partition&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; xxx BF00 create ZFS rpool partition&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# gdisk -l /dev/sda&lt;br /&gt;
Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
   1            2048         1050623   512.0 MiB   EF00  EFI System Partition&lt;br /&gt;
   2         1050624         5244927   2.0 GiB     8200  &lt;br /&gt;
   3         5244928         9439231   2.0 GiB     BE00  &lt;br /&gt;
   4         9439232       234441614   107.3 GiB   BF00  &lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup zfs mirror ===&lt;br /&gt;
&lt;br /&gt;
* see here: https://daq.triumf.ca/DaqWiki/index.php/ZFS#Convert_pool_from_single_to_mirror&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Feb 19 16:47 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801081-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Feb 19 16:47 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801101-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: none requested&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                             STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                            ONLINE       0     0     0&lt;br /&gt;
          ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool attach rpool ata-WDC_WDS200T2B0A-00SM50_205007801101-part2 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801081-part2&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
        continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Feb 19 16:54:39 2021&lt;br /&gt;
        12.6G scanned at 3.16G/s, 1.02G issued at 262M/s, 12.6G total&lt;br /&gt;
        1.02G resilvered, 8.09% done, 0 days 00:00:45 to go&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                               STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                              ONLINE       0     0     0&lt;br /&gt;
          mirror-0                                         ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801081-part2  ONLINE       0     0     0  (resilvering)&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 12.7G in 0 days 00:00:40 with 0 errors on Fri Feb 19 16:55:19 2021&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                               STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                              ONLINE       0     0     0&lt;br /&gt;
          mirror-0                                         ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801081-part2  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part3&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part3 -&amp;gt; ../../sda3&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3 -&amp;gt; ../../sdb3&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable booting from second SSD: (instead of /dev/sda1, /dev/sdb1, use UUID=xxx)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm9b:~# echo &amp;quot;/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
root@midm9b:~# echo &amp;quot;/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: root-path does not actually work, it is hardwired pxelinux.cfg/default file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing (Ubuntu LTS 22.04)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libgcc-9-dev-arm64-cross&lt;br /&gt;
apt install gcc-arm-linux-gnueabi&lt;br /&gt;
apt install gcc-arm-linux-gnueabihf&lt;br /&gt;
apt install g++-arm-linux-gnueabihf&lt;br /&gt;
apt install g++-arm-linux-gnueabi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabi-gcc -o ttcp1 ttcp.c -march=armv7 -static&lt;br /&gt;
arm-linux-gnueabi-gcc -o memcpy.armv7 memcpy.cc -march=armv7 -static -O2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=RPi-RT&amp;diff=7577</id>
		<title>RPi-RT</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=RPi-RT&amp;diff=7577"/>
		<updated>2024-01-10T18:31:59Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
These are notes from cross-compiling a real-time (i.e. &amp;quot;fully preemptive&amp;quot;) kernel for raspberry pi 4B. I attempted it on the 3B+, but ran into problems with the SD card module.&lt;br /&gt;
Adapted from https://www.instructables.com/64bit-RT-Kernel-Compilation-for-Raspberry-Pi-4B-/ and https://www.instructables.com/64bit-RT-Kernel-Compilation-for-Raspberry-Pi-4B-/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
Install the toolchain for cross-compilation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev&lt;br /&gt;
sudo apt install crossbuild-essential-arm64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
Go to https://github.com/raspberrypi/linux/branches and select a branch. If you choose the default branch, you do not need to explicitly select it in the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone --depth=1 --branch &amp;lt;branch&amp;gt; https://github.com/raspberrypi/linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Find the matching real-time patch file in https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/ and download it. E.g.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/6.1/patch-6.1.70-rt21.patch.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Apply the patch to the kernel sources:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd linux&lt;br /&gt;
gzip -cd ../patch-6.1.70-rt21.patch.gz | patch -p1 --verbose&lt;br /&gt;
mkdir ../kernel-out&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuring and building the kernel ==&lt;br /&gt;
=== Default configuration ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Turn on Real-Time support ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Navigate to General-&amp;gt;Preemption Model and select the Real-Time option.&lt;br /&gt;
&lt;br /&gt;
=== Building the kernel ===&lt;br /&gt;
Compilation of the kernel will take several minutes, depending on PC power and number of parallel threads.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make -j16 O=../kernel-out/  ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The -j16 option is for the number of parallel processes and should probably be chosen no larger than the number of CPU cores.&lt;br /&gt;
&lt;br /&gt;
== Installation of the kernel on SD card ==&lt;br /&gt;
Take the SD card with your working Raspberry Pi OS or similar linux installation and insert it in an SD reader connected to the PC. If it mounts automatically, unmount as root to prepare for the following (not necessary, but makes the instructions easier). DO NOT unmount using the graphical &#039;&#039;EJECT&#039;&#039; button, as that will not just unmount but also disconnect the device.&lt;br /&gt;
&lt;br /&gt;
=== Prepare SD card ===&lt;br /&gt;
Assuming the SD card is device /dev/sdd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ../kernel-out&lt;br /&gt;
mkdir -p mnt/{fat32,ext4}&lt;br /&gt;
sudo mount /dev/sdd1 mnt/fat32&lt;br /&gt;
sudo mount /dev/sdd2 mnt/ext4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copy files ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ../linux&lt;br /&gt;
sudo make O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/ext4 modules_install&lt;br /&gt;
cd ../kernel-out&lt;br /&gt;
sudo cp arch/arm64/boot/Image mnt/fat32/kernel8_rt.img   # custom kernel name to preserve existing kernel&lt;br /&gt;
sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/fat32/&lt;br /&gt;
sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/fat32/overlays/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Choose custom kernel for booting ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo emacs mnt/fat32/config.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the line&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kernel=kernel8_rt.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
to select your custom kernel.&lt;br /&gt;
&lt;br /&gt;
== Profit! ==&lt;br /&gt;
Insert the SD card in the pi, start it up and watch the boot messages. Hopefully you get to the login prompt. Once logged in, check the correct kernel was loaded with&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=RPi-RT&amp;diff=7543</id>
		<title>RPi-RT</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=RPi-RT&amp;diff=7543"/>
		<updated>2024-01-06T01:16:49Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: /* Profit! */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
These are notes from cross-compiling a real-time (i.e. &amp;quot;fully preemptive&amp;quot;) kernel for raspberry pi 3B+ and 4B.&lt;br /&gt;
Adapted from https://www.instructables.com/64bit-RT-Kernel-Compilation-for-Raspberry-Pi-4B-/ and https://www.instructables.com/64bit-RT-Kernel-Compilation-for-Raspberry-Pi-4B-/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
Install the toolchain for cross-compilation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev&lt;br /&gt;
sudo apt install crossbuild-essential-arm64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
Go to https://github.com/raspberrypi/linux/branches and select a branch. If you choose the default branch, you do not need to explicitly select it in the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone --depth=1 --branch &amp;lt;branch&amp;gt; https://github.com/raspberrypi/linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Find the matching real-time patch file in https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/ and download it. E.g.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/6.1/patch-6.1.70-rt21.patch.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Apply the patch to the kernel sources:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd linux&lt;br /&gt;
gzip -cd ../patch-6.1.70-rt21.patch.gz | patch -p1 --verbose&lt;br /&gt;
mkdir ../kernel-out&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuring and building the kernel ==&lt;br /&gt;
=== Default configuration ===&lt;br /&gt;
==== rPi 3B+ ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcmrpi3_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rPi 4B ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Turn on Real-Time support ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Navigate to General-&amp;gt;Preemption Model and select the Real-Time option.&lt;br /&gt;
&lt;br /&gt;
=== Building the kernel ===&lt;br /&gt;
Compilation of the kernel will take several minutes, depending on PC power and number of parallel threads.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make -j16 O=../kernel-out/  ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The -j16 option is for the number of parallel processes and should probably be chosen no larger than the number of CPU cores.&lt;br /&gt;
&lt;br /&gt;
== Installation of the kernel on SD card ==&lt;br /&gt;
Take the SD card with your working Raspberry Pi OS or similar linux installation and insert it in an SD reader connected to the PC. If it mounts automatically, unmount as root to prepare for the following (not necessary, but makes the instructions easier). DO NOT unmount using the graphical &#039;&#039;EJECT&#039;&#039; button, as that will not just unmount but also disconnect the device.&lt;br /&gt;
&lt;br /&gt;
=== Prepare SD card ===&lt;br /&gt;
Assuming the SD card is device /dev/sdd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ../kernel-out&lt;br /&gt;
mkdir -p mnt/{fat32,ext4}&lt;br /&gt;
sudo mount /dev/sdd1 mnt/fat32&lt;br /&gt;
sudo mount /dev/sdd2 mnt/ext4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copy files ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ../linux&lt;br /&gt;
sudo make O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/ext4 modules_install&lt;br /&gt;
cd ../kernel-out&lt;br /&gt;
sudo cp arch/arm64/boot/Image mnt/fat32/kernel8_rt.img   # custom kernel name to preserve existing kernel&lt;br /&gt;
sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/fat32/&lt;br /&gt;
sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/fat32/overlays/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Choose custom kernel for booting ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo emacs mnt/fat32/config.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the line&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kernel=kernel8_rt.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
to select your custom kernel.&lt;br /&gt;
&lt;br /&gt;
== Profit! ==&lt;br /&gt;
Insert the SD card in the pi, start it up and watch the boot messages. Hopefully you get to the login prompt. Once logged in, check the correct kernel was loaded with&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Currently this does not work on a 3B+, the new kernel does not read the SD card correctly.&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=RPi-RT&amp;diff=7542</id>
		<title>RPi-RT</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=RPi-RT&amp;diff=7542"/>
		<updated>2024-01-06T00:59:15Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
These are notes from cross-compiling a real-time (i.e. &amp;quot;fully preemptive&amp;quot;) kernel for raspberry pi 3B+ and 4B.&lt;br /&gt;
Adapted from https://www.instructables.com/64bit-RT-Kernel-Compilation-for-Raspberry-Pi-4B-/ and https://www.instructables.com/64bit-RT-Kernel-Compilation-for-Raspberry-Pi-4B-/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
Install the toolchain for cross-compilation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev&lt;br /&gt;
sudo apt install crossbuild-essential-arm64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
Go to https://github.com/raspberrypi/linux/branches and select a branch. If you choose the default branch, you do not need to explicitly select it in the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone --depth=1 --branch &amp;lt;branch&amp;gt; https://github.com/raspberrypi/linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Find the matching real-time patch file in https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/ and download it. E.g.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/6.1/patch-6.1.70-rt21.patch.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Apply the patch to the kernel sources:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd linux&lt;br /&gt;
gzip -cd ../patch-6.1.70-rt21.patch.gz | patch -p1 --verbose&lt;br /&gt;
mkdir ../kernel-out&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuring and building the kernel ==&lt;br /&gt;
=== Default configuration ===&lt;br /&gt;
==== rPi 3B+ ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcmrpi3_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rPi 4B ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Turn on Real-Time support ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Navigate to General-&amp;gt;Preemption Model and select the Real-Time option.&lt;br /&gt;
&lt;br /&gt;
=== Building the kernel ===&lt;br /&gt;
Compilation of the kernel will take several minutes, depending on PC power and number of parallel threads.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make -j16 O=../kernel-out/  ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The -j16 option is for the number of parallel processes and should probably be chosen no larger than the number of CPU cores.&lt;br /&gt;
&lt;br /&gt;
== Installation of the kernel on SD card ==&lt;br /&gt;
Take the SD card with your working Raspberry Pi OS or similar linux installation and insert it in an SD reader connected to the PC. If it mounts automatically, unmount as root to prepare for the following (not necessary, but makes the instructions easier). DO NOT unmount using the graphical &#039;&#039;EJECT&#039;&#039; button, as that will not just unmount but also disconnect the device.&lt;br /&gt;
&lt;br /&gt;
=== Prepare SD card ===&lt;br /&gt;
Assuming the SD card is device /dev/sdd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ../kernel-out&lt;br /&gt;
mkdir -p mnt/{fat32,ext4}&lt;br /&gt;
sudo mount /dev/sdd1 mnt/fat32&lt;br /&gt;
sudo mount /dev/sdd2 mnt/ext4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copy files ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ../linux&lt;br /&gt;
sudo make O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/ext4 modules_install&lt;br /&gt;
cd ../kernel-out&lt;br /&gt;
sudo cp arch/arm64/boot/Image mnt/fat32/kernel8_rt.img   # custom kernel name to preserve existing kernel&lt;br /&gt;
sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/fat32/&lt;br /&gt;
sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/fat32/overlays/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Choose custom kernel for booting ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo emacs mnt/fat32/config.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the line&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kernel=kernel8_rt.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
to select your custom kernel.&lt;br /&gt;
&lt;br /&gt;
== Profit! ==&lt;br /&gt;
Insert the SD card in the pi, start it up and watch the boot messages. Hopefully you get to the login prompt. Once logged in, check the correct kernel was loaded with&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=RPi-RT&amp;diff=7541</id>
		<title>RPi-RT</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=RPi-RT&amp;diff=7541"/>
		<updated>2024-01-06T00:40:05Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: Created page with &amp;quot;== Introduction == These are notes from cross-compiling a real-time (i.e. &amp;quot;fully preemptive&amp;quot;) kernel for raspberry pi 3B+ and 4B. Adapted from https://www.instructables.com/64bit-RT-Kernel-Compilation-for-Raspberry-Pi-4B-/ and https://www.instructables.com/64bit-RT-Kernel-Compilation-for-Raspberry-Pi-4B-/  == Prerequisites == Install the toolchain for cross-compilation: &amp;lt;pre&amp;gt; sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev sudo apt install cr...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
These are notes from cross-compiling a real-time (i.e. &amp;quot;fully preemptive&amp;quot;) kernel for raspberry pi 3B+ and 4B.&lt;br /&gt;
Adapted from https://www.instructables.com/64bit-RT-Kernel-Compilation-for-Raspberry-Pi-4B-/ and https://www.instructables.com/64bit-RT-Kernel-Compilation-for-Raspberry-Pi-4B-/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
Install the toolchain for cross-compilation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev&lt;br /&gt;
sudo apt install crossbuild-essential-arm64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
Go to https://github.com/raspberrypi/linux/branches and select a branch. If you choose the default branch, you do not need to explicitly select it in the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone --depth=1 --branch &amp;lt;branch&amp;gt; https://github.com/raspberrypi/linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Find the matching real-time patch file in https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/ and download it. E.g.:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/6.1/patch-6.1.70-rt21.patch.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Apply the patch to the kernel sources:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd linux&lt;br /&gt;
gzip -cd ../patch-6.1.70-rt21.patch.gz | patch -p1 --verbose&lt;br /&gt;
mkdir ../kernel-out&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuring and building the kernel ==&lt;br /&gt;
=== Default configuration ===&lt;br /&gt;
==== rPi 3B+ ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcmrpi3_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rPi 4B ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Turn on Real-Time support ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Navigate to General-&amp;gt;Preemption Model and select the Real-Time option.&lt;br /&gt;
&lt;br /&gt;
=== Building the kernel ===&lt;br /&gt;
Compilation of the kernel will take several minutes, depending on PC power and number of parallel threads.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make -j16 O=../kernel-out/  ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The -j16 option is for the number of parallel processes and should probably be chosen no larger than the number of CPU cores.&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Sysman&amp;diff=7540</id>
		<title>Sysman</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Sysman&amp;diff=7540"/>
		<updated>2024-01-05T23:43:07Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: /* Linux documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== System management ==&lt;br /&gt;
&lt;br /&gt;
* [http://daq-plone.triumf.ca/SM/docs/local Misc documentation on the daq-plone site]&lt;br /&gt;
* [[Daqinv]] DAQ inventory database&lt;br /&gt;
* [[Amanda]] AMANDA backups&lt;br /&gt;
&lt;br /&gt;
== Computer clusters ==&lt;br /&gt;
&lt;br /&gt;
* [[DAQ_Cluster]] [[ISAC_Cluster]] [[MUSR_Cluster]] [http://www.triumf.info/wiki/DAQwiki/index.php/TITAN TITAN]&lt;br /&gt;
* gonodeinfo: [https://daq00.triumf.ca/gonodeinfo/gonodereport.html all] [https://daq00.triumf.ca/gonodeinfo/group-titan.html titan] [https://daq00.triumf.ca/gonodeinfo/group-isac.html isac] [https://daq00.triumf.ca/gonodeinfo/group-cmms.html cmms] (username/password: midas/midas)&lt;br /&gt;
* gonodeinfo: [https://dsvslice.triumf.ca/gonodeinfo/gonodereport.html dsvslice] (username/password: midas/midas)&lt;br /&gt;
* [https://daqstore.triumf.ca/ganglia ganglia] (username/password: midas/midas) (runs on daqstore, see daqstore:/etc/rc.local)&lt;br /&gt;
* zfsquotareport: [https://daq00.triumf.ca/zfsquotareport/zfsquota.html daq00] [https://isdaq00.triumf.ca/zfsquotareport/zfsquota.html isdaq00] [https://alpha00.triumf.ca/zfsquotareport/zfsquota.html alpha00] [musr00] [midm9a] [https://iris00.triumf.ca/zfsquotareport/zfsquota.html iris00] [https://midemma01.triumf.ca/zfsquotareport/zfsquota.html midemma01] [https://trinatdaq.triumf.ca/zfsquotareport/zfsquota.html trinatdaq] [titan00] [https://daqstore.triumf.ca/zfsquotareport/zfsquota.html daqstore]&lt;br /&gt;
* [https://ladd00.triumf.ca/diskusers/disks.html Diskusers] &lt;br /&gt;
* [https://daq00.triumf.ca/~olchansk/pingmon/triumf.html network ping monitor]&lt;br /&gt;
* [https://daq00.triumf.ca/~daqweb/daqbackup/ daqbackup]&lt;br /&gt;
&lt;br /&gt;
* [http://trdata00.triumf.ca:2288 TRDATA dcache status]&lt;br /&gt;
* [[DiskScrub]] Documentation for diskscrub&lt;br /&gt;
* [[disk_benchmarks]]&lt;br /&gt;
* [[graphics_benchmarks]]&lt;br /&gt;
* [[VMs]] DAQ VMs&lt;br /&gt;
&lt;br /&gt;
== Linux documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[SLinstall]] SL5/SL6/CentOS7/CentOS8 install instructions&lt;br /&gt;
* [[Ubuntu]] Ubuntu install instructions&lt;br /&gt;
* [[Raspbian]] Raspbian OS for ARM processors (Raspberry Pi, Cyclone5 SoC, etc)&lt;br /&gt;
* [[ZFS]] ZFS instructions&lt;br /&gt;
* [[rPi-RT]] Real-Time kernel for Raspberry Pi&lt;br /&gt;
&lt;br /&gt;
== Misc documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[DaqVlanConfig]] VLANs for DAQ and experiments&lt;br /&gt;
* [[PcHardware]] DAQ PC Configurations&lt;br /&gt;
* [[PcRackmount]] DAQ Rackmounted Configurations&lt;br /&gt;
* [[DaqSvn]] DAQ SVN repositories and instructions (obsolete)&lt;br /&gt;
* [[Quartus]] Altera Quartus&lt;br /&gt;
* [[HADOOP]] (obsolete)&lt;br /&gt;
* [[EPICS]]&lt;br /&gt;
* [[VNC]]&lt;br /&gt;
* [[Cloning_raid1_boot_disks]]&lt;br /&gt;
* [[Setup_MIDAS_experiment]] (moved to MidasWiki)&lt;br /&gt;
* [[IEEE_MAC_TRIUMF]] IEEE MAC addresses assigned to TRIUMF&lt;br /&gt;
* [[DaqWikiManagement]] DAQWiki management&lt;br /&gt;
* [[PHYSICA]]&lt;br /&gt;
* [[ROOT]]&lt;br /&gt;
* [[MIDAS]]&lt;br /&gt;
* [[ROOTANA]] : ROOT Analyzer for MIDAS (moved to MidasWiki)&lt;br /&gt;
* [[ROODY]]&lt;br /&gt;
* [[ser2net]] USB-Serial-RS232 interface&lt;br /&gt;
* [[GIT]]&lt;br /&gt;
* [[TrdataDcache]] tradata dcache system for experimental data storage&lt;br /&gt;
* [[dhcpd_on_eth1]] Enabling dhcpd on secondary ethernet port&lt;br /&gt;
* [[nextcloud]]&lt;br /&gt;
* [[DAQ_VMs]] DAQ and experimental group VMs&lt;br /&gt;
* obsolete data acquisition software: [https://daq.triumf.ca/~daqweb/doc/susiq/ SUSIQ] [https://daq.triumf.ca/~daqweb/doc/nova/ NOVA]&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=7422</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=7422"/>
		<updated>2023-11-15T18:47:15Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: Chromium is only snap now. No point installing if we&amp;#039;re turning off snap further down.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= About Ubuntu =&lt;br /&gt;
&lt;br /&gt;
AAA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
echo server time1.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
echo server time2.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
echo server time3.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools sysstat smartmontools lm-sensors traceroute time minicom screen git lsof debsums tmux&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
yes | apt -y install flex bison&lt;br /&gt;
yes | apt -y install neofetch&lt;br /&gt;
yes | apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
yes | apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
yes | apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
yes | apt -y install mariadb-client ### mysql client&lt;br /&gt;
yes | apt -y install libz-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install ganglia-monitor&lt;br /&gt;
systemctl enable ganglia-monitor&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp etc/gmond-ubuntu.conf /etc/ganglia/gmond.conf&lt;br /&gt;
ln -s ganglia/gmond.conf /etc&lt;br /&gt;
# ln -s arm-linux-gnueabihf/ganglia /usr/lib/ganglia ### fix path for ARM CPU&lt;br /&gt;
# ln -s i386-linux-gnu/ganglia /usr/lib/ganglia ### fix path for 32-bit Intel CPU&lt;br /&gt;
systemctl restart ganglia-monitor&lt;br /&gt;
systemctl status ganglia-monitor&lt;br /&gt;
ps -efw | grep gmond&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
* apt install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
* restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
* xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
(does not work anymore!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ftp.ca.debian.org/debian/pool/main/libp/libpng/libpng12-0_1.2.50-2+deb8u2_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.50-2+deb8u2_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install 32-bit libraries for PHYSICA ==&lt;br /&gt;
&lt;br /&gt;
these instructions are for running 32-bit physica executable built for SL6 on ubuntu LTS 20.04&lt;br /&gt;
&lt;br /&gt;
install physica sources (cannot build, do not have g77)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/packages&lt;br /&gt;
git clone https://bitbucket.org/ttriumfdaq/physica.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
install 32-bit libraries using ubuntu package manager:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install lib32z1 # libz.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy 32-bit SL6 shared libraries to /lib32&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libX11.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libgd.so.2 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libpng12.so.0 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libreadline.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libncurses.so.5 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libg2c.so.0 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libxcb.so.1 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libXpm.so.4 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libjpeg.so.62 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libfontconfig.so.1 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libfreetype.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libtinfo.so.5 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libXau.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libexpat.so.1 /lib32/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ldd should report:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trinatdaq:trinat&amp;gt; ldd /usr/local/physica/physica.exe&lt;br /&gt;
	linux-gate.so.1 (0xf7fa2000)&lt;br /&gt;
	libX11.so.6 =&amp;gt; /lib32/libX11.so.6 (0xf7e43000)&lt;br /&gt;
	libgd.so.2 =&amp;gt; /lib32/libgd.so.2 (0xf7dfe000)&lt;br /&gt;
	libpng12.so.0 =&amp;gt; /lib32/libpng12.so.0 (0xf7dd6000)&lt;br /&gt;
	libz.so.1 =&amp;gt; /lib32/libz.so.1 (0xf7db8000)&lt;br /&gt;
	libreadline.so.6 =&amp;gt; /lib32/libreadline.so.6 (0xf7d7e000)&lt;br /&gt;
	libncurses.so.5 =&amp;gt; /lib32/libncurses.so.5 (0xf7d5b000)&lt;br /&gt;
	libg2c.so.0 =&amp;gt; /lib32/libg2c.so.0 (0xf7d3d000)&lt;br /&gt;
	libm.so.6 =&amp;gt; /lib32/libm.so.6 (0xf7c39000)&lt;br /&gt;
	libgcc_s.so.1 =&amp;gt; /lib32/libgcc_s.so.1 (0xf7c1a000)&lt;br /&gt;
	libc.so.6 =&amp;gt; /lib32/libc.so.6 (0xf7a2f000)&lt;br /&gt;
	libxcb.so.1 =&amp;gt; /lib32/libxcb.so.1 (0xf7a05000)&lt;br /&gt;
	libdl.so.2 =&amp;gt; /lib32/libdl.so.2 (0xf79ff000)&lt;br /&gt;
	libXpm.so.4 =&amp;gt; /lib32/libXpm.so.4 (0xf79ee000)&lt;br /&gt;
	libjpeg.so.62 =&amp;gt; /lib32/libjpeg.so.62 (0xf7997000)&lt;br /&gt;
	libfontconfig.so.1 =&amp;gt; /lib32/libfontconfig.so.1 (0xf7962000)&lt;br /&gt;
	libfreetype.so.6 =&amp;gt; /lib32/libfreetype.so.6 (0xf78c9000)&lt;br /&gt;
	libtinfo.so.5 =&amp;gt; /lib32/libtinfo.so.5 (0xf78b0000)&lt;br /&gt;
	/lib/ld-linux.so.2 (0xf7fa4000)&lt;br /&gt;
	libXau.so.6 =&amp;gt; /lib32/libXau.so.6 (0xf78ad000)&lt;br /&gt;
	libexpat.so.1 =&amp;gt; /lib32/libexpat.so.1 (0xf7885000)&lt;br /&gt;
trinatdaq:trinat&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set login environment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
setenv TRIUMF_FONTS $HOME/packages/physica/fonts&lt;br /&gt;
setenv PHYSICA_DIR $HOME/packages/physica&lt;br /&gt;
alias physica $PHYSICA_DIR/physica-SL6-32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/packages/physica&lt;br /&gt;
physica&lt;br /&gt;
@rangauss.pcm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install kubuntu-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install lxqt&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at http://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
KO - is this still needed? does it cause any security problems?&lt;br /&gt;
&lt;br /&gt;
x2go instructions, thanks to Art O.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:x2go/stable&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
#GRUB_TIMEOUT_STYLE=hidden&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reboot ==&lt;br /&gt;
&lt;br /&gt;
this completes installation of the base system.&lt;br /&gt;
&lt;br /&gt;
following sections modify basic ubuntu to fix known problems and to enable special stuff.&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full =&lt;br /&gt;
&lt;br /&gt;
!!! only if ROOT on ZFS !!!&lt;br /&gt;
&lt;br /&gt;
There is an error in the zsys package that causes bpool to run out of space,&lt;br /&gt;
see [[#Ubuntu zsys]] for more details.&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp etc/zsys.conf /etc/&lt;br /&gt;
zsysctl service reload&lt;br /&gt;
zsysctl service gc&lt;br /&gt;
zpool list bpool&lt;br /&gt;
zfs list bpool&lt;br /&gt;
df /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, debian 11) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit /etc/nsswitch.conf to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable hourly update of nis maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone http://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone http://ladd00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ONE MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
apt remove sddm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module&lt;br /&gt;
* enable new configurations&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
* apt-get update # update package list&lt;br /&gt;
* apt-get dist-upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
* apt-get autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS =&lt;br /&gt;
&lt;br /&gt;
!!! after installing all the packages, after updating the system, after updating the linux kernel, after rebooting into latest kernel !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install zfsutils-linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Follow generic ZFS instructions: [[ZFS]]&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Update Ubuntu LTS 20.04 to LTS 22.04:&lt;br /&gt;
&lt;br /&gt;
== daqubuntu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== midm9a ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daq17 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daq00 ==&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== boot from ZFS ==&lt;br /&gt;
&lt;br /&gt;
* use UEFI boot with syslinux, see here: https://daq.triumf.ca/DaqWiki/index.php/SLinstall#Configure_UEFI_boot&lt;br /&gt;
* apt install zfs-initramfs&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* ZFS structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# zfs list&lt;br /&gt;
NAME                                               USED  AVAIL     REFER  MOUNTPOINT&lt;br /&gt;
rpool                                              147G  1.62T       96K  /&lt;br /&gt;
rpool/ROOT                                        17.8G  1.62T       96K  none&lt;br /&gt;
rpool/ROOT/ubuntu_00aaaa                          17.8G  1.62T     6.22G  /&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy OS image to rpool/ROOT/ubuntu_00aaaa&lt;br /&gt;
* zfs set mountpoint=/ rpool&lt;br /&gt;
* zfs set mountpoint=none rpool/ROOT&lt;br /&gt;
* zfs set mountpoint=/ rpool/ROOT/ubuntu_00aaaa&lt;br /&gt;
* zfs get all | grep mountpoint&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rpool                     mountpoint            /                      local&lt;br /&gt;
rpool/ROOT                mountpoint            none                   local&lt;br /&gt;
rpool/ROOT/ubuntu_00aaaa  mountpoint            /                      local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in linux kernel command line (syslinux.cfg), set &amp;quot;root=&amp;quot; to &amp;quot;root=ZFS=rpool/ROOT/ubuntu_00aaaa&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== boot from ZFS mirror ==&lt;br /&gt;
&lt;br /&gt;
=== setup the EFI partitions ===&lt;br /&gt;
&lt;br /&gt;
* assuming /dev/sdb is already setup for EFI boot, setup /dev/sda the same way:&lt;br /&gt;
* partition the second boot disk same as first boot disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# gdisk -l /dev/sdb&lt;br /&gt;
Found valid GPT with protective MBR; using GPT.&lt;br /&gt;
Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
   1            2048         1050623   512.0 MiB   EF00  EFI system partition&lt;br /&gt;
   2         1050624      3907029134   1.8 TiB     8300  Linux filesystem&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkfs.msdos /dev/sdX1&lt;br /&gt;
* create mount points&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/fstab&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1 &lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
* df | grep boot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# df | grep boot&lt;br /&gt;
/dev/sdb1                    523248    98100     425148  19% /boot/efi-sdb&lt;br /&gt;
/dev/sda1                    523248        4     523244   1% /boot/efi-sda&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy boot files to new boot disk&lt;br /&gt;
* cd /boot/efi-sdX; rsync -av . /boot/efi-sdY&lt;br /&gt;
* set BIOS to boot from &amp;quot;UEFI Hard drive&amp;quot;, disable legacy boot (except for booting from USB key in legacy mode)&lt;br /&gt;
* if using UEFI boot syslinux per these instructions, linux kernel update has to be done manually:&lt;br /&gt;
* run ~/git/scripts/etc/update_efi_mirror.perl, follow instructions that it prints.&lt;br /&gt;
&lt;br /&gt;
=== setup zfs partitions ===&lt;br /&gt;
&lt;br /&gt;
use partitions compatible with Ubuntu &amp;quot;install on ZFS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* gdisk &amp;quot;o&amp;quot; to create new GPT partition table&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +512M ef00 to create EFI partition&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +2G 8200 to create linux swap partition (not used)&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +2G BE00 to create ZFS bpool partition&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; xxx BF00 create ZFS rpool partition&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# gdisk -l /dev/sda&lt;br /&gt;
Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
   1            2048         1050623   512.0 MiB   EF00  EFI System Partition&lt;br /&gt;
   2         1050624         5244927   2.0 GiB     8200  &lt;br /&gt;
   3         5244928         9439231   2.0 GiB     BE00  &lt;br /&gt;
   4         9439232       234441614   107.3 GiB   BF00  &lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup zfs mirror ===&lt;br /&gt;
&lt;br /&gt;
* see here: https://daq.triumf.ca/DaqWiki/index.php/ZFS#Convert_pool_from_single_to_mirror&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Feb 19 16:47 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801081-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Feb 19 16:47 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801101-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: none requested&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                             STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                            ONLINE       0     0     0&lt;br /&gt;
          ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool attach rpool ata-WDC_WDS200T2B0A-00SM50_205007801101-part2 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801081-part2&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
        continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Feb 19 16:54:39 2021&lt;br /&gt;
        12.6G scanned at 3.16G/s, 1.02G issued at 262M/s, 12.6G total&lt;br /&gt;
        1.02G resilvered, 8.09% done, 0 days 00:00:45 to go&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                               STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                              ONLINE       0     0     0&lt;br /&gt;
          mirror-0                                         ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801081-part2  ONLINE       0     0     0  (resilvering)&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 12.7G in 0 days 00:00:40 with 0 errors on Fri Feb 19 16:55:19 2021&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                               STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                              ONLINE       0     0     0&lt;br /&gt;
          mirror-0                                         ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801081-part2  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part3&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part3 -&amp;gt; ../../sda3&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3 -&amp;gt; ../../sdb3&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable booting from second SSD: (instead of /dev/sda1, /dev/sdb1, use UUID=xxx)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm9b:~# echo &amp;quot;/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
root@midm9b:~# echo &amp;quot;/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (ISC dhcpd or dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup tftp, pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings&lt;br /&gt;
#port=0 # disable DNS function&lt;br /&gt;
port=53 # enable DNS function&lt;br /&gt;
domain-needed&lt;br /&gt;
bogus-priv&lt;br /&gt;
no-resolv&lt;br /&gt;
server=142.90.100.19&lt;br /&gt;
# DHCP settings&lt;br /&gt;
interface=enp1s0f0 # DHCP interface&lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite&lt;br /&gt;
dhcp-range=192.168.1.0,static&lt;br /&gt;
#log-dhcp&lt;br /&gt;
quiet-dhcp&lt;br /&gt;
#dhcp-ignore=tag:!known&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
#dhcp-host=ac:1f:6b:9e:7f:4a,192.168.1.100,10m&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
# TFTP settings&lt;br /&gt;
enable-tftp&lt;br /&gt;
tftp-root=/tftpboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /zssd/tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* rm /etc/resolv.conf&lt;br /&gt;
* create new /etc/resolv.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameserver 127.0.0.1&lt;br /&gt;
search snolab.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* configure and enable chronyd per instructions above&lt;br /&gt;
* echo &amp;quot;allow 192.168.1.0/24&amp;quot; &amp;gt; /etc/chrony/conf.d/allow-localhost.conf&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
* zfs create zssd/nfsroot&lt;br /&gt;
* zfs set dedup=verify zssd/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /zssd/nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /zssd/nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /zssd/nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libgcc-9-dev-arm64-cross&lt;br /&gt;
apt install gcc-arm-linux-gnueabi&lt;br /&gt;
apt install gcc-arm-linux-gnueabihf&lt;br /&gt;
apt install g++-arm-linux-gnueabihf&lt;br /&gt;
apt install g++-arm-linux-gnueabi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabi-gcc -o ttcp1 ttcp.c -march=armv7 -static&lt;br /&gt;
arm-linux-gnueabi-gcc -o memcpy.armv7 memcpy.cc -march=armv7 -static -O2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for MIDAS, use &amp;quot;make linux32&amp;quot;&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=7421</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=7421"/>
		<updated>2023-11-15T18:43:57Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: 22.04 doesn&amp;#039;t have python3.8 or python&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= About Ubuntu =&lt;br /&gt;
&lt;br /&gt;
AAA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
echo server time1.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
echo server time2.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
echo server time3.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools sysstat smartmontools lm-sensors traceroute time minicom screen git lsof debsums tmux&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
yes | apt -y install flex bison&lt;br /&gt;
yes | apt -y install neofetch&lt;br /&gt;
yes | apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
yes | apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
yes | apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
yes | apt -y install mariadb-client ### mysql client&lt;br /&gt;
yes | apt -y install libz-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install chromium-browser chromium-codecs-ffmpeg-extra&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install ganglia-monitor&lt;br /&gt;
systemctl enable ganglia-monitor&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp etc/gmond-ubuntu.conf /etc/ganglia/gmond.conf&lt;br /&gt;
ln -s ganglia/gmond.conf /etc&lt;br /&gt;
# ln -s arm-linux-gnueabihf/ganglia /usr/lib/ganglia ### fix path for ARM CPU&lt;br /&gt;
# ln -s i386-linux-gnu/ganglia /usr/lib/ganglia ### fix path for 32-bit Intel CPU&lt;br /&gt;
systemctl restart ganglia-monitor&lt;br /&gt;
systemctl status ganglia-monitor&lt;br /&gt;
ps -efw | grep gmond&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
* apt install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
* restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
* xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
(does not work anymore!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ftp.ca.debian.org/debian/pool/main/libp/libpng/libpng12-0_1.2.50-2+deb8u2_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.50-2+deb8u2_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install 32-bit libraries for PHYSICA ==&lt;br /&gt;
&lt;br /&gt;
these instructions are for running 32-bit physica executable built for SL6 on ubuntu LTS 20.04&lt;br /&gt;
&lt;br /&gt;
install physica sources (cannot build, do not have g77)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/packages&lt;br /&gt;
git clone https://bitbucket.org/ttriumfdaq/physica.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
install 32-bit libraries using ubuntu package manager:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install lib32z1 # libz.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy 32-bit SL6 shared libraries to /lib32&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libX11.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libgd.so.2 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libpng12.so.0 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libreadline.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libncurses.so.5 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libg2c.so.0 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libxcb.so.1 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libXpm.so.4 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libjpeg.so.62 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libfontconfig.so.1 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libfreetype.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libtinfo.so.5 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libXau.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libexpat.so.1 /lib32/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ldd should report:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trinatdaq:trinat&amp;gt; ldd /usr/local/physica/physica.exe&lt;br /&gt;
	linux-gate.so.1 (0xf7fa2000)&lt;br /&gt;
	libX11.so.6 =&amp;gt; /lib32/libX11.so.6 (0xf7e43000)&lt;br /&gt;
	libgd.so.2 =&amp;gt; /lib32/libgd.so.2 (0xf7dfe000)&lt;br /&gt;
	libpng12.so.0 =&amp;gt; /lib32/libpng12.so.0 (0xf7dd6000)&lt;br /&gt;
	libz.so.1 =&amp;gt; /lib32/libz.so.1 (0xf7db8000)&lt;br /&gt;
	libreadline.so.6 =&amp;gt; /lib32/libreadline.so.6 (0xf7d7e000)&lt;br /&gt;
	libncurses.so.5 =&amp;gt; /lib32/libncurses.so.5 (0xf7d5b000)&lt;br /&gt;
	libg2c.so.0 =&amp;gt; /lib32/libg2c.so.0 (0xf7d3d000)&lt;br /&gt;
	libm.so.6 =&amp;gt; /lib32/libm.so.6 (0xf7c39000)&lt;br /&gt;
	libgcc_s.so.1 =&amp;gt; /lib32/libgcc_s.so.1 (0xf7c1a000)&lt;br /&gt;
	libc.so.6 =&amp;gt; /lib32/libc.so.6 (0xf7a2f000)&lt;br /&gt;
	libxcb.so.1 =&amp;gt; /lib32/libxcb.so.1 (0xf7a05000)&lt;br /&gt;
	libdl.so.2 =&amp;gt; /lib32/libdl.so.2 (0xf79ff000)&lt;br /&gt;
	libXpm.so.4 =&amp;gt; /lib32/libXpm.so.4 (0xf79ee000)&lt;br /&gt;
	libjpeg.so.62 =&amp;gt; /lib32/libjpeg.so.62 (0xf7997000)&lt;br /&gt;
	libfontconfig.so.1 =&amp;gt; /lib32/libfontconfig.so.1 (0xf7962000)&lt;br /&gt;
	libfreetype.so.6 =&amp;gt; /lib32/libfreetype.so.6 (0xf78c9000)&lt;br /&gt;
	libtinfo.so.5 =&amp;gt; /lib32/libtinfo.so.5 (0xf78b0000)&lt;br /&gt;
	/lib/ld-linux.so.2 (0xf7fa4000)&lt;br /&gt;
	libXau.so.6 =&amp;gt; /lib32/libXau.so.6 (0xf78ad000)&lt;br /&gt;
	libexpat.so.1 =&amp;gt; /lib32/libexpat.so.1 (0xf7885000)&lt;br /&gt;
trinatdaq:trinat&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set login environment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
setenv TRIUMF_FONTS $HOME/packages/physica/fonts&lt;br /&gt;
setenv PHYSICA_DIR $HOME/packages/physica&lt;br /&gt;
alias physica $PHYSICA_DIR/physica-SL6-32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/packages/physica&lt;br /&gt;
physica&lt;br /&gt;
@rangauss.pcm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install kubuntu-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install lxqt&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at http://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
KO - is this still needed? does it cause any security problems?&lt;br /&gt;
&lt;br /&gt;
x2go instructions, thanks to Art O.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:x2go/stable&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
#GRUB_TIMEOUT_STYLE=hidden&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reboot ==&lt;br /&gt;
&lt;br /&gt;
this completes installation of the base system.&lt;br /&gt;
&lt;br /&gt;
following sections modify basic ubuntu to fix known problems and to enable special stuff.&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full =&lt;br /&gt;
&lt;br /&gt;
!!! only if ROOT on ZFS !!!&lt;br /&gt;
&lt;br /&gt;
There is an error in the zsys package that causes bpool to run out of space,&lt;br /&gt;
see [[#Ubuntu zsys]] for more details.&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp etc/zsys.conf /etc/&lt;br /&gt;
zsysctl service reload&lt;br /&gt;
zsysctl service gc&lt;br /&gt;
zpool list bpool&lt;br /&gt;
zfs list bpool&lt;br /&gt;
df /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, debian 11) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit /etc/nsswitch.conf to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable hourly update of nis maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone http://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone http://ladd00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ONE MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
apt remove sddm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module&lt;br /&gt;
* enable new configurations&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
* apt-get update # update package list&lt;br /&gt;
* apt-get dist-upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
* apt-get autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS =&lt;br /&gt;
&lt;br /&gt;
!!! after installing all the packages, after updating the system, after updating the linux kernel, after rebooting into latest kernel !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install zfsutils-linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Follow generic ZFS instructions: [[ZFS]]&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Update Ubuntu LTS 20.04 to LTS 22.04:&lt;br /&gt;
&lt;br /&gt;
== daqubuntu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== midm9a ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daq17 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daq00 ==&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== boot from ZFS ==&lt;br /&gt;
&lt;br /&gt;
* use UEFI boot with syslinux, see here: https://daq.triumf.ca/DaqWiki/index.php/SLinstall#Configure_UEFI_boot&lt;br /&gt;
* apt install zfs-initramfs&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* ZFS structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# zfs list&lt;br /&gt;
NAME                                               USED  AVAIL     REFER  MOUNTPOINT&lt;br /&gt;
rpool                                              147G  1.62T       96K  /&lt;br /&gt;
rpool/ROOT                                        17.8G  1.62T       96K  none&lt;br /&gt;
rpool/ROOT/ubuntu_00aaaa                          17.8G  1.62T     6.22G  /&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy OS image to rpool/ROOT/ubuntu_00aaaa&lt;br /&gt;
* zfs set mountpoint=/ rpool&lt;br /&gt;
* zfs set mountpoint=none rpool/ROOT&lt;br /&gt;
* zfs set mountpoint=/ rpool/ROOT/ubuntu_00aaaa&lt;br /&gt;
* zfs get all | grep mountpoint&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rpool                     mountpoint            /                      local&lt;br /&gt;
rpool/ROOT                mountpoint            none                   local&lt;br /&gt;
rpool/ROOT/ubuntu_00aaaa  mountpoint            /                      local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in linux kernel command line (syslinux.cfg), set &amp;quot;root=&amp;quot; to &amp;quot;root=ZFS=rpool/ROOT/ubuntu_00aaaa&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== boot from ZFS mirror ==&lt;br /&gt;
&lt;br /&gt;
=== setup the EFI partitions ===&lt;br /&gt;
&lt;br /&gt;
* assuming /dev/sdb is already setup for EFI boot, setup /dev/sda the same way:&lt;br /&gt;
* partition the second boot disk same as first boot disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# gdisk -l /dev/sdb&lt;br /&gt;
Found valid GPT with protective MBR; using GPT.&lt;br /&gt;
Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
   1            2048         1050623   512.0 MiB   EF00  EFI system partition&lt;br /&gt;
   2         1050624      3907029134   1.8 TiB     8300  Linux filesystem&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkfs.msdos /dev/sdX1&lt;br /&gt;
* create mount points&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/fstab&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1 &lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
* df | grep boot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# df | grep boot&lt;br /&gt;
/dev/sdb1                    523248    98100     425148  19% /boot/efi-sdb&lt;br /&gt;
/dev/sda1                    523248        4     523244   1% /boot/efi-sda&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy boot files to new boot disk&lt;br /&gt;
* cd /boot/efi-sdX; rsync -av . /boot/efi-sdY&lt;br /&gt;
* set BIOS to boot from &amp;quot;UEFI Hard drive&amp;quot;, disable legacy boot (except for booting from USB key in legacy mode)&lt;br /&gt;
* if using UEFI boot syslinux per these instructions, linux kernel update has to be done manually:&lt;br /&gt;
* run ~/git/scripts/etc/update_efi_mirror.perl, follow instructions that it prints.&lt;br /&gt;
&lt;br /&gt;
=== setup zfs partitions ===&lt;br /&gt;
&lt;br /&gt;
use partitions compatible with Ubuntu &amp;quot;install on ZFS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* gdisk &amp;quot;o&amp;quot; to create new GPT partition table&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +512M ef00 to create EFI partition&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +2G 8200 to create linux swap partition (not used)&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +2G BE00 to create ZFS bpool partition&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; xxx BF00 create ZFS rpool partition&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# gdisk -l /dev/sda&lt;br /&gt;
Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
   1            2048         1050623   512.0 MiB   EF00  EFI System Partition&lt;br /&gt;
   2         1050624         5244927   2.0 GiB     8200  &lt;br /&gt;
   3         5244928         9439231   2.0 GiB     BE00  &lt;br /&gt;
   4         9439232       234441614   107.3 GiB   BF00  &lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup zfs mirror ===&lt;br /&gt;
&lt;br /&gt;
* see here: https://daq.triumf.ca/DaqWiki/index.php/ZFS#Convert_pool_from_single_to_mirror&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Feb 19 16:47 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801081-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Feb 19 16:47 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801101-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: none requested&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                             STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                            ONLINE       0     0     0&lt;br /&gt;
          ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool attach rpool ata-WDC_WDS200T2B0A-00SM50_205007801101-part2 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801081-part2&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
        continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Feb 19 16:54:39 2021&lt;br /&gt;
        12.6G scanned at 3.16G/s, 1.02G issued at 262M/s, 12.6G total&lt;br /&gt;
        1.02G resilvered, 8.09% done, 0 days 00:00:45 to go&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                               STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                              ONLINE       0     0     0&lt;br /&gt;
          mirror-0                                         ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801081-part2  ONLINE       0     0     0  (resilvering)&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 12.7G in 0 days 00:00:40 with 0 errors on Fri Feb 19 16:55:19 2021&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                               STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                              ONLINE       0     0     0&lt;br /&gt;
          mirror-0                                         ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801081-part2  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part3&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part3 -&amp;gt; ../../sda3&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3 -&amp;gt; ../../sdb3&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable booting from second SSD: (instead of /dev/sda1, /dev/sdb1, use UUID=xxx)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm9b:~# echo &amp;quot;/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
root@midm9b:~# echo &amp;quot;/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (ISC dhcpd or dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup tftp, pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings&lt;br /&gt;
#port=0 # disable DNS function&lt;br /&gt;
port=53 # enable DNS function&lt;br /&gt;
domain-needed&lt;br /&gt;
bogus-priv&lt;br /&gt;
no-resolv&lt;br /&gt;
server=142.90.100.19&lt;br /&gt;
# DHCP settings&lt;br /&gt;
interface=enp1s0f0 # DHCP interface&lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite&lt;br /&gt;
dhcp-range=192.168.1.0,static&lt;br /&gt;
#log-dhcp&lt;br /&gt;
quiet-dhcp&lt;br /&gt;
#dhcp-ignore=tag:!known&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
#dhcp-host=ac:1f:6b:9e:7f:4a,192.168.1.100,10m&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
# TFTP settings&lt;br /&gt;
enable-tftp&lt;br /&gt;
tftp-root=/tftpboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /zssd/tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* rm /etc/resolv.conf&lt;br /&gt;
* create new /etc/resolv.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameserver 127.0.0.1&lt;br /&gt;
search snolab.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* configure and enable chronyd per instructions above&lt;br /&gt;
* echo &amp;quot;allow 192.168.1.0/24&amp;quot; &amp;gt; /etc/chrony/conf.d/allow-localhost.conf&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
* zfs create zssd/nfsroot&lt;br /&gt;
* zfs set dedup=verify zssd/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /zssd/nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /zssd/nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /zssd/nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libgcc-9-dev-arm64-cross&lt;br /&gt;
apt install gcc-arm-linux-gnueabi&lt;br /&gt;
apt install gcc-arm-linux-gnueabihf&lt;br /&gt;
apt install g++-arm-linux-gnueabihf&lt;br /&gt;
apt install g++-arm-linux-gnueabi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabi-gcc -o ttcp1 ttcp.c -march=armv7 -static&lt;br /&gt;
arm-linux-gnueabi-gcc -o memcpy.armv7 memcpy.cc -march=armv7 -static -O2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for MIDAS, use &amp;quot;make linux32&amp;quot;&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=7420</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=7420"/>
		<updated>2023-11-11T00:01:29Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: /* move /home/wheel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= About Ubuntu =&lt;br /&gt;
&lt;br /&gt;
AAA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
echo server time1.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
echo server time2.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
echo server time3.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools sysstat smartmontools lm-sensors traceroute time minicom screen git lsof debsums tmux&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
yes | apt -y install flex bison&lt;br /&gt;
yes | apt -y install neofetch&lt;br /&gt;
yes | apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
yes | apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
yes | apt -y install python&lt;br /&gt;
yes | apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
yes | apt -y install mariadb-client ### mysql client&lt;br /&gt;
yes | apt -y install libz-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install chromium-browser chromium-codecs-ffmpeg-extra&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3.8-full python3.8-dev python3.8-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install ganglia-monitor&lt;br /&gt;
systemctl enable ganglia-monitor&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp etc/gmond-ubuntu.conf /etc/ganglia/gmond.conf&lt;br /&gt;
ln -s ganglia/gmond.conf /etc&lt;br /&gt;
# ln -s arm-linux-gnueabihf/ganglia /usr/lib/ganglia ### fix path for ARM CPU&lt;br /&gt;
# ln -s i386-linux-gnu/ganglia /usr/lib/ganglia ### fix path for 32-bit Intel CPU&lt;br /&gt;
systemctl restart ganglia-monitor&lt;br /&gt;
systemctl status ganglia-monitor&lt;br /&gt;
ps -efw | grep gmond&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
* apt install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
* restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
* xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
(does not work anymore!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ftp.ca.debian.org/debian/pool/main/libp/libpng/libpng12-0_1.2.50-2+deb8u2_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.50-2+deb8u2_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install 32-bit libraries for PHYSICA ==&lt;br /&gt;
&lt;br /&gt;
these instructions are for running 32-bit physica executable built for SL6 on ubuntu LTS 20.04&lt;br /&gt;
&lt;br /&gt;
install physica sources (cannot build, do not have g77)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/packages&lt;br /&gt;
git clone https://bitbucket.org/ttriumfdaq/physica.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
install 32-bit libraries using ubuntu package manager:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install lib32z1 # libz.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy 32-bit SL6 shared libraries to /lib32&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libX11.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libgd.so.2 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libpng12.so.0 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libreadline.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libncurses.so.5 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libg2c.so.0 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libxcb.so.1 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libXpm.so.4 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libjpeg.so.62 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libfontconfig.so.1 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libfreetype.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libtinfo.so.5 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libXau.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libexpat.so.1 /lib32/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ldd should report:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trinatdaq:trinat&amp;gt; ldd /usr/local/physica/physica.exe&lt;br /&gt;
	linux-gate.so.1 (0xf7fa2000)&lt;br /&gt;
	libX11.so.6 =&amp;gt; /lib32/libX11.so.6 (0xf7e43000)&lt;br /&gt;
	libgd.so.2 =&amp;gt; /lib32/libgd.so.2 (0xf7dfe000)&lt;br /&gt;
	libpng12.so.0 =&amp;gt; /lib32/libpng12.so.0 (0xf7dd6000)&lt;br /&gt;
	libz.so.1 =&amp;gt; /lib32/libz.so.1 (0xf7db8000)&lt;br /&gt;
	libreadline.so.6 =&amp;gt; /lib32/libreadline.so.6 (0xf7d7e000)&lt;br /&gt;
	libncurses.so.5 =&amp;gt; /lib32/libncurses.so.5 (0xf7d5b000)&lt;br /&gt;
	libg2c.so.0 =&amp;gt; /lib32/libg2c.so.0 (0xf7d3d000)&lt;br /&gt;
	libm.so.6 =&amp;gt; /lib32/libm.so.6 (0xf7c39000)&lt;br /&gt;
	libgcc_s.so.1 =&amp;gt; /lib32/libgcc_s.so.1 (0xf7c1a000)&lt;br /&gt;
	libc.so.6 =&amp;gt; /lib32/libc.so.6 (0xf7a2f000)&lt;br /&gt;
	libxcb.so.1 =&amp;gt; /lib32/libxcb.so.1 (0xf7a05000)&lt;br /&gt;
	libdl.so.2 =&amp;gt; /lib32/libdl.so.2 (0xf79ff000)&lt;br /&gt;
	libXpm.so.4 =&amp;gt; /lib32/libXpm.so.4 (0xf79ee000)&lt;br /&gt;
	libjpeg.so.62 =&amp;gt; /lib32/libjpeg.so.62 (0xf7997000)&lt;br /&gt;
	libfontconfig.so.1 =&amp;gt; /lib32/libfontconfig.so.1 (0xf7962000)&lt;br /&gt;
	libfreetype.so.6 =&amp;gt; /lib32/libfreetype.so.6 (0xf78c9000)&lt;br /&gt;
	libtinfo.so.5 =&amp;gt; /lib32/libtinfo.so.5 (0xf78b0000)&lt;br /&gt;
	/lib/ld-linux.so.2 (0xf7fa4000)&lt;br /&gt;
	libXau.so.6 =&amp;gt; /lib32/libXau.so.6 (0xf78ad000)&lt;br /&gt;
	libexpat.so.1 =&amp;gt; /lib32/libexpat.so.1 (0xf7885000)&lt;br /&gt;
trinatdaq:trinat&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set login environment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
setenv TRIUMF_FONTS $HOME/packages/physica/fonts&lt;br /&gt;
setenv PHYSICA_DIR $HOME/packages/physica&lt;br /&gt;
alias physica $PHYSICA_DIR/physica-SL6-32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/packages/physica&lt;br /&gt;
physica&lt;br /&gt;
@rangauss.pcm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install kubuntu-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install lxqt&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at http://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
KO - is this still needed? does it cause any security problems?&lt;br /&gt;
&lt;br /&gt;
x2go instructions, thanks to Art O.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:x2go/stable&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
#GRUB_TIMEOUT_STYLE=hidden&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reboot ==&lt;br /&gt;
&lt;br /&gt;
this completes installation of the base system.&lt;br /&gt;
&lt;br /&gt;
following sections modify basic ubuntu to fix known problems and to enable special stuff.&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full =&lt;br /&gt;
&lt;br /&gt;
!!! only if ROOT on ZFS !!!&lt;br /&gt;
&lt;br /&gt;
There is an error in the zsys package that causes bpool to run out of space,&lt;br /&gt;
see [[#Ubuntu zsys]] for more details.&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp etc/zsys.conf /etc/&lt;br /&gt;
zsysctl service reload&lt;br /&gt;
zsysctl service gc&lt;br /&gt;
zpool list bpool&lt;br /&gt;
zfs list bpool&lt;br /&gt;
df /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, debian 11) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit /etc/nsswitch.conf to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable hourly update of nis maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone http://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone http://ladd00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ONE MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
apt remove sddm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module&lt;br /&gt;
* enable new configurations&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
* apt-get update # update package list&lt;br /&gt;
* apt-get dist-upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
* apt-get autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS =&lt;br /&gt;
&lt;br /&gt;
!!! after installing all the packages, after updating the system, after updating the linux kernel, after rebooting into latest kernel !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install zfsutils-linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Follow generic ZFS instructions: [[ZFS]]&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Update Ubuntu LTS 20.04 to LTS 22.04:&lt;br /&gt;
&lt;br /&gt;
== daqubuntu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== midm9a ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daq17 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daq00 ==&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== boot from ZFS ==&lt;br /&gt;
&lt;br /&gt;
* use UEFI boot with syslinux, see here: https://daq.triumf.ca/DaqWiki/index.php/SLinstall#Configure_UEFI_boot&lt;br /&gt;
* apt install zfs-initramfs&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* ZFS structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# zfs list&lt;br /&gt;
NAME                                               USED  AVAIL     REFER  MOUNTPOINT&lt;br /&gt;
rpool                                              147G  1.62T       96K  /&lt;br /&gt;
rpool/ROOT                                        17.8G  1.62T       96K  none&lt;br /&gt;
rpool/ROOT/ubuntu_00aaaa                          17.8G  1.62T     6.22G  /&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy OS image to rpool/ROOT/ubuntu_00aaaa&lt;br /&gt;
* zfs set mountpoint=/ rpool&lt;br /&gt;
* zfs set mountpoint=none rpool/ROOT&lt;br /&gt;
* zfs set mountpoint=/ rpool/ROOT/ubuntu_00aaaa&lt;br /&gt;
* zfs get all | grep mountpoint&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rpool                     mountpoint            /                      local&lt;br /&gt;
rpool/ROOT                mountpoint            none                   local&lt;br /&gt;
rpool/ROOT/ubuntu_00aaaa  mountpoint            /                      local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in linux kernel command line (syslinux.cfg), set &amp;quot;root=&amp;quot; to &amp;quot;root=ZFS=rpool/ROOT/ubuntu_00aaaa&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== boot from ZFS mirror ==&lt;br /&gt;
&lt;br /&gt;
=== setup the EFI partitions ===&lt;br /&gt;
&lt;br /&gt;
* assuming /dev/sdb is already setup for EFI boot, setup /dev/sda the same way:&lt;br /&gt;
* partition the second boot disk same as first boot disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# gdisk -l /dev/sdb&lt;br /&gt;
Found valid GPT with protective MBR; using GPT.&lt;br /&gt;
Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
   1            2048         1050623   512.0 MiB   EF00  EFI system partition&lt;br /&gt;
   2         1050624      3907029134   1.8 TiB     8300  Linux filesystem&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkfs.msdos /dev/sdX1&lt;br /&gt;
* create mount points&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/fstab&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1 &lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
* df | grep boot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# df | grep boot&lt;br /&gt;
/dev/sdb1                    523248    98100     425148  19% /boot/efi-sdb&lt;br /&gt;
/dev/sda1                    523248        4     523244   1% /boot/efi-sda&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy boot files to new boot disk&lt;br /&gt;
* cd /boot/efi-sdX; rsync -av . /boot/efi-sdY&lt;br /&gt;
* set BIOS to boot from &amp;quot;UEFI Hard drive&amp;quot;, disable legacy boot (except for booting from USB key in legacy mode)&lt;br /&gt;
* if using UEFI boot syslinux per these instructions, linux kernel update has to be done manually:&lt;br /&gt;
* run ~/git/scripts/etc/update_efi_mirror.perl, follow instructions that it prints.&lt;br /&gt;
&lt;br /&gt;
=== setup zfs partitions ===&lt;br /&gt;
&lt;br /&gt;
use partitions compatible with Ubuntu &amp;quot;install on ZFS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* gdisk &amp;quot;o&amp;quot; to create new GPT partition table&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +512M ef00 to create EFI partition&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +2G 8200 to create linux swap partition (not used)&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +2G BE00 to create ZFS bpool partition&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; xxx BF00 create ZFS rpool partition&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# gdisk -l /dev/sda&lt;br /&gt;
Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
   1            2048         1050623   512.0 MiB   EF00  EFI System Partition&lt;br /&gt;
   2         1050624         5244927   2.0 GiB     8200  &lt;br /&gt;
   3         5244928         9439231   2.0 GiB     BE00  &lt;br /&gt;
   4         9439232       234441614   107.3 GiB   BF00  &lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup zfs mirror ===&lt;br /&gt;
&lt;br /&gt;
* see here: https://daq.triumf.ca/DaqWiki/index.php/ZFS#Convert_pool_from_single_to_mirror&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Feb 19 16:47 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801081-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Feb 19 16:47 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801101-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: none requested&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                             STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                            ONLINE       0     0     0&lt;br /&gt;
          ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool attach rpool ata-WDC_WDS200T2B0A-00SM50_205007801101-part2 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801081-part2&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
        continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Feb 19 16:54:39 2021&lt;br /&gt;
        12.6G scanned at 3.16G/s, 1.02G issued at 262M/s, 12.6G total&lt;br /&gt;
        1.02G resilvered, 8.09% done, 0 days 00:00:45 to go&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                               STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                              ONLINE       0     0     0&lt;br /&gt;
          mirror-0                                         ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801081-part2  ONLINE       0     0     0  (resilvering)&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 12.7G in 0 days 00:00:40 with 0 errors on Fri Feb 19 16:55:19 2021&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                               STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                              ONLINE       0     0     0&lt;br /&gt;
          mirror-0                                         ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801081-part2  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part3&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part3 -&amp;gt; ../../sda3&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3 -&amp;gt; ../../sdb3&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable booting from second SSD: (instead of /dev/sda1, /dev/sdb1, use UUID=xxx)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm9b:~# echo &amp;quot;/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
root@midm9b:~# echo &amp;quot;/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (ISC dhcpd or dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup tftp, pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings&lt;br /&gt;
#port=0 # disable DNS function&lt;br /&gt;
port=53 # enable DNS function&lt;br /&gt;
domain-needed&lt;br /&gt;
bogus-priv&lt;br /&gt;
no-resolv&lt;br /&gt;
server=142.90.100.19&lt;br /&gt;
# DHCP settings&lt;br /&gt;
interface=enp1s0f0 # DHCP interface&lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite&lt;br /&gt;
dhcp-range=192.168.1.0,static&lt;br /&gt;
#log-dhcp&lt;br /&gt;
quiet-dhcp&lt;br /&gt;
#dhcp-ignore=tag:!known&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
#dhcp-host=ac:1f:6b:9e:7f:4a,192.168.1.100,10m&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
# TFTP settings&lt;br /&gt;
enable-tftp&lt;br /&gt;
tftp-root=/tftpboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /zssd/tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* rm /etc/resolv.conf&lt;br /&gt;
* create new /etc/resolv.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameserver 127.0.0.1&lt;br /&gt;
search snolab.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* configure and enable chronyd per instructions above&lt;br /&gt;
* echo &amp;quot;allow 192.168.1.0/24&amp;quot; &amp;gt; /etc/chrony/conf.d/allow-localhost.conf&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
* zfs create zssd/nfsroot&lt;br /&gt;
* zfs set dedup=verify zssd/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /zssd/nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /zssd/nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /zssd/nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libgcc-9-dev-arm64-cross&lt;br /&gt;
apt install gcc-arm-linux-gnueabi&lt;br /&gt;
apt install gcc-arm-linux-gnueabihf&lt;br /&gt;
apt install g++-arm-linux-gnueabihf&lt;br /&gt;
apt install g++-arm-linux-gnueabi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabi-gcc -o ttcp1 ttcp.c -march=armv7 -static&lt;br /&gt;
arm-linux-gnueabi-gcc -o memcpy.armv7 memcpy.cc -march=armv7 -static -O2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for MIDAS, use &amp;quot;make linux32&amp;quot;&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=7419</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=7419"/>
		<updated>2023-11-10T22:31:49Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: /* Convert from single to dual mirrored ZFS SSD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= About Ubuntu =&lt;br /&gt;
&lt;br /&gt;
AAA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
echo server time1.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
echo server time2.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
echo server time3.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools sysstat smartmontools lm-sensors traceroute time minicom screen git lsof debsums tmux&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
yes | apt -y install flex bison&lt;br /&gt;
yes | apt -y install neofetch&lt;br /&gt;
yes | apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
yes | apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
yes | apt -y install python&lt;br /&gt;
yes | apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
yes | apt -y install mariadb-client ### mysql client&lt;br /&gt;
yes | apt -y install libz-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install chromium-browser chromium-codecs-ffmpeg-extra&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3.8-full python3.8-dev python3.8-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install ganglia-monitor&lt;br /&gt;
systemctl enable ganglia-monitor&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp etc/gmond-ubuntu.conf /etc/ganglia/gmond.conf&lt;br /&gt;
ln -s ganglia/gmond.conf /etc&lt;br /&gt;
# ln -s arm-linux-gnueabihf/ganglia /usr/lib/ganglia ### fix path for ARM CPU&lt;br /&gt;
# ln -s i386-linux-gnu/ganglia /usr/lib/ganglia ### fix path for 32-bit Intel CPU&lt;br /&gt;
systemctl restart ganglia-monitor&lt;br /&gt;
systemctl status ganglia-monitor&lt;br /&gt;
ps -efw | grep gmond&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
* apt install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
* restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
* xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
(does not work anymore!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ftp.ca.debian.org/debian/pool/main/libp/libpng/libpng12-0_1.2.50-2+deb8u2_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.50-2+deb8u2_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install 32-bit libraries for PHYSICA ==&lt;br /&gt;
&lt;br /&gt;
these instructions are for running 32-bit physica executable built for SL6 on ubuntu LTS 20.04&lt;br /&gt;
&lt;br /&gt;
install physica sources (cannot build, do not have g77)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/packages&lt;br /&gt;
git clone https://bitbucket.org/ttriumfdaq/physica.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
install 32-bit libraries using ubuntu package manager:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install lib32z1 # libz.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy 32-bit SL6 shared libraries to /lib32&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libX11.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libgd.so.2 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libpng12.so.0 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libreadline.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libncurses.so.5 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libg2c.so.0 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libxcb.so.1 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libXpm.so.4 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libjpeg.so.62 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libfontconfig.so.1 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libfreetype.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libtinfo.so.5 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libXau.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libexpat.so.1 /lib32/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ldd should report:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trinatdaq:trinat&amp;gt; ldd /usr/local/physica/physica.exe&lt;br /&gt;
	linux-gate.so.1 (0xf7fa2000)&lt;br /&gt;
	libX11.so.6 =&amp;gt; /lib32/libX11.so.6 (0xf7e43000)&lt;br /&gt;
	libgd.so.2 =&amp;gt; /lib32/libgd.so.2 (0xf7dfe000)&lt;br /&gt;
	libpng12.so.0 =&amp;gt; /lib32/libpng12.so.0 (0xf7dd6000)&lt;br /&gt;
	libz.so.1 =&amp;gt; /lib32/libz.so.1 (0xf7db8000)&lt;br /&gt;
	libreadline.so.6 =&amp;gt; /lib32/libreadline.so.6 (0xf7d7e000)&lt;br /&gt;
	libncurses.so.5 =&amp;gt; /lib32/libncurses.so.5 (0xf7d5b000)&lt;br /&gt;
	libg2c.so.0 =&amp;gt; /lib32/libg2c.so.0 (0xf7d3d000)&lt;br /&gt;
	libm.so.6 =&amp;gt; /lib32/libm.so.6 (0xf7c39000)&lt;br /&gt;
	libgcc_s.so.1 =&amp;gt; /lib32/libgcc_s.so.1 (0xf7c1a000)&lt;br /&gt;
	libc.so.6 =&amp;gt; /lib32/libc.so.6 (0xf7a2f000)&lt;br /&gt;
	libxcb.so.1 =&amp;gt; /lib32/libxcb.so.1 (0xf7a05000)&lt;br /&gt;
	libdl.so.2 =&amp;gt; /lib32/libdl.so.2 (0xf79ff000)&lt;br /&gt;
	libXpm.so.4 =&amp;gt; /lib32/libXpm.so.4 (0xf79ee000)&lt;br /&gt;
	libjpeg.so.62 =&amp;gt; /lib32/libjpeg.so.62 (0xf7997000)&lt;br /&gt;
	libfontconfig.so.1 =&amp;gt; /lib32/libfontconfig.so.1 (0xf7962000)&lt;br /&gt;
	libfreetype.so.6 =&amp;gt; /lib32/libfreetype.so.6 (0xf78c9000)&lt;br /&gt;
	libtinfo.so.5 =&amp;gt; /lib32/libtinfo.so.5 (0xf78b0000)&lt;br /&gt;
	/lib/ld-linux.so.2 (0xf7fa4000)&lt;br /&gt;
	libXau.so.6 =&amp;gt; /lib32/libXau.so.6 (0xf78ad000)&lt;br /&gt;
	libexpat.so.1 =&amp;gt; /lib32/libexpat.so.1 (0xf7885000)&lt;br /&gt;
trinatdaq:trinat&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set login environment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
setenv TRIUMF_FONTS $HOME/packages/physica/fonts&lt;br /&gt;
setenv PHYSICA_DIR $HOME/packages/physica&lt;br /&gt;
alias physica $PHYSICA_DIR/physica-SL6-32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/packages/physica&lt;br /&gt;
physica&lt;br /&gt;
@rangauss.pcm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install kubuntu-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install lxqt&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at http://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
KO - is this still needed? does it cause any security problems?&lt;br /&gt;
&lt;br /&gt;
x2go instructions, thanks to Art O.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:x2go/stable&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
#GRUB_TIMEOUT_STYLE=hidden&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reboot ==&lt;br /&gt;
&lt;br /&gt;
this completes installation of the base system.&lt;br /&gt;
&lt;br /&gt;
following sections modify basic ubuntu to fix known problems and to enable special stuff.&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full =&lt;br /&gt;
&lt;br /&gt;
!!! only if ROOT on ZFS !!!&lt;br /&gt;
&lt;br /&gt;
There is an error in the zsys package that causes bpool to run out of space,&lt;br /&gt;
see [[#Ubuntu zsys]] for more details.&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp etc/zsys.conf /etc/&lt;br /&gt;
zsysctl service reload&lt;br /&gt;
zsysctl service gc&lt;br /&gt;
zpool list bpool&lt;br /&gt;
zfs list bpool&lt;br /&gt;
df /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TL edit (April 2023): I think also need to do chown wheel.wheel /wheel&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, debian 11) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit /etc/nsswitch.conf to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable hourly update of nis maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone http://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone http://ladd00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ONE MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
apt remove sddm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module&lt;br /&gt;
* enable new configurations&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
* apt-get update # update package list&lt;br /&gt;
* apt-get dist-upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
* apt-get autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS =&lt;br /&gt;
&lt;br /&gt;
!!! after installing all the packages, after updating the system, after updating the linux kernel, after rebooting into latest kernel !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install zfsutils-linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Follow generic ZFS instructions: [[ZFS]]&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Update Ubuntu LTS 20.04 to LTS 22.04:&lt;br /&gt;
&lt;br /&gt;
== daqubuntu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== midm9a ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daq17 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daq00 ==&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== boot from ZFS ==&lt;br /&gt;
&lt;br /&gt;
* use UEFI boot with syslinux, see here: https://daq.triumf.ca/DaqWiki/index.php/SLinstall#Configure_UEFI_boot&lt;br /&gt;
* apt install zfs-initramfs&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* ZFS structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# zfs list&lt;br /&gt;
NAME                                               USED  AVAIL     REFER  MOUNTPOINT&lt;br /&gt;
rpool                                              147G  1.62T       96K  /&lt;br /&gt;
rpool/ROOT                                        17.8G  1.62T       96K  none&lt;br /&gt;
rpool/ROOT/ubuntu_00aaaa                          17.8G  1.62T     6.22G  /&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy OS image to rpool/ROOT/ubuntu_00aaaa&lt;br /&gt;
* zfs set mountpoint=/ rpool&lt;br /&gt;
* zfs set mountpoint=none rpool/ROOT&lt;br /&gt;
* zfs set mountpoint=/ rpool/ROOT/ubuntu_00aaaa&lt;br /&gt;
* zfs get all | grep mountpoint&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rpool                     mountpoint            /                      local&lt;br /&gt;
rpool/ROOT                mountpoint            none                   local&lt;br /&gt;
rpool/ROOT/ubuntu_00aaaa  mountpoint            /                      local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in linux kernel command line (syslinux.cfg), set &amp;quot;root=&amp;quot; to &amp;quot;root=ZFS=rpool/ROOT/ubuntu_00aaaa&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== boot from ZFS mirror ==&lt;br /&gt;
&lt;br /&gt;
=== setup the EFI partitions ===&lt;br /&gt;
&lt;br /&gt;
* assuming /dev/sdb is already setup for EFI boot, setup /dev/sda the same way:&lt;br /&gt;
* partition the second boot disk same as first boot disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# gdisk -l /dev/sdb&lt;br /&gt;
Found valid GPT with protective MBR; using GPT.&lt;br /&gt;
Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
   1            2048         1050623   512.0 MiB   EF00  EFI system partition&lt;br /&gt;
   2         1050624      3907029134   1.8 TiB     8300  Linux filesystem&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkfs.msdos /dev/sdX1&lt;br /&gt;
* create mount points&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/fstab&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1 &lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
* df | grep boot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# df | grep boot&lt;br /&gt;
/dev/sdb1                    523248    98100     425148  19% /boot/efi-sdb&lt;br /&gt;
/dev/sda1                    523248        4     523244   1% /boot/efi-sda&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy boot files to new boot disk&lt;br /&gt;
* cd /boot/efi-sdX; rsync -av . /boot/efi-sdY&lt;br /&gt;
* set BIOS to boot from &amp;quot;UEFI Hard drive&amp;quot;, disable legacy boot (except for booting from USB key in legacy mode)&lt;br /&gt;
* if using UEFI boot syslinux per these instructions, linux kernel update has to be done manually:&lt;br /&gt;
* run ~/git/scripts/etc/update_efi_mirror.perl, follow instructions that it prints.&lt;br /&gt;
&lt;br /&gt;
=== setup zfs partitions ===&lt;br /&gt;
&lt;br /&gt;
use partitions compatible with Ubuntu &amp;quot;install on ZFS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* gdisk &amp;quot;o&amp;quot; to create new GPT partition table&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +512M ef00 to create EFI partition&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +2G 8200 to create linux swap partition (not used)&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +2G BE00 to create ZFS bpool partition&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; xxx BF00 create ZFS rpool partition&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# gdisk -l /dev/sda&lt;br /&gt;
Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
   1            2048         1050623   512.0 MiB   EF00  EFI System Partition&lt;br /&gt;
   2         1050624         5244927   2.0 GiB     8200  &lt;br /&gt;
   3         5244928         9439231   2.0 GiB     BE00  &lt;br /&gt;
   4         9439232       234441614   107.3 GiB   BF00  &lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup zfs mirror ===&lt;br /&gt;
&lt;br /&gt;
* see here: https://daq.triumf.ca/DaqWiki/index.php/ZFS#Convert_pool_from_single_to_mirror&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Feb 19 16:47 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801081-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Feb 19 16:47 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801101-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: none requested&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                             STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                            ONLINE       0     0     0&lt;br /&gt;
          ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool attach rpool ata-WDC_WDS200T2B0A-00SM50_205007801101-part2 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801081-part2&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
        continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Feb 19 16:54:39 2021&lt;br /&gt;
        12.6G scanned at 3.16G/s, 1.02G issued at 262M/s, 12.6G total&lt;br /&gt;
        1.02G resilvered, 8.09% done, 0 days 00:00:45 to go&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                               STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                              ONLINE       0     0     0&lt;br /&gt;
          mirror-0                                         ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801081-part2  ONLINE       0     0     0  (resilvering)&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 12.7G in 0 days 00:00:40 with 0 errors on Fri Feb 19 16:55:19 2021&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                               STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                              ONLINE       0     0     0&lt;br /&gt;
          mirror-0                                         ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801081-part2  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part3&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part3 -&amp;gt; ../../sda3&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3 -&amp;gt; ../../sdb3&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable booting from second SSD: (instead of /dev/sda1, /dev/sdb1, use UUID=xxx)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm9b:~# echo &amp;quot;/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
root@midm9b:~# echo &amp;quot;/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (ISC dhcpd or dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup tftp, pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings&lt;br /&gt;
#port=0 # disable DNS function&lt;br /&gt;
port=53 # enable DNS function&lt;br /&gt;
domain-needed&lt;br /&gt;
bogus-priv&lt;br /&gt;
no-resolv&lt;br /&gt;
server=142.90.100.19&lt;br /&gt;
# DHCP settings&lt;br /&gt;
interface=enp1s0f0 # DHCP interface&lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite&lt;br /&gt;
dhcp-range=192.168.1.0,static&lt;br /&gt;
#log-dhcp&lt;br /&gt;
quiet-dhcp&lt;br /&gt;
#dhcp-ignore=tag:!known&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
#dhcp-host=ac:1f:6b:9e:7f:4a,192.168.1.100,10m&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
# TFTP settings&lt;br /&gt;
enable-tftp&lt;br /&gt;
tftp-root=/tftpboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /zssd/tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* rm /etc/resolv.conf&lt;br /&gt;
* create new /etc/resolv.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameserver 127.0.0.1&lt;br /&gt;
search snolab.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* configure and enable chronyd per instructions above&lt;br /&gt;
* echo &amp;quot;allow 192.168.1.0/24&amp;quot; &amp;gt; /etc/chrony/conf.d/allow-localhost.conf&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
* zfs create zssd/nfsroot&lt;br /&gt;
* zfs set dedup=verify zssd/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /zssd/nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /zssd/nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /zssd/nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libgcc-9-dev-arm64-cross&lt;br /&gt;
apt install gcc-arm-linux-gnueabi&lt;br /&gt;
apt install gcc-arm-linux-gnueabihf&lt;br /&gt;
apt install g++-arm-linux-gnueabihf&lt;br /&gt;
apt install g++-arm-linux-gnueabi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabi-gcc -o ttcp1 ttcp.c -march=armv7 -static&lt;br /&gt;
arm-linux-gnueabi-gcc -o memcpy.armv7 memcpy.cc -march=armv7 -static -O2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for MIDAS, use &amp;quot;make linux32&amp;quot;&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=7418</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=7418"/>
		<updated>2023-11-10T22:29:40Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: /* Convert from single to dual mirrored ZFS SSD */ Added simple partition table cloning option.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= About Ubuntu =&lt;br /&gt;
&lt;br /&gt;
AAA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
echo server time1.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
echo server time2.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
echo server time3.triumf.ca iburst &amp;gt;&amp;gt; /etc/chrony/chrony.conf&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools sysstat smartmontools lm-sensors traceroute time minicom screen git lsof debsums tmux&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
yes | apt -y install flex bison&lt;br /&gt;
yes | apt -y install neofetch&lt;br /&gt;
yes | apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
yes | apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
yes | apt -y install python&lt;br /&gt;
yes | apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
yes | apt -y install mariadb-client ### mysql client&lt;br /&gt;
yes | apt -y install libz-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install chromium-browser chromium-codecs-ffmpeg-extra&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3.8-full python3.8-dev python3.8-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install ganglia-monitor&lt;br /&gt;
systemctl enable ganglia-monitor&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp etc/gmond-ubuntu.conf /etc/ganglia/gmond.conf&lt;br /&gt;
ln -s ganglia/gmond.conf /etc&lt;br /&gt;
# ln -s arm-linux-gnueabihf/ganglia /usr/lib/ganglia ### fix path for ARM CPU&lt;br /&gt;
# ln -s i386-linux-gnu/ganglia /usr/lib/ganglia ### fix path for 32-bit Intel CPU&lt;br /&gt;
systemctl restart ganglia-monitor&lt;br /&gt;
systemctl status ganglia-monitor&lt;br /&gt;
ps -efw | grep gmond&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
* apt install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
* restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
* xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
(does not work anymore!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ftp.ca.debian.org/debian/pool/main/libp/libpng/libpng12-0_1.2.50-2+deb8u2_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.50-2+deb8u2_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install 32-bit libraries for PHYSICA ==&lt;br /&gt;
&lt;br /&gt;
these instructions are for running 32-bit physica executable built for SL6 on ubuntu LTS 20.04&lt;br /&gt;
&lt;br /&gt;
install physica sources (cannot build, do not have g77)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/packages&lt;br /&gt;
git clone https://bitbucket.org/ttriumfdaq/physica.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
install 32-bit libraries using ubuntu package manager:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install lib32z1 # libz.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy 32-bit SL6 shared libraries to /lib32&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libX11.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libgd.so.2 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libpng12.so.0 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libreadline.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libncurses.so.5 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libg2c.so.0 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libxcb.so.1 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libXpm.so.4 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libjpeg.so.62 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libfontconfig.so.1 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libfreetype.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libtinfo.so.5 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libXau.so.6 /lib32/&lt;br /&gt;
root@trinatdaq:~# cp /daq/daqstore/olchansk/daq/physica-SL6/libexpat.so.1 /lib32/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ldd should report:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trinatdaq:trinat&amp;gt; ldd /usr/local/physica/physica.exe&lt;br /&gt;
	linux-gate.so.1 (0xf7fa2000)&lt;br /&gt;
	libX11.so.6 =&amp;gt; /lib32/libX11.so.6 (0xf7e43000)&lt;br /&gt;
	libgd.so.2 =&amp;gt; /lib32/libgd.so.2 (0xf7dfe000)&lt;br /&gt;
	libpng12.so.0 =&amp;gt; /lib32/libpng12.so.0 (0xf7dd6000)&lt;br /&gt;
	libz.so.1 =&amp;gt; /lib32/libz.so.1 (0xf7db8000)&lt;br /&gt;
	libreadline.so.6 =&amp;gt; /lib32/libreadline.so.6 (0xf7d7e000)&lt;br /&gt;
	libncurses.so.5 =&amp;gt; /lib32/libncurses.so.5 (0xf7d5b000)&lt;br /&gt;
	libg2c.so.0 =&amp;gt; /lib32/libg2c.so.0 (0xf7d3d000)&lt;br /&gt;
	libm.so.6 =&amp;gt; /lib32/libm.so.6 (0xf7c39000)&lt;br /&gt;
	libgcc_s.so.1 =&amp;gt; /lib32/libgcc_s.so.1 (0xf7c1a000)&lt;br /&gt;
	libc.so.6 =&amp;gt; /lib32/libc.so.6 (0xf7a2f000)&lt;br /&gt;
	libxcb.so.1 =&amp;gt; /lib32/libxcb.so.1 (0xf7a05000)&lt;br /&gt;
	libdl.so.2 =&amp;gt; /lib32/libdl.so.2 (0xf79ff000)&lt;br /&gt;
	libXpm.so.4 =&amp;gt; /lib32/libXpm.so.4 (0xf79ee000)&lt;br /&gt;
	libjpeg.so.62 =&amp;gt; /lib32/libjpeg.so.62 (0xf7997000)&lt;br /&gt;
	libfontconfig.so.1 =&amp;gt; /lib32/libfontconfig.so.1 (0xf7962000)&lt;br /&gt;
	libfreetype.so.6 =&amp;gt; /lib32/libfreetype.so.6 (0xf78c9000)&lt;br /&gt;
	libtinfo.so.5 =&amp;gt; /lib32/libtinfo.so.5 (0xf78b0000)&lt;br /&gt;
	/lib/ld-linux.so.2 (0xf7fa4000)&lt;br /&gt;
	libXau.so.6 =&amp;gt; /lib32/libXau.so.6 (0xf78ad000)&lt;br /&gt;
	libexpat.so.1 =&amp;gt; /lib32/libexpat.so.1 (0xf7885000)&lt;br /&gt;
trinatdaq:trinat&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set login environment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
setenv TRIUMF_FONTS $HOME/packages/physica/fonts&lt;br /&gt;
setenv PHYSICA_DIR $HOME/packages/physica&lt;br /&gt;
alias physica $PHYSICA_DIR/physica-SL6-32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/packages/physica&lt;br /&gt;
physica&lt;br /&gt;
@rangauss.pcm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install kubuntu-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install lxqt&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
DEBIAN_FRONTEND=noninteractive apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at http://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
KO - is this still needed? does it cause any security problems?&lt;br /&gt;
&lt;br /&gt;
x2go instructions, thanks to Art O.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:x2go/stable&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
#GRUB_TIMEOUT_STYLE=hidden&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reboot ==&lt;br /&gt;
&lt;br /&gt;
this completes installation of the base system.&lt;br /&gt;
&lt;br /&gt;
following sections modify basic ubuntu to fix known problems and to enable special stuff.&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full =&lt;br /&gt;
&lt;br /&gt;
!!! only if ROOT on ZFS !!!&lt;br /&gt;
&lt;br /&gt;
There is an error in the zsys package that causes bpool to run out of space,&lt;br /&gt;
see [[#Ubuntu zsys]] for more details.&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp etc/zsys.conf /etc/&lt;br /&gt;
zsysctl service reload&lt;br /&gt;
zsysctl service gc&lt;br /&gt;
zpool list bpool&lt;br /&gt;
zfs list bpool&lt;br /&gt;
df /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TL edit (April 2023): I think also need to do chown wheel.wheel /wheel&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, debian 11) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit /etc/nsswitch.conf to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable hourly update of nis maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone http://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone http://ladd00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ONE MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
apt remove sddm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module&lt;br /&gt;
* enable new configurations&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
* apt-get update # update package list&lt;br /&gt;
* apt-get dist-upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
* apt-get autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS =&lt;br /&gt;
&lt;br /&gt;
!!! after installing all the packages, after updating the system, after updating the linux kernel, after rebooting into latest kernel !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install zfsutils-linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Follow generic ZFS instructions: [[ZFS]]&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Update Ubuntu LTS 20.04 to LTS 22.04:&lt;br /&gt;
&lt;br /&gt;
== daqubuntu ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== midm9a ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daq17 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== daq00 ==&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== boot from ZFS ==&lt;br /&gt;
&lt;br /&gt;
* use UEFI boot with syslinux, see here: https://daq.triumf.ca/DaqWiki/index.php/SLinstall#Configure_UEFI_boot&lt;br /&gt;
* apt install zfs-initramfs&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* ZFS structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# zfs list&lt;br /&gt;
NAME                                               USED  AVAIL     REFER  MOUNTPOINT&lt;br /&gt;
rpool                                              147G  1.62T       96K  /&lt;br /&gt;
rpool/ROOT                                        17.8G  1.62T       96K  none&lt;br /&gt;
rpool/ROOT/ubuntu_00aaaa                          17.8G  1.62T     6.22G  /&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy OS image to rpool/ROOT/ubuntu_00aaaa&lt;br /&gt;
* zfs set mountpoint=/ rpool&lt;br /&gt;
* zfs set mountpoint=none rpool/ROOT&lt;br /&gt;
* zfs set mountpoint=/ rpool/ROOT/ubuntu_00aaaa&lt;br /&gt;
* zfs get all | grep mountpoint&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rpool                     mountpoint            /                      local&lt;br /&gt;
rpool/ROOT                mountpoint            none                   local&lt;br /&gt;
rpool/ROOT/ubuntu_00aaaa  mountpoint            /                      local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in linux kernel command line (syslinux.cfg), set &amp;quot;root=&amp;quot; to &amp;quot;root=ZFS=rpool/ROOT/ubuntu_00aaaa&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== boot from ZFS mirror ==&lt;br /&gt;
&lt;br /&gt;
=== setup the EFI partitions ===&lt;br /&gt;
&lt;br /&gt;
* assuming /dev/sdb is already setup for EFI boot, setup /dev/sda the same way:&lt;br /&gt;
* partition the second boot disk same as first boot disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# gdisk -l /dev/sdb&lt;br /&gt;
Found valid GPT with protective MBR; using GPT.&lt;br /&gt;
Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
   1            2048         1050623   512.0 MiB   EF00  EFI system partition&lt;br /&gt;
   2         1050624      3907029134   1.8 TiB     8300  Linux filesystem&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkfs.msdos /dev/sdX1&lt;br /&gt;
* create mount points&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/fstab&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1 &lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
* df | grep boot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# df | grep boot&lt;br /&gt;
/dev/sdb1                    523248    98100     425148  19% /boot/efi-sdb&lt;br /&gt;
/dev/sda1                    523248        4     523244   1% /boot/efi-sda&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy boot files to new boot disk&lt;br /&gt;
* cd /boot/efi-sdX; rsync -av . /boot/efi-sdY&lt;br /&gt;
* set BIOS to boot from &amp;quot;UEFI Hard drive&amp;quot;, disable legacy boot (except for booting from USB key in legacy mode)&lt;br /&gt;
* if using UEFI boot syslinux per these instructions, linux kernel update has to be done manually:&lt;br /&gt;
* run ~/git/scripts/etc/update_efi_mirror.perl, follow instructions that it prints.&lt;br /&gt;
&lt;br /&gt;
=== setup zfs partitions ===&lt;br /&gt;
&lt;br /&gt;
use partitions compatible with Ubuntu &amp;quot;install on ZFS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* gdisk &amp;quot;o&amp;quot; to create new GPT partition table&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +512M ef00 to create EFI partition&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +2G 8200 to create linux swap partition (not used)&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; +2G BE00 to create ZFS bpool partition&lt;br /&gt;
* gdisk &amp;quot;n&amp;quot; xxx BF00 create ZFS rpool partition&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# gdisk -l /dev/sda&lt;br /&gt;
Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
   1            2048         1050623   512.0 MiB   EF00  EFI System Partition&lt;br /&gt;
   2         1050624         5244927   2.0 GiB     8200  &lt;br /&gt;
   3         5244928         9439231   2.0 GiB     BE00  &lt;br /&gt;
   4         9439232       234441614   107.3 GiB   BF00  &lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup zfs mirror ===&lt;br /&gt;
&lt;br /&gt;
* see here: https://daq.triumf.ca/DaqWiki/index.php/ZFS#Convert_pool_from_single_to_mirror&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Feb 19 16:47 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801081-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Feb 19 16:47 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801101-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: none requested&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                             STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                            ONLINE       0     0     0&lt;br /&gt;
          ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool attach rpool ata-WDC_WDS200T2B0A-00SM50_205007801101-part2 /dev/disk/by-id/ata-WDC_WDS200T2B0A-00SM50_205007801081-part2&lt;br /&gt;
&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
        continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Feb 19 16:54:39 2021&lt;br /&gt;
        12.6G scanned at 3.16G/s, 1.02G issued at 262M/s, 12.6G total&lt;br /&gt;
        1.02G resilvered, 8.09% done, 0 days 00:00:45 to go&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                               STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                              ONLINE       0     0     0&lt;br /&gt;
          mirror-0                                         ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801081-part2  ONLINE       0     0     0  (resilvering)&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@grsnis01:~# zpool status&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 12.7G in 0 days 00:00:40 with 0 errors on Fri Feb 19 16:55:19 2021&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME                                               STATE     READ WRITE CKSUM&lt;br /&gt;
        rpool                                              ONLINE       0     0     0&lt;br /&gt;
          mirror-0                                         ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801101-part2  ONLINE       0     0     0&lt;br /&gt;
            ata-WDC_WDS200T2B0A-00SM50_205007801081-part2  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* if both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part3&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part3 -&amp;gt; ../../sda3&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3 -&amp;gt; ../../sdb3&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable booting from second SSD: (instead of /dev/sda1, /dev/sdb1, use UUID=xxx)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm9b:~# echo &amp;quot;/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
root@midm9b:~# echo &amp;quot;/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (ISC dhcpd or dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup tftp, pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings&lt;br /&gt;
#port=0 # disable DNS function&lt;br /&gt;
port=53 # enable DNS function&lt;br /&gt;
domain-needed&lt;br /&gt;
bogus-priv&lt;br /&gt;
no-resolv&lt;br /&gt;
server=142.90.100.19&lt;br /&gt;
# DHCP settings&lt;br /&gt;
interface=enp1s0f0 # DHCP interface&lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite&lt;br /&gt;
dhcp-range=192.168.1.0,static&lt;br /&gt;
#log-dhcp&lt;br /&gt;
quiet-dhcp&lt;br /&gt;
#dhcp-ignore=tag:!known&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
#dhcp-host=ac:1f:6b:9e:7f:4a,192.168.1.100,10m&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
# TFTP settings&lt;br /&gt;
enable-tftp&lt;br /&gt;
tftp-root=/tftpboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /zssd/tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* rm /etc/resolv.conf&lt;br /&gt;
* create new /etc/resolv.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameserver 127.0.0.1&lt;br /&gt;
search snolab.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* configure and enable chronyd per instructions above&lt;br /&gt;
* echo &amp;quot;allow 192.168.1.0/24&amp;quot; &amp;gt; /etc/chrony/conf.d/allow-localhost.conf&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
* zfs create zssd/nfsroot&lt;br /&gt;
* zfs set dedup=verify zssd/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /zssd/nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /zssd/nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /zssd/nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libgcc-9-dev-arm64-cross&lt;br /&gt;
apt install gcc-arm-linux-gnueabi&lt;br /&gt;
apt install gcc-arm-linux-gnueabihf&lt;br /&gt;
apt install g++-arm-linux-gnueabihf&lt;br /&gt;
apt install g++-arm-linux-gnueabi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabi-gcc -o ttcp1 ttcp.c -march=armv7 -static&lt;br /&gt;
arm-linux-gnueabi-gcc -o memcpy.armv7 memcpy.cc -march=armv7 -static -O2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for MIDAS, use &amp;quot;make linux32&amp;quot;&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=3010</id>
		<title>Laser calibration</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=3010"/>
		<updated>2020-07-21T20:58:30Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: /* Access SPI as non-root user */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
Both the prototype and final TPC have aluminium strips on the central cathode that are intended for laser calibration. To that end a plane of UV laser light is sent into the TPC intersecting with the strips. Each laser pulse should then create a bunch of electrons with well defined position and time at each of the strips.&lt;br /&gt;
&lt;br /&gt;
== Photoelectron efficiency tests ==&lt;br /&gt;
One worry with the intended geometry is that the laser hits the far strips at a very glancing angle, and it was assumed the photoelectron efficiency (i.e. number of photoelectrons per photon) would go down in favour of reflection. To prevent this two methods of surface treatment were considered, and both the validity of the aforementioned assumption as well as the effectiveness of the treatments were investigated in a test setup at UBC. Details and results are given in this [[Media:LaserTests.pdf|report]].&lt;br /&gt;
&lt;br /&gt;
== Laser operating procedure ==&lt;br /&gt;
The following describes the standard operating procedure for running the laser setup on the prototype.&lt;br /&gt;
[[File:Control.jpg|thumb|Handheld control unit]]&lt;br /&gt;
&lt;br /&gt;
=== Safety ===&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&#039;&#039;NEVER have the key inserted in the &amp;quot;ignition&amp;quot; when the optical fiber is disconnected, the black box is open, or the TPC is open (e.g. gas lines disconnected).&#039;&#039;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
=== Start-up ===&lt;br /&gt;
[[File:Shutter.jpg|thumb|Manual shutter: left open, right closed]]&lt;br /&gt;
# Check integrity of enclosure, i.e. optics box closed and bolted down, fiber attached at both ends.&lt;br /&gt;
# Turn on laser system with key on main unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Ready&amp;quot; on handheld unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
# Set collimator via mvat program on computer.&lt;br /&gt;
# Open manual shutter on laser head.&lt;br /&gt;
# Push button &amp;quot;Q-switch -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
&lt;br /&gt;
=== Pause ===&lt;br /&gt;
==== Short pause ====&lt;br /&gt;
Simply push stop/start for Q-switch.&lt;br /&gt;
==== Longer pause ====&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# After pause restart according to after-key part of start-up procedure.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# Wait a few minutes for cool-down.&lt;br /&gt;
# Turn off and remove key.&lt;br /&gt;
&lt;br /&gt;
=== General best practice ===&lt;br /&gt;
* Limit laser shots to a minimum, to reduce wear on laser, flash lamp, and fiber.&lt;br /&gt;
* To that end, do non-critical steps like attenuator setting and DAQ start before starting Q-switch.&lt;br /&gt;
* Ideally allow system some time to warm up between turning on flash lamp and Q-switch.&lt;br /&gt;
&lt;br /&gt;
== Optics ==&lt;br /&gt;
&lt;br /&gt;
== Laser requirements ==&lt;br /&gt;
&lt;br /&gt;
== MEMS Multiplexer ==&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi setup ===&lt;br /&gt;
==== Operating System ====&lt;br /&gt;
We&#039;re running the most recent version of Raspberry Pi OS as downloaded from [https://www.raspberrypi.org/downloads/ raspberrypi.org]&lt;br /&gt;
&lt;br /&gt;
==== Required packages ====&lt;br /&gt;
Install the following with apt get:&lt;br /&gt;
* emacs&lt;br /&gt;
* libcap-dev (required to access SPI as non-root user)&lt;br /&gt;
&lt;br /&gt;
==== SPI library ====&lt;br /&gt;
The recommended way to interface with SPI from a raspberry pi is now no longer using the wiringPi library, instead [https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md raspberrypi.org] recommends [http://www.airspayce.com/mikem/bcm2835/ bcm2835]. This is a direct hardware C library for pin communication that includes examples for GPIO, SPI, and I2C.&lt;br /&gt;
&lt;br /&gt;
===== Access SPI as non-root user =====&lt;br /&gt;
Following the instructions from [http://www.airspayce.com/mikem/bcm2835/] non-root access to the SPI pins requires the following:&lt;br /&gt;
&lt;br /&gt;
* install libcap-dev (see [[Laser_calibration#Required_packages|Required packages]])&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install libcap-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* add current user to kmem group&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo adduser $USER kmem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* give group kmem access to /dev/mem&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;SUBSYSTEM==&amp;quot;mem&amp;quot;, KERNEL==&amp;quot;mem&amp;quot;, GROUP=&amp;quot;kmem&amp;quot;, MODE=&amp;quot;0660&amp;quot;&#039; | sudo tee /etc/udev/rules.d/98-mem.rules&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* uncomment the BCM2835_HAVE_LIBCAP line in src/bcm2835.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i &#039;s/\/\/#define BCM2835_HAVE_LIBCAP/#define BCM2835_HAVE_LIBCAP/&#039; src/bcm2835.h&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* compile libbcm2835 as normal&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
sudo make install # (make check fails)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* in addition to -lbcm2835, compilation of example or own code requires -lcap, e.g.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gcc -o spi spi.c -l bcm2835 -lcap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* after compilation, give program permission to access cap&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo setcap cap_sys_rawio+ep &amp;lt;progname&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== C++ =====&lt;br /&gt;
C++ classes to simplify the use are provided in the mems code.&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=3009</id>
		<title>Laser calibration</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=3009"/>
		<updated>2020-07-21T20:55:48Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: /* Access SPI as non-root user */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
Both the prototype and final TPC have aluminium strips on the central cathode that are intended for laser calibration. To that end a plane of UV laser light is sent into the TPC intersecting with the strips. Each laser pulse should then create a bunch of electrons with well defined position and time at each of the strips.&lt;br /&gt;
&lt;br /&gt;
== Photoelectron efficiency tests ==&lt;br /&gt;
One worry with the intended geometry is that the laser hits the far strips at a very glancing angle, and it was assumed the photoelectron efficiency (i.e. number of photoelectrons per photon) would go down in favour of reflection. To prevent this two methods of surface treatment were considered, and both the validity of the aforementioned assumption as well as the effectiveness of the treatments were investigated in a test setup at UBC. Details and results are given in this [[Media:LaserTests.pdf|report]].&lt;br /&gt;
&lt;br /&gt;
== Laser operating procedure ==&lt;br /&gt;
The following describes the standard operating procedure for running the laser setup on the prototype.&lt;br /&gt;
[[File:Control.jpg|thumb|Handheld control unit]]&lt;br /&gt;
&lt;br /&gt;
=== Safety ===&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&#039;&#039;NEVER have the key inserted in the &amp;quot;ignition&amp;quot; when the optical fiber is disconnected, the black box is open, or the TPC is open (e.g. gas lines disconnected).&#039;&#039;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
=== Start-up ===&lt;br /&gt;
[[File:Shutter.jpg|thumb|Manual shutter: left open, right closed]]&lt;br /&gt;
# Check integrity of enclosure, i.e. optics box closed and bolted down, fiber attached at both ends.&lt;br /&gt;
# Turn on laser system with key on main unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Ready&amp;quot; on handheld unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
# Set collimator via mvat program on computer.&lt;br /&gt;
# Open manual shutter on laser head.&lt;br /&gt;
# Push button &amp;quot;Q-switch -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
&lt;br /&gt;
=== Pause ===&lt;br /&gt;
==== Short pause ====&lt;br /&gt;
Simply push stop/start for Q-switch.&lt;br /&gt;
==== Longer pause ====&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# After pause restart according to after-key part of start-up procedure.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# Wait a few minutes for cool-down.&lt;br /&gt;
# Turn off and remove key.&lt;br /&gt;
&lt;br /&gt;
=== General best practice ===&lt;br /&gt;
* Limit laser shots to a minimum, to reduce wear on laser, flash lamp, and fiber.&lt;br /&gt;
* To that end, do non-critical steps like attenuator setting and DAQ start before starting Q-switch.&lt;br /&gt;
* Ideally allow system some time to warm up between turning on flash lamp and Q-switch.&lt;br /&gt;
&lt;br /&gt;
== Optics ==&lt;br /&gt;
&lt;br /&gt;
== Laser requirements ==&lt;br /&gt;
&lt;br /&gt;
== MEMS Multiplexer ==&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi setup ===&lt;br /&gt;
==== Operating System ====&lt;br /&gt;
We&#039;re running the most recent version of Raspberry Pi OS as downloaded from [https://www.raspberrypi.org/downloads/ raspberrypi.org]&lt;br /&gt;
&lt;br /&gt;
==== Required packages ====&lt;br /&gt;
Install the following with apt get:&lt;br /&gt;
* emacs&lt;br /&gt;
* libcap-dev (required to access SPI as non-root user)&lt;br /&gt;
&lt;br /&gt;
==== SPI library ====&lt;br /&gt;
The recommended way to interface with SPI from a raspberry pi is now no longer using the wiringPi library, instead [https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md raspberrypi.org] recommends [http://www.airspayce.com/mikem/bcm2835/ bcm2835]. This is a direct hardware C library for pin communication that includes examples for GPIO, SPI, and I2C.&lt;br /&gt;
&lt;br /&gt;
===== Access SPI as non-root user =====&lt;br /&gt;
Following the instructions from [http://www.airspayce.com/mikem/bcm2835/] non-root access to the SPI pins requires the following:&lt;br /&gt;
&lt;br /&gt;
====== install libcap-dev (see [[Laser_calibration#Required_packages|Required packages]]) ======&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install libcap-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== add current user to kmem group ======&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo adduser $USER kmem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== give group kmem access to /dev/mem&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;SUBSYSTEM==&amp;quot;mem&amp;quot;, KERNEL==&amp;quot;mem&amp;quot;, GROUP=&amp;quot;kmem&amp;quot;, MODE=&amp;quot;0660&amp;quot;&#039; | sudo tee /etc/udev/rules.d/98-mem.rules&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== uncomment the BCM2835_HAVE_LIBCAP line in src/bcm2835.h ======&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i &#039;s/\/\/#define BCM2835_HAVE_LIBCAP/#define BCM2835_HAVE_LIBCAP/&#039; src/bcm2835.h&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== compile libbcm2835 as normal ======&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
sudo make install # (make check fails)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== in addition to -lbcm2835, compilation of example or own code requires -lcap, e.g. ======&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gcc -o spi spi.c -l bcm2835 -lcap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== after compilation, give program permission to access cap ======&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo setcap cap_sys_rawio+ep &amp;lt;progname&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== C++ =====&lt;br /&gt;
C++ classes to simplify the use are provided in the mems code.&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=3008</id>
		<title>Laser calibration</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=3008"/>
		<updated>2020-07-21T20:50:15Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
Both the prototype and final TPC have aluminium strips on the central cathode that are intended for laser calibration. To that end a plane of UV laser light is sent into the TPC intersecting with the strips. Each laser pulse should then create a bunch of electrons with well defined position and time at each of the strips.&lt;br /&gt;
&lt;br /&gt;
== Photoelectron efficiency tests ==&lt;br /&gt;
One worry with the intended geometry is that the laser hits the far strips at a very glancing angle, and it was assumed the photoelectron efficiency (i.e. number of photoelectrons per photon) would go down in favour of reflection. To prevent this two methods of surface treatment were considered, and both the validity of the aforementioned assumption as well as the effectiveness of the treatments were investigated in a test setup at UBC. Details and results are given in this [[Media:LaserTests.pdf|report]].&lt;br /&gt;
&lt;br /&gt;
== Laser operating procedure ==&lt;br /&gt;
The following describes the standard operating procedure for running the laser setup on the prototype.&lt;br /&gt;
[[File:Control.jpg|thumb|Handheld control unit]]&lt;br /&gt;
&lt;br /&gt;
=== Safety ===&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&#039;&#039;NEVER have the key inserted in the &amp;quot;ignition&amp;quot; when the optical fiber is disconnected, the black box is open, or the TPC is open (e.g. gas lines disconnected).&#039;&#039;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
=== Start-up ===&lt;br /&gt;
[[File:Shutter.jpg|thumb|Manual shutter: left open, right closed]]&lt;br /&gt;
# Check integrity of enclosure, i.e. optics box closed and bolted down, fiber attached at both ends.&lt;br /&gt;
# Turn on laser system with key on main unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Ready&amp;quot; on handheld unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
# Set collimator via mvat program on computer.&lt;br /&gt;
# Open manual shutter on laser head.&lt;br /&gt;
# Push button &amp;quot;Q-switch -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
&lt;br /&gt;
=== Pause ===&lt;br /&gt;
==== Short pause ====&lt;br /&gt;
Simply push stop/start for Q-switch.&lt;br /&gt;
==== Longer pause ====&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# After pause restart according to after-key part of start-up procedure.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# Wait a few minutes for cool-down.&lt;br /&gt;
# Turn off and remove key.&lt;br /&gt;
&lt;br /&gt;
=== General best practice ===&lt;br /&gt;
* Limit laser shots to a minimum, to reduce wear on laser, flash lamp, and fiber.&lt;br /&gt;
* To that end, do non-critical steps like attenuator setting and DAQ start before starting Q-switch.&lt;br /&gt;
* Ideally allow system some time to warm up between turning on flash lamp and Q-switch.&lt;br /&gt;
&lt;br /&gt;
== Optics ==&lt;br /&gt;
&lt;br /&gt;
== Laser requirements ==&lt;br /&gt;
&lt;br /&gt;
== MEMS Multiplexer ==&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi setup ===&lt;br /&gt;
==== Operating System ====&lt;br /&gt;
We&#039;re running the most recent version of Raspberry Pi OS as downloaded from [https://www.raspberrypi.org/downloads/ raspberrypi.org]&lt;br /&gt;
&lt;br /&gt;
==== Required packages ====&lt;br /&gt;
Install the following with apt get:&lt;br /&gt;
* emacs&lt;br /&gt;
* libcap-dev (required to access SPI as non-root user)&lt;br /&gt;
&lt;br /&gt;
==== SPI library ====&lt;br /&gt;
The recommended way to interface with SPI from a raspberry pi is now no longer using the wiringPi library, instead [https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md raspberrypi.org] recommends [http://www.airspayce.com/mikem/bcm2835/ bcm2835]. This is a direct hardware C library for pin communication that includes examples for GPIO, SPI, and I2C.&lt;br /&gt;
&lt;br /&gt;
===== Access SPI as non-root user =====&lt;br /&gt;
Following the instructions from [http://www.airspayce.com/mikem/bcm2835/] non-root access to the SPI pins requires the following:&lt;br /&gt;
====== install libcap-dev (see [[Laser_calibration#Required_packages|Required packages]]) ======&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install libcap-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====== uncomment the BCM2835_HAVE_LIBCAP line in src/bcm2835.h ======&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i &#039;s/\/\/#define BCM2835_HAVE_LIBCAP/#define BCM2835_HAVE_LIBCAP/&#039; src/bcm2835.h&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====== compile libbcm2835 as normal ======&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
sudo make install # (make check fails)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====== in addition to -lbcm2835, compilation of example or own code requires -lcap, e.g. ======&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gcc -o spi spi.c -l bcm2835 -lcap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== C++ =====&lt;br /&gt;
C++ classes to simplify the use are provided in the mems code.&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=3007</id>
		<title>Laser calibration</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=3007"/>
		<updated>2020-07-21T20:45:45Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
Both the prototype and final TPC have aluminium strips on the central cathode that are intended for laser calibration. To that end a plane of UV laser light is sent into the TPC intersecting with the strips. Each laser pulse should then create a bunch of electrons with well defined position and time at each of the strips.&lt;br /&gt;
&lt;br /&gt;
== Photoelectron efficiency tests ==&lt;br /&gt;
One worry with the intended geometry is that the laser hits the far strips at a very glancing angle, and it was assumed the photoelectron efficiency (i.e. number of photoelectrons per photon) would go down in favour of reflection. To prevent this two methods of surface treatment were considered, and both the validity of the aforementioned assumption as well as the effectiveness of the treatments were investigated in a test setup at UBC. Details and results are given in this [[Media:LaserTests.pdf|report]].&lt;br /&gt;
&lt;br /&gt;
== Laser operating procedure ==&lt;br /&gt;
The following describes the standard operating procedure for running the laser setup on the prototype.&lt;br /&gt;
[[File:Control.jpg|thumb|Handheld control unit]]&lt;br /&gt;
&lt;br /&gt;
=== Safety ===&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&#039;&#039;NEVER have the key inserted in the &amp;quot;ignition&amp;quot; when the optical fiber is disconnected, the black box is open, or the TPC is open (e.g. gas lines disconnected).&#039;&#039;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
=== Start-up ===&lt;br /&gt;
[[File:Shutter.jpg|thumb|Manual shutter: left open, right closed]]&lt;br /&gt;
# Check integrity of enclosure, i.e. optics box closed and bolted down, fiber attached at both ends.&lt;br /&gt;
# Turn on laser system with key on main unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Ready&amp;quot; on handheld unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
# Set collimator via mvat program on computer.&lt;br /&gt;
# Open manual shutter on laser head.&lt;br /&gt;
# Push button &amp;quot;Q-switch -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
&lt;br /&gt;
=== Pause ===&lt;br /&gt;
==== Short pause ====&lt;br /&gt;
Simply push stop/start for Q-switch.&lt;br /&gt;
==== Longer pause ====&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# After pause restart according to after-key part of start-up procedure.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# Wait a few minutes for cool-down.&lt;br /&gt;
# Turn off and remove key.&lt;br /&gt;
&lt;br /&gt;
=== General best practice ===&lt;br /&gt;
* Limit laser shots to a minimum, to reduce wear on laser, flash lamp, and fiber.&lt;br /&gt;
* To that end, do non-critical steps like attenuator setting and DAQ start before starting Q-switch.&lt;br /&gt;
* Ideally allow system some time to warm up between turning on flash lamp and Q-switch.&lt;br /&gt;
&lt;br /&gt;
== Optics ==&lt;br /&gt;
&lt;br /&gt;
== Laser requirements ==&lt;br /&gt;
&lt;br /&gt;
== MEMS Multiplexer ==&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi setup ===&lt;br /&gt;
==== Operating System ====&lt;br /&gt;
We&#039;re running the most recent version of Raspberry Pi OS as downloaded from [https://www.raspberrypi.org/downloads/ raspberrypi.org]&lt;br /&gt;
&lt;br /&gt;
==== Required packages ====&lt;br /&gt;
Install the following with apt get:&lt;br /&gt;
* emacs&lt;br /&gt;
* libcap-dev (required to access SPI as non-root user)&lt;br /&gt;
&lt;br /&gt;
==== SPI library ====&lt;br /&gt;
The recommended way to interface with SPI from a raspberry pi is now no longer using the wiringPi library, instead [https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md raspberrypi.org] recommends [http://www.airspayce.com/mikem/bcm2835/ bcm2835]. This is a direct hardware C library for pin communication that includes examples for GPIO, SPI, and I2C.&lt;br /&gt;
&lt;br /&gt;
===== Access SPI as non-root user =====&lt;br /&gt;
Following the instructions from [http://www.airspayce.com/mikem/bcm2835/] non-root access to the SPI pins requires the following:&lt;br /&gt;
# install libcap-dev (see [Required packages])&lt;br /&gt;
# Uncomment the BCM2835_HAVE_LIBCAP line in src/bcm2835.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i &#039;s/\/\/#define BCM2835_HAVE_LIBCAP/#define BCM2835_HAVE_LIBCAP/&#039; src/bcm2835.h&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# compile libbcm2835 as normal, make, sudo make install (make check fails)&lt;br /&gt;
# in addition to -lbcm2835, compilation of example or own code requires -lcap&lt;br /&gt;
&lt;br /&gt;
===== C++ =====&lt;br /&gt;
C++ classes to simplify the use are provided in the mems code.&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=3006</id>
		<title>Laser calibration</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=3006"/>
		<updated>2020-07-21T20:20:52Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
Both the prototype and final TPC have aluminium strips on the central cathode that are intended for laser calibration. To that end a plane of UV laser light is sent into the TPC intersecting with the strips. Each laser pulse should then create a bunch of electrons with well defined position and time at each of the strips.&lt;br /&gt;
&lt;br /&gt;
== Photoelectron efficiency tests ==&lt;br /&gt;
One worry with the intended geometry is that the laser hits the far strips at a very glancing angle, and it was assumed the photoelectron efficiency (i.e. number of photoelectrons per photon) would go down in favour of reflection. To prevent this two methods of surface treatment were considered, and both the validity of the aforementioned assumption as well as the effectiveness of the treatments were investigated in a test setup at UBC. Details and results are given in this [[Media:LaserTests.pdf|report]].&lt;br /&gt;
&lt;br /&gt;
== Laser operating procedure ==&lt;br /&gt;
The following describes the standard operating procedure for running the laser setup on the prototype.&lt;br /&gt;
[[File:Control.jpg|thumb|Handheld control unit]]&lt;br /&gt;
&lt;br /&gt;
=== Safety ===&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&#039;&#039;NEVER have the key inserted in the &amp;quot;ignition&amp;quot; when the optical fiber is disconnected, the black box is open, or the TPC is open (e.g. gas lines disconnected).&#039;&#039;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
=== Start-up ===&lt;br /&gt;
[[File:Shutter.jpg|thumb|Manual shutter: left open, right closed]]&lt;br /&gt;
# Check integrity of enclosure, i.e. optics box closed and bolted down, fiber attached at both ends.&lt;br /&gt;
# Turn on laser system with key on main unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Ready&amp;quot; on handheld unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
# Set collimator via mvat program on computer.&lt;br /&gt;
# Open manual shutter on laser head.&lt;br /&gt;
# Push button &amp;quot;Q-switch -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
&lt;br /&gt;
=== Pause ===&lt;br /&gt;
==== Short pause ====&lt;br /&gt;
Simply push stop/start for Q-switch.&lt;br /&gt;
==== Longer pause ====&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# After pause restart according to after-key part of start-up procedure.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# Wait a few minutes for cool-down.&lt;br /&gt;
# Turn off and remove key.&lt;br /&gt;
&lt;br /&gt;
=== General best practice ===&lt;br /&gt;
* Limit laser shots to a minimum, to reduce wear on laser, flash lamp, and fiber.&lt;br /&gt;
* To that end, do non-critical steps like attenuator setting and DAQ start before starting Q-switch.&lt;br /&gt;
* Ideally allow system some time to warm up between turning on flash lamp and Q-switch.&lt;br /&gt;
&lt;br /&gt;
== Optics ==&lt;br /&gt;
&lt;br /&gt;
== Laser requirements ==&lt;br /&gt;
&lt;br /&gt;
== MEMS Multiplexer ==&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi setup ===&lt;br /&gt;
==== Operating System ====&lt;br /&gt;
We&#039;re running the most recent version of Raspberry Pi OS as downloaded from [https://www.raspberrypi.org/downloads/ raspberrypi.org]&lt;br /&gt;
&lt;br /&gt;
==== Required packages ====&lt;br /&gt;
Install the following with apt get:&lt;br /&gt;
* emacs&lt;br /&gt;
* libcap-dev (required to access SPI as non-root user)&lt;br /&gt;
&lt;br /&gt;
==== SPI library ====&lt;br /&gt;
The recommended way to interface with SPI from a raspberry pi is now no longer using the wiringPi library, instead [https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md raspberrypi.org] recommends [http://www.airspayce.com/mikem/bcm2835/ bcm2835]. This is a direct hardware C library for pin communication that includes examples for GPIO, SPI, and I2C.&lt;br /&gt;
&lt;br /&gt;
C++ classes to simplify the use are provided in the mems code.&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=3005</id>
		<title>Laser calibration</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=3005"/>
		<updated>2020-07-21T19:37:50Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: Starting to document MEMS stuff&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
Both the prototype and final TPC have aluminium strips on the central cathode that are intended for laser calibration. To that end a plane of UV laser light is sent into the TPC intersecting with the strips. Each laser pulse should then create a bunch of electrons with well defined position and time at each of the strips.&lt;br /&gt;
&lt;br /&gt;
== Photoelectron efficiency tests ==&lt;br /&gt;
One worry with the intended geometry is that the laser hits the far strips at a very glancing angle, and it was assumed the photoelectron efficiency (i.e. number of photoelectrons per photon) would go down in favour of reflection. To prevent this two methods of surface treatment were considered, and both the validity of the aforementioned assumption as well as the effectiveness of the treatments were investigated in a test setup at UBC. Details and results are given in this [[Media:LaserTests.pdf|report]].&lt;br /&gt;
&lt;br /&gt;
== Laser operating procedure ==&lt;br /&gt;
The following describes the standard operating procedure for running the laser setup on the prototype.&lt;br /&gt;
[[File:Control.jpg|thumb|Handheld control unit]]&lt;br /&gt;
&lt;br /&gt;
=== Safety ===&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&#039;&#039;NEVER have the key inserted in the &amp;quot;ignition&amp;quot; when the optical fiber is disconnected, the black box is open, or the TPC is open (e.g. gas lines disconnected).&#039;&#039;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
=== Start-up ===&lt;br /&gt;
[[File:Shutter.jpg|thumb|Manual shutter: left open, right closed]]&lt;br /&gt;
# Check integrity of enclosure, i.e. optics box closed and bolted down, fiber attached at both ends.&lt;br /&gt;
# Turn on laser system with key on main unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Ready&amp;quot; on handheld unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
# Set collimator via mvat program on computer.&lt;br /&gt;
# Open manual shutter on laser head.&lt;br /&gt;
# Push button &amp;quot;Q-switch -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
&lt;br /&gt;
=== Pause ===&lt;br /&gt;
==== Short pause ====&lt;br /&gt;
Simply push stop/start for Q-switch.&lt;br /&gt;
==== Longer pause ====&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# After pause restart according to after-key part of start-up procedure.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# Wait a few minutes for cool-down.&lt;br /&gt;
# Turn off and remove key.&lt;br /&gt;
&lt;br /&gt;
=== General best practice ===&lt;br /&gt;
* Limit laser shots to a minimum, to reduce wear on laser, flash lamp, and fiber.&lt;br /&gt;
* To that end, do non-critical steps like attenuator setting and DAQ start before starting Q-switch.&lt;br /&gt;
* Ideally allow system some time to warm up between turning on flash lamp and Q-switch.&lt;br /&gt;
&lt;br /&gt;
== Optics ==&lt;br /&gt;
&lt;br /&gt;
== Laser requirements ==&lt;br /&gt;
&lt;br /&gt;
== MEMS Multiplexer ==&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi setup ===&lt;br /&gt;
==== Operating System ====&lt;br /&gt;
We&#039;re running the most recent version of Raspberry Pi OS as downloaded from [https://www.raspberrypi.org/downloads/ raspberrypi.org]&lt;br /&gt;
&lt;br /&gt;
==== Required packages ====&lt;br /&gt;
Install the following with apt get:&lt;br /&gt;
* emacs&lt;br /&gt;
&lt;br /&gt;
==== SPI library ====&lt;br /&gt;
The recommended way to interface with SPI from a raspberry pi is now no longer using the wiringPi library, instead [https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md raspberrypi.org] recommends [http://www.airspayce.com/mikem/bcm2835/ bcm2835]. This is a direct hardware C library for pin communication that includes examples for GPIO, SPI, and I2C.&lt;br /&gt;
&lt;br /&gt;
C++ classes to simplify the use are provided in the mems code.&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Test_page_for_MediaWiki&amp;diff=862</id>
		<title>Test page for MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Test_page_for_MediaWiki&amp;diff=862"/>
		<updated>2017-09-22T18:05:30Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;MediaWiki has been successfully installed.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Consult the [//meta.wikimedia.org/wiki/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
&lt;br /&gt;
test123&lt;br /&gt;
test333&lt;br /&gt;
test456&lt;br /&gt;
test789&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Web_security2.svg]]&lt;br /&gt;
&lt;br /&gt;
last last last&lt;br /&gt;
&lt;br /&gt;
[[Image:20150422_514701.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! [[File:media/image1.jpeg|299x82px]]&lt;br /&gt;
!&lt;br /&gt;
&lt;br /&gt;
! &#039;&#039;&#039;Document-131949&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Design Note TRI-DN-16-22 ALPHA-g Data Acquisition Notes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Document Type:&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Design&#039;&#039;&#039; &#039;&#039;&#039;Note&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Release:&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Release Date:&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Author(s):&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Pierre Amaudruz&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
| &#039;&#039;&#039;Name:&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Signature:&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Author:&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Konstantin Olchanski &#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
| &#039;&#039;&#039;Pierre Amaudruz&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Reviewed By:&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Thomas Lindner&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Approved By:&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Makoto Fujiwara&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
History of Changes&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Release Number&lt;br /&gt;
! Date&lt;br /&gt;
! Description of Changes&lt;br /&gt;
! Author(s)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2016-02-28&lt;br /&gt;
| Initial Version&lt;br /&gt;
| Pierre Amaudruz&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 2017-04-10&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
| Pierre Amaudruz&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 2017-08-08&lt;br /&gt;
| Revise version without Grif-C&lt;br /&gt;
| PAA, KO&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keywords:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Distribution List:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Table of Figures =&lt;br /&gt;
&lt;br /&gt;
[[#_Toc493687873|&#039;&#039;Figure 1 - Overall dataflow for scheme from the detector to the data storage area.&#039;&#039; 10]]&lt;br /&gt;
&lt;br /&gt;
[[#_Toc493687874|&#039;&#039;Figure 2 - Frontend local fragment assembly, similar data for the event builder. Each grey box refers to a Thread collecting and filtering locally its fragment before making it available to the fragment builder&#039;&#039; 11]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
The ALPHA-g experiment is the next step in the line of successful anti-hydrogen experiments at CERN - ATHENA, ALPHA, ALPHA-2. These experiments have been designed, built and operated by mostly the same group of people, making it important to maximally maintain similarity and compatibility between the existing ALPHA-2 data acquisition system and the new ALPHA-g system. The ALPHA-2 and ALPHA-g machines are expected to operate together, at the same time, by the same set of people, for several years.&lt;br /&gt;
&lt;br /&gt;
Looking back, the ATHENA experiment introduced the concept of using an advanced Si-strip particle detector to image annihilations of anti-hydrogen. The ALPHA experiment brought in the highly reliable MIDAS data acquisition software and the modular VME-based electronics (built at/for TRIUMF). The ALPHA-2 experiment saw the data acquisition system expanded by 50% without having to make any architectural changes.&lt;br /&gt;
&lt;br /&gt;
ALPHA-g continues to build on the foundation, but because a 2 meter long Si strip detector is not practical, a TPC gas detector will be used instead.&lt;br /&gt;
&lt;br /&gt;
= Scope and Assumptions =&lt;br /&gt;
&lt;br /&gt;
Similar to ALPHA-2, ALPHA-g will consist of several computer controls systems in addition to data acquisition for the annihilation imaging detector.&lt;br /&gt;
&lt;br /&gt;
There will be Labview and CompactPCI-based control systems for trap vacuum, for magnet controls, for positron source controls, for trap controls, for microwave and laser system controls.&lt;br /&gt;
&lt;br /&gt;
All these systems are outside the scope of this document, except where, same as in ALPHA-2, they will log data into the MIDAS history system via network socket connections.&lt;br /&gt;
&lt;br /&gt;
The data acquisition system for the particle detector includes a number of hardware components - digitizers for analog signals, firmware-based signal processing, trigger decision making, etc.&lt;br /&gt;
&lt;br /&gt;
All these components are outside of the scope of this document, except where they require network communications for receiving experiment data, for configuration management and for monitoring. For details on the electronics see TRI-DN-16-15.&lt;br /&gt;
&lt;br /&gt;
Thus the scope of this document is limited to the software (and to hardware required to run it) that receives experiment data across the network, communicates with other hardware and software systems over the network.&lt;br /&gt;
&lt;br /&gt;
= Definitions and Abbreviations =&lt;br /&gt;
&lt;br /&gt;
General acronyms or terms used for the ALPHA-g experiment&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| rTPC&lt;br /&gt;
| Radial Time projection Chamber&lt;br /&gt;
|-&lt;br /&gt;
| AD&lt;br /&gt;
| Antiproton Decelerator (CERN building where ALPHA-g is installed)&lt;br /&gt;
|-&lt;br /&gt;
| Trap&lt;br /&gt;
| Device where the Antihydrogen annihilation take place within the cryostat.&lt;br /&gt;
|-&lt;br /&gt;
| AW&lt;br /&gt;
| TPC Anode Wires&lt;br /&gt;
|-&lt;br /&gt;
| BSC&lt;br /&gt;
| Barrel Scintillator Detector&lt;br /&gt;
|-&lt;br /&gt;
| GRIFFIN&lt;br /&gt;
| Major Experiment facility at TRIUMF&lt;br /&gt;
|-&lt;br /&gt;
| ALPHA-16, ALPHA-T, FMC-32&lt;br /&gt;
| Similar electronics designed and built at Triumf for Griffin&lt;br /&gt;
|-&lt;br /&gt;
| MIDAS&lt;br /&gt;
| Data Acquisition software package from PSI &amp;amp;amp; TRIUMF&lt;br /&gt;
|-&lt;br /&gt;
| MIDAS ODB&lt;br /&gt;
| Shared memory tree-structured database&lt;br /&gt;
|-&lt;br /&gt;
| SiPM&lt;br /&gt;
| Solid-state light sensors used in the BSC detector&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| TPC AFTER ASIC&lt;br /&gt;
| Custom chip from Saclay for recording TPC analog signals&lt;br /&gt;
|-&lt;br /&gt;
| TPC pad board (FEAM)&lt;br /&gt;
| TPC Electronics signed and build at TRIUMF for ALPHA-g&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Table 1 – ALPHA-g Abbreviations&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= References and related Document =&lt;br /&gt;
&lt;br /&gt;
[http://midas.triumf.ca Midas documentation]&lt;br /&gt;
&lt;br /&gt;
[https://daq.triumf.ca/elog-alphag/alphag/ Experiment Elog (restricted)]&lt;br /&gt;
&lt;br /&gt;
[https://daq.triumf.ca/DaqWiki/index.php/Components Alpha-g Component Wiki]&lt;br /&gt;
&lt;br /&gt;
[https://edev-group.triumf.ca/fw/exp/alphag Edev-gitalb repository (restricted)]&lt;br /&gt;
&lt;br /&gt;
TRI-DN-16-15: ALPHA-G Detector Electronics&lt;br /&gt;
&lt;br /&gt;
= Specifications =&lt;br /&gt;
&lt;br /&gt;
The Data Acquisition system is overlooking all the detector parameters settings and manage the collection, analysis, recording and monitoring of the detector incoming data. These tasks can be described as follow.&lt;br /&gt;
&lt;br /&gt;
== Handling of experiment data ==&lt;br /&gt;
&lt;br /&gt;
Experiment data will arrive over multiple 1GigE network links into the main DAQ computer, will be processed and transmitted to permanent storage at the main CERN data center, also across a 1GigE link.&lt;br /&gt;
&lt;br /&gt;
The existing network link from CERN shared by ALPHA-2 and ALPHA-g runs at 1GigE speed and the collaboration does not plan to request that CERN upgrade this link to 10GigE or faster speed.&lt;br /&gt;
&lt;br /&gt;
This limits the overall data throughput to 100 Mbytes/sec shared with ALPHA-2 (which in turn is limited to 20-30 Mbytes/sec).&lt;br /&gt;
&lt;br /&gt;
A Local Network switch (96x1GigE) gather all the different data sources such as:&lt;br /&gt;
&lt;br /&gt;
* 16 AW and BSC digitizers (FMC-32, ALPHA-16)&lt;br /&gt;
** The 512 Anode wires channels (256 wires readout both ends) are digitized with 16 FMC-32 mezzanines of the ALPHA-16). Each ALPHA-16 has an Ethernet data link to the main LAN switch.&lt;br /&gt;
** The 128 channels of the BSB are collected through the same ALPHA-16 boards.&lt;br /&gt;
* 64 FEAMs cathode pad readout&lt;br /&gt;
** The 18432 cathode pads are digitized with 64 FEAMs which each has a optical Ethernet link to the main LAN switch.&lt;br /&gt;
** &lt;br /&gt;
* The ALPHA-T trigger board has a link to the main LAN switch as well.&lt;br /&gt;
* Barrel Scintillator TDC (see Electronics document)&lt;br /&gt;
&lt;br /&gt;
A total of 82 x 1GigE ports out of the 96 from the switch are allocated to the main detector operation.&lt;br /&gt;
&lt;br /&gt;
==  ==&lt;br /&gt;
&lt;br /&gt;
== Handling of Labview and Trap sequencer data ==&lt;br /&gt;
&lt;br /&gt;
Same as in ALPHA-2, there will be a special MIDAS frontend to receive data from labview-based control systems (vacuum, magnets, trap sequencer, etc.). Data communication protocol and data format will be the same in ALPHA-2.&lt;br /&gt;
&lt;br /&gt;
== Configuration data ==&lt;br /&gt;
&lt;br /&gt;
All configuration data will be stored in the MIDAS ODB database.&lt;br /&gt;
&lt;br /&gt;
Major configuration items:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Trigger configuration (multiplicity settings, channel mapping, dead channel blanking, etc.)&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;AW and BSC digitizer settings&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;TPC pad board settings and AFTER ASIC settings (FEAMs)&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;UPS uninterruptible power supply with battery backup and &amp;amp;quot;double conversion&amp;amp;quot; power conditioning&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;== Slow Controls data ==&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All slow controls settings will be stored in the MIDAS ODB database. Slow controls data will be logged through the MIDAS history system. Integration with the ALPHA-II DAQ system will require additional transfer of ALPHA-g control data to it. This being done in MySQL format.&lt;br /&gt;
&lt;br /&gt;
Major slow controls items:&lt;br /&gt;
&lt;br /&gt;
* Low voltage power supply controls&lt;br /&gt;
* High voltage power supply controls&lt;br /&gt;
* Environment monitoring (temperature probes, etc.)&lt;br /&gt;
* SiPM bias voltage controls&lt;br /&gt;
* TPC gas system control and monitoring&lt;br /&gt;
* TPC calibration system controls&lt;br /&gt;
* cooling system control and monitoring&lt;br /&gt;
* UPS monitoring&lt;br /&gt;
&lt;br /&gt;
Some slow controls components will have software interlocks for non-safety critical protection of equipment, such as automatic shutdown of electronics on overheating, automatic shutdown of detectors on UPS alarms (i.e. loss of external AC power).&lt;br /&gt;
&lt;br /&gt;
(It is assumed that safety-critical interlocks will be implemented in hardware, this is outside the scope of this particular document).&lt;br /&gt;
&lt;br /&gt;
= Trigger consideration =&lt;br /&gt;
&lt;br /&gt;
The Alpha-g physics experiment follows different particle trapping stages such as: Positron accumulation, Antiproton accumulation, mixing stage for formation of anti-hydrogen in the trap and annihilation stage for the actual measurement. The whole cycle takes several minutes and needs to be constantly monitored with the detector to ensure that external background events (cosmics, noise) are properly identified by the detector and that annihilation events from the trap are all recorded for further analysis. This is mainly done using the barrel scintillator which will record external incoming events and internal trapped events (annihilation). Timing analysis will resolve the distinction of the two main sources of events.&lt;br /&gt;
&lt;br /&gt;
Therefore the barrel scintillator is the main contributor to the trigger decision. Additional information from the anode wires is beneficial even though its timing is extremely loose due to the implicit drift time range of the detector.&lt;br /&gt;
&lt;br /&gt;
The Trigger decision is based initially on simple multiplicity of the barrel scintillator detector which tags the event to record. This multiplicity is computed in each of the 16 Alpha-16 boards and transmitted to the Mater Trigger Module (Alpha-T). There the individual fragments are matched in time and final trigger decision is taken, which in turn will be redistributed to all the acquisition modules.&lt;br /&gt;
&lt;br /&gt;
In case the anode wire information is needed as well, the same fragment collection scheme is done for the wire and sent through the same physical link as the Alpha-16 modules are populated with the 32 channels at 62.5Msps mezzanine (FMC-32).&lt;br /&gt;
&lt;br /&gt;
The Data Acquisition system (MIDAS) will not be taking part to the trigger decision, therefore will have no interaction with the hardware for the trigger decision. The data stream will constantly be pulled from Ethernet of the acquisition modules and an “event builder” application using the timestamp information attached to each received packet for fragment reassembly. The hardware trigger module (ALPHA-T) will keep track of the trigger decision and produce trigger data which merged to the main data acquisition stream.&lt;br /&gt;
&lt;br /&gt;
= Midas Software configuration =&lt;br /&gt;
&lt;br /&gt;
For maximum familiarity, similarity and compatibility with the existing ALPHA-2 system, ALPHA-g will also use the MIDAS data acquisition software package.&lt;br /&gt;
&lt;br /&gt;
The main features of MIDAS is a modern web-based user interface, good robustness, high reliability and high scalability. The system is easy to operate by non-experts.&lt;br /&gt;
&lt;br /&gt;
Outside of ALPHA-2 at CERN, other major users of MIDAS are TIGRESS and GRIFFIN at TRIUMF, MEG at PSI, DEAP at SNOLAB, T2K/ND280 at JPARC (Japan).&lt;br /&gt;
&lt;br /&gt;
Similar to ALPHA-2 the MIDAS software will be running on one single high-end computer with an Intel socket 1151 CPU and 32/64 GB RAM. This is adequate for achieving the 100 Mbytes/sec data rates expected for ALPHA-g. During tests of 10GigE networking for the GRIFFIN experiment at TRIUMF this type of hardware was capable of recording 1000 Mbytes/sec of data from network to disk. The required disk I/O capability will be absent in ALPHA-g. The intention is to stream the data directly to CASTOR data storage provided by CERN.&lt;br /&gt;
&lt;br /&gt;
This computer will have 2 1GigE network interfaces, one for connecting to the CERN network, the second for connecting to the ALPHA-g private network.&lt;br /&gt;
&lt;br /&gt;
Data storage will be dual mirrored (RAID1) SSDs for the operating system and home directories and dual mirrored (RAID1) 6TB HDDs for local data storage.&lt;br /&gt;
&lt;br /&gt;
The MIDAS software running on this computer will have following components:&lt;br /&gt;
&lt;br /&gt;
* Mhttpd - the MIDAS web server providing the main user interface for running the system&lt;br /&gt;
* Mlogger - the MIDAS data logger for writing experiment data to local storage and for recording MIDAS slow controls history data&lt;br /&gt;
* Lazylogger - for moving experiment data from local storage to permanent storage at the CERN data center (EOS and Castor).&lt;br /&gt;
* MIDAS frontend programs custom written to receive experiment data&lt;br /&gt;
* The event builder - for assembling experiment data from different frontends into events to simplify further analysis. The event builder will have code for initial data quality tests (correct data formatting, correct event timestamps, etc.).&lt;br /&gt;
* The online analyzer - for initial data analysis, visualization and additional data quality checks.&lt;br /&gt;
&lt;br /&gt;
The MIDAS frontend programs are written using a common template, with each frontend program specialized to receive data in the format of the attached equipment:&lt;br /&gt;
&lt;br /&gt;
* Frontend for AW and BSC digitizers - receive data from ALPHA-16 digitizers using TCP and UDP network socket connections (will use a modification of the frontend from GRIFFIN), provide configuration and monitoring (slow controls) of the digitizers.&lt;br /&gt;
* Frontend for the TPC pad boards - receive data from the TPC using TCP and UDP network socket connections. This frontend will also provide configuration and monitoring (slow controls) of the TPC pad boards and of the TPC AFTER ASICs.&lt;br /&gt;
* Frontend for the clock board - configuration and control of the clock board using UDP and TCP network connections.&lt;br /&gt;
* Frontends for slow controls, according to equipment (see list in the &amp;amp;quot;specification&amp;amp;quot; section). Most frontend programs will be reused from previous experiments (i.e. UPS monitoring frontends from DEAP, ALPHA-II).&lt;br /&gt;
&lt;br /&gt;
Data from all the hardware components arrives through the MIDAS frontend programs asynchronously. This makes further analysis and data quality tests rather difficult. To rearrange the data into sensible pieces MIDAS provides an event builder component.&lt;br /&gt;
&lt;br /&gt;
The event builder program is usually written specifically for each experiment (also using a MIDAS template). The ALPHA-g event builder will check incoming data for basic correctness, assemble event fragments from different frontends into coherent events, and check timestamps and event numbers, possibly apply additional data reduction and data compression algorithms. We expect to reuse the multi-threaded event builder developed for DEAP as the basis of the ALPHA-g event builder.&lt;br /&gt;
&lt;br /&gt;
The online analyzer will look at a sample of events produced by the event builder and produce histograms and other plots of most important quantities (pulse heights, timing, etc) to confirm correct function of the detector components (i.e. each TPC pad produces hits) and of the detector as whole (i.e. hit multiplicity in the TPC pads matches hit multiplicity in the TPC AW and in the BSC). We do not expect to do full tracking and vertex reconstruction in the online analyzer - this will be done in the &amp;amp;quot;near offline&amp;amp;quot; analysis using the CERN data center resources (similar to ALPHA-2 procedures).&lt;br /&gt;
&lt;br /&gt;
The mlogger component writes MIDAS data to local disk (or remote disk using NFS or UNIX pipe methods) and provides standard data compression (gzip-1 by default, bzip2 for maximum compression and LZ4 for maximum speed). As an option CRC32c and SHA-256/SHA-512 checksums can be computed to detect data corruption.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Figure 1, 2&#039;&#039; and the diagram below illustrate the data flow described in this section:&lt;br /&gt;
&lt;br /&gt;
[[File:media/image2.png|576x386px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;_Toc493687873&amp;quot; class=&amp;quot;anchor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;Figure 1 - Overall dataflow for scheme from the detector to the data storage area.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:media/image3.png|536x343px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;_Ref489943269&amp;quot; class=&amp;quot;anchor&amp;quot;&amp;gt;&amp;lt;span id=&amp;quot;_Toc493687874&amp;quot; class=&amp;quot;anchor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;Figure 2 - Frontend local fragment assembly, similar data for the event builder. Each grey box refers to a Thread collecting and filtering locally its fragment before making it available to the fragment builder &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Computer Network configuration =&lt;br /&gt;
&lt;br /&gt;
Operation of the ALPHA-g experiment will involve 2 computer networks: the ALPHA-g private network and the CERN network.&lt;br /&gt;
&lt;br /&gt;
The private network is required to isolate experiment data traffic from the CERN network data traffic (this was not required for ALPHA-2, where there is no private network) and to restrict access to network-attached slow controls devices (power supplies, gas system controllers, etc.).&lt;br /&gt;
&lt;br /&gt;
This private network (192.168.x.y) will be connected to 2x 1GigE network switches (96, 24ports). The first one will connect all the FEAM (64) and the ALPHA-16 (16). The other networked equipment such as the slow controls/monitoring devices etc, will be connected to the second switch (24 ports).&lt;br /&gt;
&lt;br /&gt;
The 1GigE network port of the main data acquisition computer will connect to the CERN network for transmitting experiment data to the CERN data center, for receiving experiment data from the Labview based control systems (which are outside of the scope of the particle detector and of this document).&lt;br /&gt;
&lt;br /&gt;
The CERN network currently consists of a single fiber 1GigE network link feeding a small (24-port) 1GigE network switch in the experiment counting room. It is not anticipated that CERN will upgrade this link to higher speeds (10GigE, etc.) within the lifetime of ALPHA-g and it is not expected that ALPHA-g will ever require these higher speeds because excessive amount of data recorded to CERN storage will create significant problems for data analysis. If the detector produces too much data, it will be handled by using stronger data reduction and data compression algorithms.&lt;br /&gt;
&lt;br /&gt;
The ALPHA-g data acquisition computer will provide one-way network gateway connection from the private network to the CERN network using Linux based NAT. This is required to provide devices attached to the private network with access to DNS, NTP and other network services, i.e. for installing software and firmware updates.&lt;br /&gt;
&lt;br /&gt;
This configuration is very similar to what is in use by the DEAP experiment at SNOLAB. The main difference is ALPHA-g will run the main data acquisition and NAT/gateway services on the same computers as opposed to two separate computers at DEAP.&lt;br /&gt;
&lt;br /&gt;
= Computer Security considerations =&lt;br /&gt;
&lt;br /&gt;
In the ALPHA-2 and ALPHA-g experiments, p-bar beam time is very precious and any disturbances during beam data taking must be minimized.&lt;br /&gt;
&lt;br /&gt;
One the computer network side, the ALPHA-g data acquisition system needs to be protected from:&lt;br /&gt;
&lt;br /&gt;
* Unauthorized access to proprietary information&lt;br /&gt;
* Unauthorized access to network-controlled devices (power supplies, etc.)&lt;br /&gt;
* Sundry network disturbances (unwanted network port scans, unwanted web scans, accidental or malicious denial-of-service attacks, etc.).&lt;br /&gt;
&lt;br /&gt;
It is important to note that the CERN network is isolated from the main Internet by the CERN firewall. Generally, the CERN firewall allows all outgoing traffic rom CERN to the Internet (can be selectively blocked by special request to CERN IT), but blocks all incoming traffic, except where specifically permitted. A typical machine connected to the CERN network can talk to anywhere in the Internet, but from the Internet, only &amp;amp;quot;ping&amp;amp;quot; is permitted. &amp;amp;quot;ssh&amp;amp;quot; access is disabled (one is supposed to ssh gateways at lxplus.cern.ch) and &amp;amp;quot;http&amp;amp;quot; access is allowed by special permission from CERN IT.&lt;br /&gt;
&lt;br /&gt;
Thus we do not need to worry about protecting the ALPHA-g data acquisition system against &amp;amp;quot;global Internet&amp;amp;quot; threats (the CERN firewall does this job). Protection is required only against access from other machines attached to the CERN network, which can be generally considered as non-malicious. Still, over the years of operating ALPHA and ALPHA-2, we have seen unwanted network scans (that required special hardening of MIDAS) and other strange activity.&lt;br /&gt;
&lt;br /&gt;
The security model of ALPHA-g combines the security features of ALPHA-2 and the security features of DEAP (at SNOLAB).&lt;br /&gt;
&lt;br /&gt;
Access to the MIDAS Web server will be exclusively through the apache httpd proxy with password-protected HTTPS connections (same as in ALPHA, ALPHA-2 and DEAP).&lt;br /&gt;
&lt;br /&gt;
Access to machines in the private network will be generally blocked (by Linux firewall rules and NAT). Exceptions like access to UPS controls, webcams, etc. will be via the http proxy, with password-protected HTTPS connections, same as in DEAP.&lt;br /&gt;
&lt;br /&gt;
Access to MIDAS ports in the data acquisition computer will be blocked by Linux firewall rules. Exceptions will be made for specific connections such as Labview controls sending data to MIDAS.&lt;br /&gt;
&lt;br /&gt;
In ALPHA, ALPHA-2 and DEAP the apache httpd proxy server runs on a separate machine. In ALPHA-g we may run it on the same machine as the main data acquisition, subject to approval by CERN (they have to open HTTPS access in the CERN firewall - from the Internet to the HTTPS port on the ALPHA-g DAQ computer).&lt;br /&gt;
&lt;br /&gt;
Over the many years of operating ALPHA, ALPHA-2, DEAP and other similarly configured experiments, this security model has worked well for us, with no complaints from experiment users and no security incidents.&lt;br /&gt;
&lt;br /&gt;
= Safety and Hazard considerations =&lt;br /&gt;
&lt;br /&gt;
There are no safety and hazard concerns about any software or equipment inside the scope of this document.&lt;br /&gt;
&lt;br /&gt;
All hardware consists of commodity computer components (computers, network switches, etc.) that carries appropriate government safety certifications (i.e. CSA in Canada).&lt;br /&gt;
&lt;br /&gt;
All software and software controlled equipment will have hardware-enforced limits and interlocks to ensure safe operation even in case of software failure. (This is outside the scope of this document, for more information, please refer to documents or each relevant hardware component).&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=820</id>
		<title>Laser calibration</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=820"/>
		<updated>2017-05-12T00:31:42Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
Both the prototype and final TPC have aluminium strips on the central cathode that are intended for laser calibration. To that end a plane of UV laser light is sent into the TPC intersecting with the strips. Each laser pulse should then create a bunch of electrons with well defined position and time at each of the strips.&lt;br /&gt;
&lt;br /&gt;
== Photoelectron efficiency tests ==&lt;br /&gt;
One worry with the intended geometry is that the laser hits the far strips at a very glancing angle, and it was assumed the photoelectron efficiency (i.e. number of photoelectrons per photon) would go down in favour of reflection. To prevent this two methods of surface treatment were considered, and both the validity of the aforementioned assumption as well as the effectiveness of the treatments were investigated in a test setup at UBC. Details and results are given in this [[Media:LaserTests.pdf|report]].&lt;br /&gt;
&lt;br /&gt;
== Laser operating procedure ==&lt;br /&gt;
The following describes the standard operating procedure for running the laser setup on the prototype.&lt;br /&gt;
[[File:Control.jpg|thumb|Handheld control unit]]&lt;br /&gt;
&lt;br /&gt;
=== Safety ===&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&#039;&#039;NEVER have the key inserted in the &amp;quot;ignition&amp;quot; when the optical fiber is disconnected, the black box is open, or the TPC is open (e.g. gas lines disconnected).&#039;&#039;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
=== Start-up ===&lt;br /&gt;
[[File:Shutter.jpg|thumb|Manual shutter: left open, right closed]]&lt;br /&gt;
# Check integrity of enclosure, i.e. optics box closed and bolted down, fiber attached at both ends.&lt;br /&gt;
# Turn on laser system with key on main unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Ready&amp;quot; on handheld unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
# Set collimator via mvat program on computer.&lt;br /&gt;
# Open manual shutter on laser head.&lt;br /&gt;
# Push button &amp;quot;Q-switch -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
&lt;br /&gt;
=== Pause ===&lt;br /&gt;
==== Short pause ====&lt;br /&gt;
Simply push stop/start for Q-switch.&lt;br /&gt;
==== Longer pause ====&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# After pause restart according to after-key part of start-up procedure.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# Wait a few minutes for cool-down.&lt;br /&gt;
# Turn off and remove key.&lt;br /&gt;
&lt;br /&gt;
=== General best practice ===&lt;br /&gt;
* Limit laser shots to a minimum, to reduce wear on laser, flash lamp, and fiber.&lt;br /&gt;
* To that end, do non-critical steps like attenuator setting and DAQ start before starting Q-switch.&lt;br /&gt;
* Ideally allow system some time to warm up between turning on flash lamp and Q-switch.&lt;br /&gt;
&lt;br /&gt;
== Optics ==&lt;br /&gt;
&lt;br /&gt;
== Laser requirements ==&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=819</id>
		<title>Laser calibration</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=819"/>
		<updated>2017-05-12T00:29:47Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: Safety notice&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
Both the prototype and final TPC have aluminium strips on the central cathode that are intended for laser calibration. To that end a plane of UV laser light is sent into the TPC intersecting with the strips. Each laser pulse should then create a bunch of electrons with well defined position and time at each of the strips.&lt;br /&gt;
&lt;br /&gt;
== Photoelectron efficiency tests ==&lt;br /&gt;
One worry with the intended geometry is that the laser hits the far strips at a very glancing angle, and it was assumed the photoelectron efficiency (i.e. number of photoelectrons per photon) would go down in favour of reflection. To prevent this two methods of surface treatment were considered, and both the validity of the aforementioned assumption as well as the effectiveness of the treatments were investigated in a test setup at UBC. Details and results are given in this [[Media:LaserTests.pdf|report]].&lt;br /&gt;
&lt;br /&gt;
== Laser operating procedure ==&lt;br /&gt;
The following describes the standard operating procedure for running the laser setup on the prototype.&lt;br /&gt;
[[File:Control.jpg|thumb|Handheld control unit]]&lt;br /&gt;
&lt;br /&gt;
=== Safety ===&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&#039;&#039;NEVER have the key inserted in the &amp;quot;ignition&amp;quot; when the optical fiber is disconnected, the black box is open, or the TPC is open (e.g. gas lines disconnected).&#039;&#039;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
=== Start-up ===&lt;br /&gt;
# Check integrity of enclosure, i.e. optics box closed and bolted down, fiber attached at both ends.&lt;br /&gt;
# Turn on laser system with key on main unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Ready&amp;quot; on handheld unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
# Set collimator via mvat program on computer.&lt;br /&gt;
# Open manual shutter on laser head.&lt;br /&gt;
[[File:Shutter.jpg|thumb|Manual shutter: left open, right closed]]&lt;br /&gt;
# Push button &amp;quot;Q-switch -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
&lt;br /&gt;
=== Pause ===&lt;br /&gt;
==== Short pause ====&lt;br /&gt;
Simply push stop/start for Q-switch.&lt;br /&gt;
==== Longer pause ====&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# After pause restart according to after-key part of start-up procedure.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# Wait a few minutes for cool-down.&lt;br /&gt;
# Turn off and remove key.&lt;br /&gt;
&lt;br /&gt;
=== General best practice ===&lt;br /&gt;
* Limit laser shots to a minimum, to reduce wear on laser, flash lamp, and fiber.&lt;br /&gt;
* To that end, do non-critical steps like attenuator setting and DAQ start before starting Q-switch.&lt;br /&gt;
* Ideally allow system some time to warm up between turning on flash lamp and Q-switch.&lt;br /&gt;
&lt;br /&gt;
== Optics ==&lt;br /&gt;
&lt;br /&gt;
== Laser requirements ==&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=818</id>
		<title>Laser calibration</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=818"/>
		<updated>2017-05-12T00:07:50Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: Laser operating procedure&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
Both the prototype and final TPC have aluminium strips on the central cathode that are intended for laser calibration. To that end a plane of UV laser light is sent into the TPC intersecting with the strips. Each laser pulse should then create a bunch of electrons with well defined position and time at each of the strips.&lt;br /&gt;
&lt;br /&gt;
== Photoelectron efficiency tests ==&lt;br /&gt;
One worry with the intended geometry is that the laser hits the far strips at a very glancing angle, and it was assumed the photoelectron efficiency (i.e. number of photoelectrons per photon) would go down in favour of reflection. To prevent this two methods of surface treatment were considered, and both the validity of the aforementioned assumption as well as the effectiveness of the treatments were investigated in a test setup at UBC. Details and results are given in this [[Media:LaserTests.pdf|report]].&lt;br /&gt;
&lt;br /&gt;
== Laser operating procedure ==&lt;br /&gt;
The following describes the standard operating procedure for running the laser setup on the prototype.&lt;br /&gt;
[[File:Control.jpg|thumb|Handheld control unit]]&lt;br /&gt;
&lt;br /&gt;
=== Start-up ===&lt;br /&gt;
# Check integrity of enclosure, i.e. optics box closed and bolted down, fiber attached at both ends.&lt;br /&gt;
# Turn on laser system with key on main unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Ready&amp;quot; on handheld unit.&lt;br /&gt;
# Push button &amp;quot;Flash lamp -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
# Set collimator via mvat program on computer.&lt;br /&gt;
# Open manual shutter on laser head.&lt;br /&gt;
[[File:Shutter.jpg|thumb|Manual shutter: left open, right closed]]&lt;br /&gt;
# Push button &amp;quot;Q-switch -&amp;gt; Start&amp;quot; on handheld unit.&lt;br /&gt;
&lt;br /&gt;
=== Pause ===&lt;br /&gt;
==== Short pause ====&lt;br /&gt;
Simply push stop/start for Q-switch.&lt;br /&gt;
==== Longer pause ====&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# After pause restart according to after-key part of start-up procedure.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
# Stop Q-switch.&lt;br /&gt;
# Stop flash lamp.&lt;br /&gt;
# Close manual shutter.&lt;br /&gt;
# Wait a few minutes for cool-down.&lt;br /&gt;
# Turn off and remove key.&lt;br /&gt;
&lt;br /&gt;
=== General best practice ===&lt;br /&gt;
* Limit laser shots to a minimum, to reduce wear on laser, flash lamp, and fiber.&lt;br /&gt;
* To that end, do non-critical steps like attenuator setting and DAQ start before starting Q-switch.&lt;br /&gt;
* Ideally allow system some time to warm up between turning on flash lamp and Q-switch.&lt;br /&gt;
&lt;br /&gt;
== Optics ==&lt;br /&gt;
&lt;br /&gt;
== Laser requirements ==&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=File:Shutter.jpg&amp;diff=817</id>
		<title>File:Shutter.jpg</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=File:Shutter.jpg&amp;diff=817"/>
		<updated>2017-05-12T00:06:34Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Manual shutter: left open, right closed&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=File:Control.jpg&amp;diff=816</id>
		<title>File:Control.jpg</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=File:Control.jpg&amp;diff=816"/>
		<updated>2017-05-12T00:04:47Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Handheld control unit&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Cathode_Pad_Electronics&amp;diff=815</id>
		<title>Cathode Pad Electronics</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Cathode_Pad_Electronics&amp;diff=815"/>
		<updated>2017-05-05T00:33:42Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The cathode pads are read-out by AFTER ASIC. One chip has 72 active channels and 4 reference channels for pedestal subtraction. Each channel consists of charge-sensitive preamplifier, pole-zero cancellation of preamplifier decay time, RC2 shaper and 512-cell SCA to store waveform. Amplifier gain, pole-zero time constant and shaping time are programmable.&lt;br /&gt;
Detailed information is in the manual, but the most relevant slow control settings are summarized in the following tables.&lt;br /&gt;
&lt;br /&gt;
The full range of the AFTER chip and the ADC is ±1V, the gain setting determines what charge that corresponds to, leading to a gain value.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gain setting !! Charge range (fC) !! Gain (mV/fC)&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 120 || 8.333&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 240 || 4.167&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 360 || 2.778&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 600 || 1.667&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The peaking time is defined as the time the pulse takes to go from 5% to 100% pulse height.&lt;br /&gt;
This peaking time translates to other relevant times as shown in the next table.&lt;br /&gt;
[[File:Shape.png|thumb|Illustration of various time characteristics of the filtered AFTER signal]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Peaking time (5%-100%) !! Fall time (100%-5%) !! FWHM !! Rise time (50%-100%) !! Fall time (100%-50%)&lt;br /&gt;
|-&lt;br /&gt;
| 116.7 || 202.5 || 158.4 || 67.59 || 90.82&lt;br /&gt;
|-&lt;br /&gt;
| 200 || 438.2 || 311.6 || 121.3 || 190.3&lt;br /&gt;
|-&lt;br /&gt;
| 505 || 1194 || 843 || 329.2 || 513.7&lt;br /&gt;
|-&lt;br /&gt;
| 993 || 2351 || 1689 || 656.1 || 1033&lt;br /&gt;
|-&lt;br /&gt;
| 1912 || 4283 || 3213 || 1268 || 1945&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Phenomenologically the pulse shape can be described by the function&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(t)=\left(\frac{t}{k\tau}\right)^k \exp\left(k-\frac{t}{\tau}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Extracting the above mentioned rise and fall times from this formula for different values for the parameter k yields a relatively good match for &amp;lt;math&amp;gt;k=4&amp;lt;/math&amp;gt;. The resulting numerical relationship between peaking time &amp;lt;math&amp;gt;t_r&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; from this is&lt;br /&gt;
&amp;lt;math&amp;gt;t_r = 3.1365\tau&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following tables contains the 5%-100% rise times for the different AFTER settings together with the corresponding value for &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Time setting !! Peaking time (ns) !! &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (ns)&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 116 || 37.0&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||200 || 63.8&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 412 || 131.4&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 505 || 161.0&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 610 || 194.5&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 695 || 221.6&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 912 || 290.8&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 993 || 316.6&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 1054 || 336.0&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 1134 || 361.5&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 1343 || 428.2&lt;br /&gt;
|-&lt;br /&gt;
| 11  ||1421 || 453.1&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 1546 || 492.9&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 1626 || 518.4&lt;br /&gt;
|-&lt;br /&gt;
| 14 || 1834 || 584.7&lt;br /&gt;
|-&lt;br /&gt;
| 15 || 1912 || 609.6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reference ===&lt;br /&gt;
[[File: AFTER_MANUAL_v2.pdf]]&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Cathode_Pad_Electronics&amp;diff=814</id>
		<title>Cathode Pad Electronics</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Cathode_Pad_Electronics&amp;diff=814"/>
		<updated>2017-05-04T23:15:45Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The cathode pads are read-out by AFTER ASIC. One chip has 72 active channels and 4 reference channels for pedestal subtraction. Each channel consists of charge-sensitive preamplifier, pole-zero cancellation of preamplifier decay time, RC2 shaper and 512-cell SCA to store waveform. Amplifier gain, pole-zero time constant and shaping time are programmable.&lt;br /&gt;
Detailed information is in the manual, but the most relevant slow control settings are summarized in the following tables.&lt;br /&gt;
&lt;br /&gt;
The full range of the AFTER chip and the ADC is ±1V, the gain setting determines what charge that corresponds to, leading to a gain value.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gain setting !! Charge range (fC) !! Gain (mV/fC)&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 120 || 8.333&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 240 || 4.167&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 360 || 2.778&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 600 || 1.667&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The peaking time is defined as the time the pulse takes to go from 5% to 100% pulse height.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Time setting !! Peaking time (ns)&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 116&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||200&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 412&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 505&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 610&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 695&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 912&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 993&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 1054&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 1134&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 1343&lt;br /&gt;
|-&lt;br /&gt;
| 11  ||1421&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 1546&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 1626&lt;br /&gt;
|-&lt;br /&gt;
| 14 || 1834&lt;br /&gt;
|-&lt;br /&gt;
| 15 || 1912&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This peaking time translates to other relevant times as shown in the next table.&lt;br /&gt;
[[File:Shape.png|thumb|Illustration of various time characteristics of the filtered AFTER signal]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Peaking time (5%-100%) !! Fall time (100%-5%) !! FWHM !! Rise time (50%-100%) !! Fall time (100%-50%)&lt;br /&gt;
|-&lt;br /&gt;
| 116.7 || 202.5 || 158.4 || 67.59 || 90.82&lt;br /&gt;
|-&lt;br /&gt;
| 200 || 438.2 || 311.6 || 121.3 || 190.3&lt;br /&gt;
|-&lt;br /&gt;
| 505 || 1194 || 843 || 329.2 || 513.7&lt;br /&gt;
|-&lt;br /&gt;
| 993 || 2351 || 1689 || 656.1 || 1033&lt;br /&gt;
|-&lt;br /&gt;
| 1912 || 4283 || 3213 || 1268 || 1945&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reference ===&lt;br /&gt;
[[File: AFTER_MANUAL_v2.pdf]]&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Cathode_Pad_Electronics&amp;diff=813</id>
		<title>Cathode Pad Electronics</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Cathode_Pad_Electronics&amp;diff=813"/>
		<updated>2017-05-04T19:44:03Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The cathode pads are read-out by AFTER ASIC. One chip has 72 active channels and 4 reference channels for pedestal subtraction. Each channel consists of charge-sensitive preamplifier, pole-zero cancellation of preamplifier decay time, RC2 shaper and 512-cell SCA to store waveform. Amplifier gain, pole-zero time constant and shaping time are programmable.&lt;br /&gt;
Detailed information is in the manual, but the most relevant slow control settings are summarized in the following tables.&lt;br /&gt;
&lt;br /&gt;
The full range of the AFTER chip and the ADC is ±1V, the gain setting determines what charge that corresponds to, leading to a gain value.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gain setting !! Charge range (fC) !! Gain (mV/fC)&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 120 || 8.333&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 240 || 4.167&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 360 || 2.778&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 600 || 1.667&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The peaking time is defined as the time the pulse takes to go from 5% to 100% pulse height.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Time setting !! Peaking time (ns)&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 116&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||200&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 412&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 505&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 610&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 695&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 912&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 993&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 1054&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 1134&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 1343&lt;br /&gt;
|-&lt;br /&gt;
| 11  ||1421&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 1546&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 1626&lt;br /&gt;
|-&lt;br /&gt;
| 14 || 1834&lt;br /&gt;
|-&lt;br /&gt;
| 15 || 1912&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This peaking time translates to other relevant times as shown in the next table.&lt;br /&gt;
[[File:Shape.png|thumb|Illustration of various time characteristics of the filtered AFTER signal]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Peaking time (5%-100%) !! Fall time (100%-5%) !! FWHM !! Rise time (50%-100%) !! Fall time (100%-50%)&lt;br /&gt;
|-&lt;br /&gt;
| 116.7 || 202.5 || 158.4 || 67.59 || 90.82&lt;br /&gt;
|-&lt;br /&gt;
| 200 || 438.2 || 311.6 || 121.3 || 190.3&lt;br /&gt;
|-&lt;br /&gt;
| 505 || 1194 || 843 || 329.2 || 513.7&lt;br /&gt;
|-&lt;br /&gt;
| 993 || 2351 || 1689 || 656.1 || 1033&lt;br /&gt;
|-&lt;br /&gt;
| 1912 || 4283 || 3213 || 1268 || 1945&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=File:Shape.png&amp;diff=812</id>
		<title>File:Shape.png</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=File:Shape.png&amp;diff=812"/>
		<updated>2017-05-04T19:29:15Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Illustration of various time characteristics of the signal&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=796</id>
		<title>Laser calibration</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Laser_calibration&amp;diff=796"/>
		<updated>2017-02-18T03:56:47Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: Initial commit, including UBC test pdf&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
Both the prototype and final TPC have aluminium strips on the central cathode that are intended for laser calibration. To that end a plane of UV laser light is sent into the TPC intersecting with the strips. Each laser pulse should then create a bunch of electrons with well defined position and time at each of the strips.&lt;br /&gt;
&lt;br /&gt;
== Photoelectron efficiency tests ==&lt;br /&gt;
One worry with the intended geometry is that the laser hits the far strips at a very glancing angle, and it was assumed the photoelectron efficiency (i.e. number of photoelectrons per photon) would go down in favour of reflection. To prevent this two methods of surface treatment were considered, and both the validity of the aforementioned assumption as well as the effectiveness of the treatments were investigated in a test setup at UBC. Details and results are given in this [[Media:LaserTests.pdf|report]].&lt;br /&gt;
&lt;br /&gt;
== Optics ==&lt;br /&gt;
&lt;br /&gt;
== Laser requirements ==&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=File:LaserTests.pdf&amp;diff=795</id>
		<title>File:LaserTests.pdf</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=File:LaserTests.pdf&amp;diff=795"/>
		<updated>2017-02-18T03:52:07Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: Report of the UBC laser tests on the angle-dependence of photoelectron efficiency&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Report of the UBC laser tests on the angle-dependence of photoelectron efficiency&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Experiments&amp;diff=794</id>
		<title>Experiments</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Experiments&amp;diff=794"/>
		<updated>2017-02-18T03:41:58Z</updated>

		<summary type="html">&lt;p&gt;Lmartin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Alpha-G =&lt;br /&gt;
&lt;br /&gt;
* [[Components]]&lt;br /&gt;
* Sub-systems&lt;br /&gt;
** [[rTPC Detector]]&lt;br /&gt;
** [[Data Acquisition Infrastructure]]&lt;br /&gt;
** [[Anode Wire Electronics]]&lt;br /&gt;
** [[Cathode Pad Electronics]]&lt;br /&gt;
** [[Backend Electronics]]&lt;br /&gt;
** [[Laser calibration]]&lt;br /&gt;
** [[Water cooling system]]&lt;br /&gt;
** [[Gas System]]&lt;br /&gt;
** [[Dry Air flushing system]]&lt;br /&gt;
** [[Barrel Scintillator detector]]&lt;br /&gt;
** [[Barrel Scintillator Electronics]]&lt;/div&gt;</summary>
		<author><name>Lmartin</name></author>
	</entry>
</feed>