this post was submitted on 16 Jul 2026
38 points (97.5% liked)

Linux

66663 readers
373 users here now

From Wikipedia, the free encyclopedia

Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).

Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.

Rules

Related Communities

Community icon by Alpár-Etele Méder, licensed under CC BY 3.0

founded 7 years ago
MODERATORS
 

I frequently reinstall Linux. Is there a tool to say what to install and configure that I can just run once after OS install? Things like

  • Install neovim, signal, steam
  • Configure firefox, desktop environment

I'm using this for just me, on my personal machine.

I don't anticipate it's possible between different distros, so assume I'm reinstalling the same distro.

EDIT: thanks for replies. I'm mostly seeing Ansible and NixOS. I'll start looking at those.

you are viewing a single comment's thread
view the rest of the comments
[–] SatyrSack@quokk.au 2 points 1 week ago* (last edited 1 week ago)

I had found myself reinstalling and reconfiguring a lot of the same things over and over while distro hopping, so I came up with a bash script with some of the most common configuration changes and such. As an example, here is my Fedora post=install script:

script

#!/usr/bin/env bash  

# remove all permission restrictions from current directory  
#sudo chmod -R a+rwX .  

sudo hostnamectl set-hostname [redacted]  

# prompt for ssh password to use later  
if [[ $1 == "" ]]; then  
    read -p "Enter ssh password: " ssh_pass  
else  
    ssh_pass=$1  
fi  

# default dnf prompts to 'y'  
sudo sh -c "echo 'defaultyes=True' >> /etc/dnf/dnf.conf"  

# install packages that are needed to add repos and other packages  
sudo dnf up -y && sudo dnf in curl flatpak wget -y  

#add repos  
sudo dnf copr enable lilay/topgrade -y  
sudo dnf copr enable aflyhorse/libjpeg -y  
sudo dnf config-manager addrepo --from-repofile=https://repository.mullvad.net/rpm/stable/mullvad.repo  
sudo dnf in https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm -y  
sudo dnf in https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm -y  
sudo sh -c 'curl -fsSL https://repo.librewolf.net/librewolf.repo | pkexec tee /etc/yum.repos.d/librewolf.repo'  
sudo flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo  
echo -e "[gitlab.com_paulcarroty_vscodium_repo]\nname=gitlab.com_paulcarroty_vscodium_repo\nbaseurl=https://paulcarroty.gitlab.io/vscodium-deb-rpm-repo/rpms//nenabled=1/ngpgcheck=1/nrepo_gpgcheck=1/ngpgkey=https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/master/pub.gpg/nmetadata_expire=1h" | sudo tee -a /etc/yum.repos.d/vscodium.repo  

#install packages  
sudo dnf in augeas-devel btop cairo-devel cairo-gobject-devel cargo cmake codium dbus-devel expat-devel gifsicle gimp git kde-connect kdenlive libavcodec-freeworld librewolf libxkbcommon-devel lightdm-gtk-greeter-settings mpv mullvad-vpn ninja-build openssh-server openssl openssl-devel pipx python3-dbus python3-devel python3-pip rpmbuild syncthing thunderbird topgrade vlc sshpass -y  
sudo dnf in $(curl -s https://raw.githubusercontent.com/teervo/bitwig-fedora/refs/heads/main/bitwig-rpm.sh | bash -s 4.4.10) -y  
sudo dnf swap ffmpeg-free ffmpeg --allowerasing -y  
export PATH="$HOME/.cargo/bin:$PATH" && echo $'export PATH= \"$HOME/.cargo/bin:$PATH \"' >> ~/.bashrc  
cargo install gifski cargo-updateflatpak install com.github.iwalton3.jellyfin-media-player -y  
#pipx install numlockw  
pip install pandas odfpy  

#create ssh key, copy to servers  
ssh-keygen -q -t rsa -N '' <<< $'\ny' >/dev/null 2>&1  
hosts=("10.0.0.10" "10.0.0.11")  
for host in "${hosts[@]}"; do  
    ssh-keyscan -H $host >> ~/.ssh/known_hosts && sshpass -p "$ssh_pass" ssh-copy-id -o StrictHostKeyChecking=no [redacted]@$host && ssh -q [redacted]@$host exit  
done  

#enable/start ssh server  
sudo systemctl enable sshd  
sudo systemctl start sshd  

#add external drive to fstab to automount  
directory_secondary_drive=$HOME/nvme  
uuid=[redacted]  
sudo blkid  
sudo cp /etc/fstab /etc/fstab.bak  
sudo sh -c "echo 'UUID=$uuid $directory_secondary_drive       btrfs    rw,auto,user,exec 0 0' >> /etc/fstab"  
sudo mount -a  

#copy over custom config files  
directory_software=$directory_secondary_drive/sync/software  
cp -r $directory_software/setup/configs/* $HOME/.local/share/  

#install fonts  
cp $directory_software/fonts/* $HOME/.fonts  
fc-cache -vf  

#set git credentials  
git config --global user.name "[redacted]" && git config --global user.email "[redacted]@yourdomain.com"  

#add aliases to bashrc  
echo $'alias pipup=\'pip list -o | cut -f1 -d\'\\\'\' \'\\\'\' | tr " " " " | awk \'\\\'\'{if(NR>=3)print}\'\\\'\' | cut -d\'\\\'\' \'\\\'\' -f1 | xargs -n1 pip install -U\'' >> ~/.bashrc  
echo $'alias up=\"topgrade -y && echo \'\\nChecking pip\\n\' && pipup\"' >> ~/.bashrc  
echo $'alias e=\"exit\"' >> ~/.bashrc  

#https://support.mozilla.org/en-US/kb/compact-mode-workaround-firefox  

#print ssh key  
echo $'\nPublic SSH key:'  
cat $HOME/.ssh/*.pub  

Note that I used [redacted] here in places for anonymity reasons. This could give you a decent starting point to do something similar.