Linux: Difference between revisions
No edit summary |
|||
(194 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
A collection of notes on using Linux systems. | |||
Notes here are for Ubuntu but should work on similar debian derivative distros. | |||
==Basic Terminal Commands== | |||
{{see also | Bash (Unix shell)}} | |||
===List=== | |||
<code>ls</code> | |||
* <code>-l</code> shows long format | |||
* <code>-a</code> shows all files including hidden files, current directory <code>.</code>, and parent directory <code>..</code>. | |||
** <code>-A</code> omits <code>.</code> and <code>..</code> | |||
* <code>-h</code> human readable file sizes | |||
* <code>-s</code> shows blocks taken up by the file (i.e. size on disk) | |||
There are also other commands like <code>lsblk</code>, <code>lscpu</code>, <code>lshw</code>. | |||
===Disk Space=== | |||
* <code>du</code> Disk Usage | |||
** <code>du -sh</code> Show size of current directory | |||
** <code>du -h --max-depth=1</code> Show size of files and folders in current directory. I have <code>du</code> aliased to this. | |||
** Flags: | |||
*** <code>-h</code> human readable (adds M or G) | |||
*** <code>--max-depth</code> depth to recurse. Default is <code>N</code>. | |||
* <code>df</code> Disk Filesystems | |||
** Shows usage, total space available, and mount position | |||
** <code> df -Ph .</code> See free space in current directory | |||
If looking to free up space, I recommend installing <code>ncdu</code>. | |||
===Monitoring=== | |||
* <code>htop</code> - basic terminal system monitor, enhanced version of <code>top</code> | |||
* <code>watch -n 0.5 <program></code> - repeatedly call <program> every 0.5 seconds | |||
===Standard Streams=== | |||
* <code>|</code> will pipe stdout to the stdin of another process | |||
* <code>></code> will redirect stdout to a file | |||
* <code>2>&1</code> will redirect stderr (2) to stdout (1) | |||
* [https://www.gnu.org/software/coreutils/manual/html_node/tee-invocation.html <code>tee</code>] will redirect stdout to multiple files and show it in the terminal | |||
===Shutdown=== | |||
<pre> | |||
shutdown -h [now | -t <time>] | |||
</pre> | |||
* <code>-h</code> poweroff, the default | |||
* <code>-t time</code> schedule a shutdown in ''time'' seconds | |||
* <code>-r</code> restart | |||
* <code>-c</code> cancel pending shutdown | |||
==Package Management== | |||
See [https://www.digitalocean.com/community/tutorials/package-management-basics-apt-yum-dnf-pkg DigitalOcean: Package management basics] | |||
===apt=== | |||
<syntaxhighlight lang="bash"> | |||
# List all installed packages | |||
apt list --installed | |||
# Search repos for package | |||
apt search libdpkg-dev | |||
</syntaxhighlight> | |||
;Repositories | |||
Repository sources are saved in | |||
* A line in <code>/etc/apt/sources.list</code> | |||
* A file in <code>/etc/apt/sources.list.d/</code> | |||
Application desktop icons are stored in <code>/usr/share/applications/</code>. | |||
The update notifications are in <code>/etc/apt/apt.conf.d/99update-notifier</code>. Comment these out to disable them.<br> | |||
Unattended-updates are in <code>/etc/apt/apt.conf.d/50unattended-upgrades</code>. | |||
{{hidden | dpkg | | |||
===dpkg=== | |||
<syntaxhighlight lang="bash"> | |||
# List everything | |||
sudo dpkg -l | |||
# List things with apache in the name | |||
sudo dpkg -l | grep apache | |||
</syntaxhighlight> | |||
}} | |||
{{hidden | yum | | |||
===yum=== | |||
<syntaxhighlight lang="bash"> | |||
# Update package lists, typically not necessary | |||
yum check-update | |||
# Upgrade packages | |||
yum update | |||
</syntaxhighlight> | |||
}} | |||
==SSH== | ==SSH== | ||
===SSH Keys=== | |||
Generate an ssh-key for every client | Generate an ssh-key for every client | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
ssh-keygen -t ed25519 - | ssh-keygen -t ed25519 [-C "comment your client name"] [-f output_path] | ||
</syntaxhighlight> | |||
Some older software such as Solid file explorer require RSA keys in PEM key format | |||
<syntaxhighlight lang="bash"> | |||
ssh-keygen -t rsa -b 4096 -m PEM [-C "comment your client name"] [-f output_path] | |||
</syntaxhighlight> | |||
You can also convert existing keys to PEM format | |||
<syntaxhighlight lang="bash"> | |||
ssh-keygen -p -m PEM [-C "comment your client name"] [-f output_path] | |||
</syntaxhighlight> | </syntaxhighlight> | ||
If you want to change the comment on your key | |||
<syntaxhighlight lang="bash"> | |||
ssh-keygen -c -C "New comment" -f path_to_key | |||
</syntaxhighlight> | |||
Manage ssh keys | Manage ssh keys | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
# On the client | # On the client | ||
ssh-copy-id | ssh-copy-id <host> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
Line 18: | Line 124: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Notes:<br> | |||
* According to [https://security.stackexchange.com/questions/143442/what-are-ssh-keygen-best-practices this] you should avoid using ECDSA and DSA keys. | |||
===Disable password authentication=== | |||
# Edit <code>/etc/ssh/sshd_config</code> | |||
# Set <code>PasswordAuthentication</code> to <code>no</code> | |||
# Set <code>ChallengeResponseAuthentication</code> to <code>no</code> | |||
# Test by ssh'ing into the machine using <code>-o PreferredAuthentications=password -o PubkeyAuthentication=no</code> | |||
===Port Forwarding=== | |||
Also known as: SSH Tunneling, SSH Proxy, SSH Reverse Proxy | |||
If you need to access a port on the remote computer, you can use the <code>-L</code> option to forward ports from the remote to the local machine. | |||
<syntaxhighlight lang="bash"> | |||
ssh -L <localport>:localhost:<remoteport> <remoteurl> | |||
# E.g. ssh -L 8080:localhost:80 david@davidl.me | |||
</syntaxhighlight> | |||
You can also do the reverse, giving the remote access to a local port using <code>-R</code> | |||
<syntaxhighlight lang="bash"> | |||
ssh -R <localport>:host:<remoteport> <remoteurl> | |||
# E.g. ssh -R 8080:localhost:80 david@davidl.me | |||
</syntaxhighlight> | |||
;Notes | |||
* You can also run this without creating a shell using <code>-N</code>. This will block your shell. See [https://unix.stackexchange.com/questions/100859/ssh-tunnel-without-shell-on-ssh-server SE Answer]. | |||
* Adding <code>-f</code> pushes ssh to the background. | |||
** This will implicitly add <code>-n</code> which redirects <code>stdin</code> from <code>/dev/null</code>. | |||
** If you want to be able to foreground this again, the use <code>&</code> or <kbd>Ctrl</kbd>+<kbd>z</kbd> instead. | |||
===alias=== | |||
You can create aliases in your <code>.ssh/config</code> | |||
<pre> | |||
Host my_alias | |||
User my_username | |||
Hostname my_server@my_domain.com | |||
Port 52 | |||
</pre> | |||
==VNC== | |||
===x11vnc=== | |||
[https://askubuntu.com/questions/1033274/ubuntu-18-04-connect-to-login-screen-over-vnc Reference] | |||
I recommend not exposing VNC. Set it to localhost only and use ssh port forwarding. | |||
===Remmina=== | |||
If using a wired connection, you can save a preset to <code>localhost:5901</code> or similar. | |||
Note that the Remmina which ships with Ubuntu 18.04 is outdated and buggy. | |||
You can upgrade it by adding the Remmina PPA. | |||
See [https://remmina.org/how-to-install-remmina/ https://remmina.org/how-to-install-remmina/] for details. | |||
<pre> | |||
sudo apt-add-repository ppa:remmina-ppa-team/remmina-next | |||
sudo apt update | |||
sudo apt install remmina remmina-plugin-rdp remmina-plugin-secret | |||
</pre> | |||
==Nvidia== | |||
===Driver Installation=== | |||
# Run <code>ubuntu-drivers list</code> to get a list of drivers | |||
# Install the latest driver | |||
#* E.g. <code>sudo apt install nvidia-driver-460</code> | |||
# If you have secure boot enabled, you will be asked for a password during installation | |||
#* This is because the driver is a DKMS module. | |||
#* After installation, reboot your computer and select "Enroll MOK" and enter that password in. | |||
#* '''Note''' Failure to do this will result in the driver not working | |||
# Validate your installation by running <code>nvidia-smi</code>. | |||
#* <code>nvidia-smi</code> shows the latest cuda version supported by the driver, not the cuda version installed. | |||
===Cuda Installation=== | |||
Download cuda from the nvidia website or add the cuda repo to your apt sources. | |||
===Switching between Nvidia and Intel=== | ===Switching between Nvidia and Intel=== | ||
[https://www.linuxbabe.com/desktop-linux/switch-intel-nvidia-graphics-card-ubuntu Reference] | [https://www.linuxbabe.com/desktop-linux/switch-intel-nvidia-graphics-card-ubuntu Reference] | ||
Make sure the Nvidia graphics drivers are installed. Then you can select between Nvidia and Intel GPUs using the Nvidia X Server Settings application <code>nvidia-settings</code>. Alternatively, you can use the following commands in the terminal.<br> | Make sure the Nvidia graphics drivers are installed. Then you can select between Nvidia and Intel GPUs using the Nvidia X Server Settings application <code>nvidia-settings</code>. Alternatively, you can use the following commands in the terminal.<br> | ||
To switch to the Nvidia GPU: | To switch to the Nvidia GPU: | ||
Line 31: | Line 210: | ||
</pre> | </pre> | ||
<code>prime-select query</code> will print either <code>nvidia</code> or <code>intel</code> to stdout. | <code>prime-select query</code> will print either <code>nvidia</code> or <code>intel</code> to stdout. | ||
===Fix tearing on laptops=== | |||
[https://ubuntuhandbook.org/index.php/2018/07/fix-screen-tearing-ubuntu-18-04-optimus-laptops/ Reference]<br> | |||
# Add <code>options nvidia-drm modeset=1</code> to <code>/etc/modprobe.d/nvidia-drm-nomodeset.conf</code> | |||
# Run <code>sudo update-initramfs -u</code> | |||
==Environment Variables== | |||
[https://help.ubuntu.com/community/EnvironmentVariables Ubuntu Help Reference] | |||
==Tmux== | |||
[https://tmuxcheatsheet.com/ Tmux cheat sheet] | |||
Tmux, or Terminal Multiplexer is an alternative to screen.<br> | |||
Use it to keep terminals open and tasks running after you disconnect your SSH connection.<br> | |||
Getting Started: | |||
<syntaxhighlight lang="bash"> | |||
# Make a new session | |||
tmux | |||
# Make a new named session | |||
tmux new -s my_session | |||
# Rename a session | |||
# Keybinding: Ctrl + b, $ | |||
tmux rename-session [-t current-name] [new-name] | |||
# Detach from a session | |||
# Keybinding: Ctrl + b, d | |||
tmux detach | |||
# List windows | |||
tmux ls | |||
# Attach to a session | |||
tmux attach -t my_session | |||
# Renumber windows | |||
:movew | |||
</syntaxhighlight> | |||
===Mouse scrolling=== | |||
Set <code>set -g mouse on</code> in your <code>~/.tmux.conf</code> | |||
==File Manager== | |||
The default file manager in Ubuntu is Nautilus | |||
===Add to context menu=== | |||
[https://askubuntu.com/questions/1030940/nautilus-actions-in-18-04 AskUbuntu] | |||
;22.04 | |||
See [https://github.com/harry-cpp/code-nautilus https://github.com/harry-cpp/code-nautilus] | |||
;20.04 | |||
<pre> | |||
sudo add-apt-repository universe | |||
sudo apt update | |||
sudo apt install filemanager-actions nautilus-actions nautilus-extension-fma | |||
</pre> | |||
==Etcher== | |||
[https://github.com/balena-io/etcher Github]<br> | |||
Installing etcher | |||
<syntaxhighlight lang="bash"> | |||
echo "deb https://deb.etcher.io stable etcher" | sudo tee /etc/apt/sources.list.d/balena-etcher.list | |||
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 379CE192D401AB61 | |||
sudo apt update | |||
sudo apt install balena-etcher-electron | |||
</syntaxhighlight> | |||
==Logs== | |||
Logs are stored under <code>/var/log</code>. These can end up taking up a lot of space.<br> | |||
You can delete logs in the journal folder [https://unix.stackexchange.com/questions/130786/can-i-remove-files-in-var-log-journal-and-var-cache-abrt-di-usr Reference]<br> | |||
==Default gcc/g++ version== | |||
See [https://askubuntu.com/questions/26498/how-to-choose-the-default-gcc-and-g-version https://askubuntu.com/questions/26498/how-to-choose-the-default-gcc-and-g-version].<br> | |||
<syntaxhighlight lang="bash"> | |||
# Install | |||
sudo update-alternatives --remove-all gcc | |||
sudo update-alternatives --remove-all g++ | |||
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 10 | |||
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 20 | |||
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 10 | |||
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 20 | |||
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30 | |||
sudo update-alternatives --set cc /usr/bin/gcc | |||
sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30 | |||
sudo update-alternatives --set c++ /usr/bin/g++ | |||
# Select | |||
sudo update-alternatives --config gcc | |||
sudo update-alternatives --config g++ | |||
</syntaxhighlight> | |||
==Power Management== | |||
===tlp=== | |||
[https://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html Website]<br> | |||
Battery power management | |||
==Virtual Machines (VM)== | |||
===Guest VMs=== | |||
Using Ubuntu as a guest: | |||
* Install <code>open-vm-tools-desktop</code> | |||
===KVM=== | |||
{{main | Archwiki: KVM}} | |||
===Docker=== | |||
{{main | Docker (software)}} | |||
==Services and Scheduling== | |||
===crontab=== | |||
The following will open a list of cron jobs you have. | |||
<pre> | |||
crontab -e | |||
</pre> | |||
The default editor is nano. You can change it to vim using <code>VISUAL=vim</code> env variable or with <code>select-editor</code>. | |||
===systemd service=== | |||
See [https://wiki.debian.org/systemd/Services debian/systemd Services]<br> | |||
[https://www.freedesktop.org/software/systemd/man/systemd.service.html manual]<br> | |||
System-wide services are in <code>/etc/systemd/system/</code><br> | |||
User services are in <code>~/.config/systemd/user/</code> | |||
{{hidden|A basic systemd service file| | |||
<pre> | |||
# Contents of /etc/systemd/system/myservice.service | |||
[Unit] | |||
Description=My Service | |||
After=network.target | |||
[Service] | |||
Type=simple | |||
Restart=always | |||
WorkingDirectory=/usr/local/bin | |||
ExecStart=/usr/local/bin/myservice | |||
[Install] | |||
WantedBy=multi-user.target | |||
</pre> | |||
Enable with <code>sudo systemctl enable myservice</code> | |||
}} | |||
;Usage | |||
* <code>sudo systemctl enable <my_service></code> | |||
* <code>sudo systemctl status <my_service></code> | |||
* <code>sudo systemctl start <my_service></code> | |||
* <code>sudo systemctl stop <my_service></code> | |||
* <code>sudo systemctl restart <my_service></code> | |||
* <code>sudo systemctl disable <my_service></code> | |||
;Notes | |||
* Type should be <code>forking</code> if your service runs and then ends | |||
* See service log with <code>sudo journalctl myservice</code> | |||
==File Management== | |||
===rsync=== | |||
{{main | rsync}} | |||
[https://linux.die.net/man/1/rsync Documentation] | |||
Use this to sync folders between directories of across networks | |||
;Common Flags | |||
* <code>-a, --archive</code> archive mode; equals -rlptgoD | |||
* <code>--info=progress2</code> show progress | |||
See [[ArchWiki: rsync]] to learn how to use rclone for incremental backups (a la time machine). | |||
===rclone=== | |||
{{ main | rclone }} | |||
Similar to rsync but for cloud services such as Dropbox and Google Drive.<br> | |||
I recommend installing from their website to get the latest version. | |||
===scp=== | |||
Usage | |||
<syntaxhighlight lang="bash"> | |||
scp [source_machine]:[source_file] [target_machine]:[target_file] | |||
</syntaxhighlight> | |||
;Flags | |||
* <code>-r</code> recursive, needed to scp directories | |||
* <code>-P [port]</code> | |||
;Notes | |||
* The machine can be an alias or user@domain | |||
===7z=== | |||
7zip CLI<br> | |||
Install with <code>sudo apt install p7zip-full</code> | |||
<syntaxhighlight lang="bash> | |||
# Archive | |||
7z a <output_file> <input_file/folder> | |||
# Archive with password | |||
7z a <output_file> <input_file> -p -mhe=on | |||
# Extract | |||
7z x <file> [-o{dir}] | |||
</syntaxhighlight> | |||
* <code>-mhe=on</code> hides file stuctures | |||
===zip/unzip=== | |||
Note that p7zip-full also includes the ability to zip/unzip .zip files.<br> | |||
;Zip a folder | |||
<code>zip -r file.zip folder</code> | |||
;Unzip an archive | |||
<code>unzip file.zip [-d destination]</code> | |||
===diff=== | |||
[https://www.geeksforgeeks.org/diff-command-linux-examples/ diff examples] | |||
;Important flags | |||
* <code>--strip-trailing-cr</code> Ignores <code>\r</code> | |||
===tar=== | |||
{{ main | tar (computing) }} | |||
;Extraction | |||
<pre> | |||
tar xzvf archive.tar.gz | |||
</pre> | |||
;Archive | |||
<pre> | |||
tar czpvf archive.tar.gz files | |||
</pre> | |||
===find=== | |||
Find files by their filename | |||
<pre> | |||
find <folder> [args] -name <name> | |||
</pre> | |||
* <code>-maxdepth <num></code> | |||
===grep=== | |||
Find files containing a pattern | |||
<pre> | |||
grep -r <pattern> * | |||
</pre> | |||
==Dual Booting== | |||
===Fix time difference between Windows=== | |||
[http://ubuntuhandbook.org/index.php/2016/05/time-differences-ubuntu-1604-windows-10/ Reference] | |||
<syntaxhighlight lang="bash"> | |||
timedatectl set-local-rtc 1 --adjust-system-clock | |||
</syntaxhighlight> | |||
===Recover GRUB after installing Windows=== | |||
[https://help.ubuntu.com/community/RecoveringUbuntuAfterInstallingWindows Ubuntu Help]<br> | |||
If you install windows after installing Ubuntu | |||
===GrubReboot=== | |||
[https://wiki.debian.org/GrubReboot GrubReboot]<br> | |||
Allows you to reboot into an OS one time.<br> | |||
i.e. If you are ssh'd into linux and want to boot into Windows one time.<br> | |||
===Encryption=== | |||
[https://www.mikekasberg.com/blog/2020/04/08/dual-boot-ubuntu-and-windows-with-encryption.html https://www.mikekasberg.com/blog/2020/04/08/dual-boot-ubuntu-and-windows-with-encryption.html] | |||
==Users and Groups== | |||
===Users=== | |||
<syntaxhighlight lang="bash"> | |||
# Make a new user | |||
adduser <user> | |||
# Add user to admins | |||
usermod -aG sudo <user> | |||
# Change the password of a user | |||
passwd | |||
passwd <user> | |||
# Delete a user | |||
# -r will also delete their home directory | |||
userdel -r <user> | |||
</syntaxhighlight> | |||
===Groups=== | |||
<syntaxhighlight lang="bash"> | |||
# Make a group | |||
groupadd <group> | |||
# Delete a group | |||
groupdel <group> | |||
# List members in groups | |||
getent group <group> | |||
# Add user to group | |||
usermod -a -G <group> <user> | |||
# Remove user from group | |||
gpasswd -d <user> <group> | |||
</syntaxhighlight> | |||
==Permissions== | |||
In unix filesystems, files and folders have individual permissions.<br> | |||
You can set permissions for each file/folder independently and for the following sets of users: | |||
* User/Owner <code>u</code> | |||
* Group <code>g</code> | |||
* Other <code>o</code> | |||
You can also set permissions for all of the above with: | |||
* All <code>a</code> | |||
Each file and folder can have the following permission for each set of user: | |||
* Read <code>r</code> | |||
* Write <code>w</code> | |||
* Execute <code>x</code> | |||
The above totals 9 bits (3 sets of users times 3 permissions). | |||
In addition to the above, there are 3 special bits: | |||
* [https://en.wikipedia.org/wiki/Sticky_bit Sticky bit <code>t</code>] - only allow the owners of subfiles/subfolders to modify them | |||
** Useful for shared folders such as /tmp | |||
* Setuid - automatically elevate execution of this file to the owner's priviledges | |||
* Setgid - automatically elevate execution of this file to the group's priviledges | |||
In total, permissions for each file and folder can be stored in 16 bits or 2 bytes. | |||
===chmod=== | |||
change mode | |||
===chown=== | |||
change owner | |||
<pre> | |||
chown [-r] <user>[:<group>] <item> | |||
</pre> | |||
===chgrp=== | |||
===Access Control Lists (ACL)=== | |||
==Display Scaling (HiDPI)== | |||
See [https://wiki.archlinux.org/index.php/HiDPI Arch Wiki HiDPI] | |||
Fractional scaling is natively available in Ubuntu 20.04+. | |||
{{hidden | Ubuntu 18.04 | | |||
;Xorg | |||
<pre> | |||
# Find your display | |||
xrandr | |||
xrandr --output <display> --scale 1.25x1.25 | |||
</pre> | |||
;Wayland | |||
<pre> | |||
gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']" | |||
</pre> | |||
I have the following script run at startup | |||
<pre> | |||
#!/bin/bash | |||
gsettings set org.gnome.desktop.interface scaling-factor 2 | |||
gsettings set org.gnome.settings-daemon.plugins.xsettings overrides "{'Gdk/WindowScalingFactor': <2>}" | |||
xrandr --output DP-2 --scale 1.3x1.3 | |||
</pre> | |||
}} | |||
==Clock== | |||
See [https://help.ubuntu.com/lts/serverguide/NTP.html Ubuntu Time Synchronization]<br> | |||
<pre> | |||
# Install chrony | |||
sudo apt install chrony | |||
# Synchronize time | |||
sudo chronyd -q | |||
# Check time synchronization | |||
sudo chronyd -Q | |||
</pre> | |||
Notes | |||
* Syncing over the internet will be off by a few milliseconds (e.g. 0.003 seconds). | |||
* Syncing with another computer over lan | |||
===Syncing with another computer=== | |||
See [https://askubuntu.com/questions/787855/how-to-use-chrony-to-synchronize-timestamp-on-two-computers/1018204 askubuntu]<br> | |||
;On the server | |||
Add the following to <code>/etc/chrony.conf</code> | |||
<pre> | |||
# make it serve time even if it is not synced (as it can't reach out) | |||
local stratum 8 | |||
# allow the IP of your peer to connect (192.168 subnet) | |||
allow 192.168 | |||
# Or | |||
# allow all | |||
</pre> | |||
;On the client | |||
Add the following to <code>/etc/chrony.conf</code> | |||
<pre> | |||
# set the servers IP here to sync to it | |||
server <Server_IP> iburst | |||
# remove the default servers in the config | |||
</pre> | |||
==<code>/dev/</code>== | |||
See [[Wikipedia: Device file#Pseudo-devices]] | |||
===<code>null</code>=== | |||
Discards all input. | |||
Produces EOF. | |||
===<code>random</code>=== | |||
See [https://security.stackexchange.com/questions/3936/is-a-rand-from-dev-urandom-secure-for-a-login-key/3939#3939 stackexchange]<br> | |||
See [https://www.2uo.de/myths-about-urandom/ Myths about urandom]<br> | |||
;TLDR: Use <code>/dev/urandom</code> instead of <code>/dev/random</code> | |||
===<code>urandom</code>=== | |||
Produces random numbers. | |||
On my system, it's limited to about 60 MB/s. If you need faster randomness, you can encrypt from <code>/dev/zero</code> to get 2.7 GB/s. | |||
See [https://serverfault.com/questions/6440/is-there-an-alternative-to-dev-urandom/415962#415962 reference]. | |||
<pre> | |||
# Using urandom | |||
pv < /dev/urandom > /dev/ull | |||
# Using encryption | |||
openssl enc -pbkdf2 -iter 100000 -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero | pv > /dev/null | |||
# Create a 4 GB file. | |||
dd if=/dev/zero bs=4M count=1024 | openssl enc -pbkdf2 -iter 100000 -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt | pv > random.bin | |||
</pre> | |||
==Gnome== | |||
===Tweaks=== | |||
<pre> | |||
sudo apt install gnome-tweaks | |||
sudo apt install chrome-gnome-shell | |||
</pre> | |||
==Auto Reboot== | |||
[https://unix.stackexchange.com/questions/141095/automatically-reboot-if-no-wifi-connection-for-a-certain-time reference] | |||
{{hidden | Auto Reboot Script | | |||
Auto reboot if no internet is detected: | |||
<syntaxhighlight lang="bash"> | |||
#!/bin/bash | |||
TMP_FILE=/tmp/inet_up | |||
# Edit this function if you want to do something besides reboot | |||
no_inet_action() { | |||
if [ "$1" -eq 1 ]; then | |||
systemctl restart network-manager | |||
elif [ "$1" -ge 2 ]; then | |||
rm -f $TMP_FILE | |||
shutdown -r now "No Internet" | |||
fi | |||
} | |||
increment_tmp_file() { | |||
if [ ! -f $TMP_FILE ]; then | |||
echo 0 > $TMP_FILE | |||
fi | |||
oldnum=$(cut -d ',' -f2 $TMP_FILE) | |||
newnum=$(("$oldnum" + 1)) | |||
sed -i "s/$oldnum\$/$newnum/g" $TMP_FILE | |||
} | |||
if ping -c5 google.com; then | |||
echo 0 > $TMP_FILE | |||
date > /tmp/inet_up_last_check | |||
else | |||
increment_tmp_file | |||
oldnum=$(cut -d ',' -f2 $TMP_FILE) | |||
no_inet_action "$oldnum" | |||
fi | |||
</syntaxhighlight> | |||
Add to sudo's crontab to run every 10 minutes | |||
<pre> | |||
*/10 * * * * /home/david/bin/check_inet.sh | |||
</pre> | |||
}} | |||
==Encryption== | |||
For encrypting entire drives, I recommend LUKS.<br> | |||
If you want encrypt a directly, you can use fscrypt (ext4 only). | |||
Note that ecryptfs is deprecated and shouldn't be used. | |||
===Encrypt Home After Install=== | |||
See [[Archwiki: Fscrypt#Encrypt_a_home_directory]]. | |||
See [https://tlbdk.github.io/ubuntu/2018/10/22/fscrypt.html https://tlbdk.github.io/ubuntu/2018/10/22/fscrypt.html]. | |||
This uses the newer fscrypt and requires Ubuntu 18.10+. | |||
<ol> | |||
<li> | |||
Install fscrypt and do setup | |||
<pre> | |||
sudo apt-get install fscrypt libpam-fscrypt | |||
sudo fscrypt setup | |||
sudo fscrypt setup / | |||
sudo tune2fs -O encrypt /dev/<yourdevice> | |||
# E.g. sudo tune2fs -O encrypt /dev/sda5 | |||
</pre> | |||
</li> | |||
<li> | |||
Create a new temp sudo user and login to it | |||
</li> | |||
<li> | |||
Create the encrypted home folder | |||
<pre> | |||
export USERNAME=david | |||
# Move old home folder | |||
sudo mv /home/$USERNAME /home/$USERNAME.bak | |||
# Create a new home folder and encrypt it | |||
mkdir /home/$USERNAME | |||
chown $USERNAME:$USERNAME /home/$USERNAME | |||
fscrypt encrypt /home/$USERNAME --user=$USERNAME | |||
# Copy files to the new home folder using cp or rsync | |||
# cp -a -T /home/$USERNAME.bak /home | |||
rsync -aHX --info=progress2 /home/$USERNAME.bak/ /home/$USERNAME/ | |||
</pre> | |||
</li> | |||
<li> | |||
Test the encrypted home folder by logging into your user | |||
</li> | |||
<li> | |||
Cleanup by removing the temporary user and deleting the old home folder | |||
<pre> | |||
shred /home/$USERNAME.bak/ | |||
</pre> | |||
</li> | |||
</ol> | |||
;Notes and Caveats | |||
* <code>systemd</code> will no longer have access to your home so all startup apps should be placed elsewhere | |||
** E.g. Move all startup scripts in your <code>~/.local/bin</code> to <code>/usr/local/bin</code> | |||
* <code>ssh</code> will not work until home has been decrypted since the authorized keys are in <code>~/.ssh/authorized_keys</code> | |||
{{hidden | SSH Workaround | | |||
Getting SSH to work with an encrypted home dir is a giant pain. | |||
Also things like tmux still won't work. | |||
Overall I do not recommend doing this on a server. | |||
# Move ssh keys elsewhere such as <code>/etc/ssh/authorized_keys/<user></code>. | |||
#* Add <code>/etc/ssh/authorized_keys/%u</code> to the <code>AuthorizedKeysFile</code> line in <code>/etc/ssh/sshd_config</code>. | |||
# Create a sudo user with and unencrypted home directory. | |||
# After every restart, ssh into the unencrypted sudo user and decrypt your home directory: | |||
#* <code><nowiki>sudo fscrypt unlock /home/david --user=david</nowiki></code> | |||
# Then ssh into your account. | |||
}} | |||
==SFTP== | |||
You can create a specific user with a chroot to limit SFTP to specific folders. | |||
See [[Archwiki: SFTP chroot]] for details. | |||
/etc/ssh/sshd_config | |||
<pre> | |||
Subsystem sftp /usr/lib/ssh/sftp-server | |||
Match Group sftponly | |||
ChrootDirectory %h | |||
ForceCommand internal-sftp | |||
AllowTcpForwarding no | |||
X11Forwarding no | |||
PasswordAuthentication no | |||
</pre> | |||
==Hardware Info== | |||
;Benchmarking | |||
Basic CPU benchmark | |||
<pre> | |||
sysbench cpu --threads=2 run | |||
</pre> | |||
==MOTD== | |||
Message of the day is the text you see when you login via SSH. | |||
Ubuntu stores its MOTD in <code>/etc/update-motd.d/</code>. Other distros use <code>/etc/motd/</code>. | |||
You can disable the Ubuntu news motd in <code>/etc/default/motd-news</code>. | |||
==System Administration== | |||
{{main | Linux Administration}} | |||
==Installing Binaries== | |||
# Copy your binary to <code>/usr/local/bin/</code> or <code>~/.local/bin/</code> | |||
# Copy your man page to <code>/usr/local/share/man/man1/</code> or <code>~/.local/share/man/man1/</code> | |||
==Network Troubleshooting== | |||
On one of my OptiPlex 5060 servers, the network adapter would reset on git ssh clones.<br> | |||
This would appear in <code>/var/log/syslog</code> as: | |||
<pre> | |||
Feb 8 22:22:01 optiplex5060-2 kernel: [ 4378.992607] e1000e 0000:00:1f.6 eno1: Reset adapter unexpectedly | |||
</pre> | |||
This was resolved by disabling TCP Segmentation Offload: | |||
<syntaxhighlight lang="bash"> | |||
sudo ethtool -K eno1 tso off | |||
# Verify tso is disabled | |||
ethtool -k eno1 | grep tcp | |||
</syntaxhighlight> | |||
To make this persist across reboots: | |||
{{hidden | Script | | |||
If you're using netplan (default for Ubuntu):<br> | |||
[https://michael.mulqueen.me.uk/2018/08/disable-offloading-netplan-ubuntu/ Reference]<br> | |||
<syntaxhighlight lang="bash"> | |||
output_path=/usr/lib/networkd-dispatcher/routable.d/10-disable-offloading | |||
sudo tee $output_path <<EOF> /dev/null | |||
#!/bin/bash | |||
ethtool -K eno1 tso off | |||
EOF | |||
sudo chmod +x $output_path | |||
</syntaxhighlight> | |||
If using ifupdown: | |||
<syntaxhighlight lang="bash"> | |||
output_path=/etc/network/if-up.d/disable-tso | |||
sudo tee $output_path <<EOF> /dev/null | |||
#!/bin/bash | |||
ethtool -K eno1 tso off | |||
EOF | |||
sudo chmod +x $output_path | |||
</syntaxhighlight> | |||
}} | |||
==Cloning to a new disk== | |||
The easiest way is to use gparted. | |||
{{hidden | Terminal Guide | | |||
To do this in the terminal: | |||
<syntaxhighlight lang="bash"> | |||
OLD_DRIVE=/dev/sda | |||
NEW_DRIVE=/dev/sdb | |||
# Show old drive partitions in sectors | |||
parted $OLD_DRIVE unit s print free | |||
# Apply GPT | |||
parted $NEW_DRIVE mklabel gpt | |||
# Copy new EFI partition with start 1024s and end 1050623s | |||
parted $NEW_DRIVE mkpart primary fat32 2048s 1050623s | |||
# Apply boot and esp flags. | |||
parted $NEW_DRIVE set 1 boot on | |||
parted $NEW_DRIVE set 1 esp on | |||
parted $NEW_DRIVE name 1 'EFI System Partition' | |||
# dd the old to the new | |||
dd if=${OLD_DRIVE}1 of=${NEW_DRIVE}1 bs=4k | |||
# Make a new partition. Make sure start and end sectors are aligned. | |||
# i.e. start % 8 == 0 and end % 8 == 7 if your physical sector size is 4096 bytes, typical for new HDDs and SSDs. | |||
parted $NEW_DRIVE mkpart primary btrfs 1050624s 488396791s | |||
parted $NEW_DRIVE align-check opt 2 | |||
# Copy the filesystem | |||
mkfs.btrfs ${NEW_DRIVE}2 | |||
mkdir /media/${NEW_DRIVE} | |||
mount -t btrfs -o compress=zstd /media/${NEW_DRIVE}2 | |||
rsync -axHAWXS --numeric-ids --info=progress2 /media/${NEW_DRIVE}2 | |||
</syntaxhighlight> | |||
[https://superuser.com/questions/307541/copy-entire-file-system-hierarchy-from-one-drive-to-another rsync reference] | |||
;rsync options | |||
* -a archive mode | |||
* -x one file system | |||
* -H preserve hard links | |||
* -A preserve ACLs | |||
* -W copy whole files instead of deltas | |||
* -X preserve extended attributes | |||
* -S handle sparse files efficiently | |||
* --numeric-ids use id instead of uid/gid | |||
To copy a root partition, make sure you change the following on the new drive: | |||
* Update the UUID and mount options in <code>/etc/fstab</code> | |||
* Update the UUID in <code>/boot/grub/grub.cfg</code> and run <code>update-grub</code> | |||
* Update the UUID in <code>/boot/EFI/ubuntu/grub.cfg</code> | |||
* Run [https://help.ubuntu.com/community/Boot-Repair boot-repair] from a live disk if you run into any issues. | |||
}} | |||
==Ubuntu== | |||
Ubuntu-specific notes | |||
===Disable ESM message=== | |||
[https://askubuntu.com/questions/1453749/inhibit-esm-messages-at-login Reference] | |||
<syntaxhighlight lang="bash"> | |||
# Disable MOTD | |||
sudo chmod -x /etc/update-motd.d/88-esm-announce | |||
sudo chmod -x /etc/update-motd.d/91-contract-ua-esm-status | |||
# Disable APT check | |||
sudo sed -Ezi.orig \ | |||
-e 's/(def _output_esm_service_status.outstream, have_esm_service, service_type.:\n)/\1 return\n/' \ | |||
-e 's/(def _output_esm_package_alert.*?\n.*?\n.:\n)/\1 return\n/' \ | |||
/usr/lib/update-notifier/apt_check.py | |||
sudo /usr/lib/update-notifier/update-motd-updates-available --force | |||
</syntaxhighlight> |