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.

  • Hund@feddit.nu
    link
    fedilink
    arrow-up
    1
    ·
    edit-2
    15 minutes ago

    There’s always pyinfra.

    However. The easiest solution is probably a custom shell script that checks which OS it is and does different things based on that. It doesn’t have to pretty as long as it works for you.

  • SatyrSack@quokk.au
    link
    fedilink
    English
    arrow-up
    3
    ·
    54 minutes 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; pip install -U cyberdrop-dl-patched\'' >> ~/.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.

  • mathemachristian[he]@lemmy.ml
    link
    fedilink
    arrow-up
    1
    ·
    41 minutes ago

    guix is pretty useful. You can install it on top of any distro, feed it the declaration of your desired set-up and it will reproduce it everytime

  • thingsiplay@lemmy.ml
    link
    fedilink
    arrow-up
    3
    ·
    8 hours ago

    I think the Archinstall script (that is part of the official Arch iso) can save the configuration, to reinstall with same setup again. But it does not go into details like your Firefox environment. Its there to setup the basic installation and eventually additional packages.

  • kylian0087@lemmy.dbzer0.com
    link
    fedilink
    arrow-up
    2
    ·
    8 hours ago

    Their are a load of ways to do this. I have seen some good once posted already like Ansible. But to give you some more options. Their is also imaging. You setup a system how you like and clone it essentially. A good tool for that is a fog server. Works cross platform too.

  • Nibodhika@lemmy.world
    link
    fedilink
    arrow-up
    15
    ·
    15 hours ago

    You should have a look at NixOS. It’s a Linux distro where you declare the whole system in configuration like files, in a language called Nix (hence NixOS), then you run a command and that gets resolved into your system.

    It takes a long time to setup the first time, but it’s a breeze when you need to reinstall, and you will never need to reinstall as every boot is a fresh copy of the system you declared.

    There’s also a thing called home-manager which uses the Nix language to declare your home configuration. That part can be used in any other Linux by installing the home-manager package.

    You can declare your OS in a way that the home part is portable for machines running other systems. I do that, then my machines are very easy to declare, and with some groups for things like Base (Terminal, prompt, some things I expect to have on every system like Python, nvim fully configured, etc), Gaming (Steam mostly), UI (Sway, many GUI things I use like browser with extensions, etc) I can add configs for a new machine in instants depending on what I expected for it, and if I ever want to convert my “Steam machine” into a desktop it’s just a couple line changes, regenerate the config and it’s exactly the same as my laptop.

    Honestly I don’t think Nix is for everyone, but it’s a very niche thing that works extremely well for what it sets up to do, and if you’re in the target audience it’s a game changer.

    • a14o@feddit.org
      link
      fedilink
      arrow-up
      1
      ·
      2 hours ago

      I love NixOS but I wouldn’t commend it to people who are at a point in their sysadmin trajectory where they haven’t heard of Ansible. (It’s not just that Nix has a learning curve, it’s that you’re seriously screwed if you can’t tell the difference between a Nix problem and a regular package / kernel issue.)

      OP, use Ansible.

      • beeng@discuss.tchncs.de
        link
        fedilink
        arrow-up
        1
        ·
        57 minutes ago

        Skip Ansible (IMO). Bit of a hole and slow, pain to write and debug (slow cycles).

        Bite the bullet learn the hard right thing, nixos.

  • atzanteol@sh.itjust.works
    link
    fedilink
    English
    arrow-up
    1
    ·
    8 hours ago

    There are several tools. Ansible is an excellent cross platform tool for provisioning systems. I use it to manage packages, users, network and firewall configs, etc. across several systems.

  • Jeena@piefed.jeena.net
    link
    fedilink
    English
    arrow-up
    28
    ·
    17 hours ago

    The best would be NixOS, but if you just want to automate your install which you have then Ansible.

  • jollyrogue@lemmy.ml
    link
    fedilink
    arrow-up
    1
    ·
    9 hours ago

    It’s possible to create a custom Linux ISO. That will solve the application installation problem.

  • arran 🇦🇺@aussie.zone
    link
    fedilink
    arrow-up
    2
    ·
    11 hours ago

    There is a lot but I think you will find a lot of them more enterprise focused rather than consumer. For apps installed to home, why aren’t you preserving your /home partition? For system apps, could you create an image? (Although it should be basically a one liner?) There is a lot of missing detail, why are you reinstalling, what distribution(s)?

    It’s probably better to write a script in a repo that downloads and installs everything…

    Then for configuration files create a dotfiles repo. I use chezmoi but there are a bunch of solutions for this.

  • Dingaling@lemmy.ml
    link
    fedilink
    English
    arrow-up
    9
    ·
    edit-2
    16 hours ago

    If a debian based distro there’s several ways to copy your package choices from one machine to another, the likes of using dpkg --get-selections and using that output on the new machine with --set-selections, but probably the easiest way is to use apt-clone, which streamlines that process to install the same packages on the new machine.

    As for your firefox and desktop packages, they’ll be saved in /home/username (usually in .hidden dirs) - so just copy all of that over.

    Alternatively, use an image cloner like clonezilla to make an exact disk copy and install that.

    Or run your machine as a vm inside Proxmox or another hypervisor. That way you can have instant snapshots before you do risky things, as well as multiple scheduled entire-machine backups.

    Or ansible (which I do a lot of), which can set whatever packages and copy your golden-image files over as you want. (But keeping those up to date requires a little thought)