Skip Navigation

Is there a good, modern, widely accepted, learning Linux resource?

I've always approached learning Linux by just diving into it and bashing my head against problems as they come until I either solve them or give up, the latter being the more common outcome.

I wouldn't take this approach with other pieces of software though - I'd read guides, best practices, have someone recommend me good utility tools or extensions to install, which shortcuts to use or what kind of file hierarchy to use, etc.
For example, for python I'd always recommend the "Automate the boring stuff with Python", I remember learning most Java with that "Head first Java" book back in the days, c# has really good official guides for all concepts, libraries, patterns, etc.

So... lemme try that with Linux then! Are there any good resources, youtube videos, bloggers or any content creators, books that go explain everything important about linux to get it running in an optimal and efficient way that are fun and interesting to read? From things like how the file hierarchy works, what is /etc, how to install new programs with proper permissions, when to use sudo, what is a flatpak and why use it over something else, how to backup your system so you can easily reconstruct your setup in case you need to do an OS refresh, etc? All those things that people take for granted but are actually a huge obstacle course + minefield for beginners?

And more importantly, that it's up to date with actually good advice?

27

You're viewing a single thread.

27 comments
  • How Linux Works might be what you're looking for

    • But to truly master Linux, you need to understand its internals, like how the system boots, how networking works, and what the kernel actually does. In this third edition of the bestselling How Linux Works, author Brian Ward peels back the layers of this well-loved operating system to make Linux internals accessible.

      Isn't it too advanced? Seems like a good book but like the opposite of what I meant - I'm curious about beginner resources that will get people interested, knowledgeable and comfortable about using linux on a daily basis as much as they are with windows after decades of using it, not to turn them into a "superuser familiar with internals like kernel, networking, LVM".

      • The thing is, the day to day is mostly your distro. There are several that hide most stuff away and just work, but a resource would need to be distro specific, and the ones you'd want for a beginner are pretty straightforward. They're a start menu and an app store that work pretty much how you expect.

        The hang-up is mostly "I need word" and being confused by a different document editor, or things like that, and the fact that a lot of open source alternatives to popular applications don't have as much work done on casual friendly UX. So maybe you'd want something like "alternative to" and guides to basic usage of common replacement apps?

        Most anything past that is how the OS works.

        • Isn't there a lot of overlap though, at least between OSes that are of the same type (like debian/ubuntu)? How to set up users, knowing that you need to manually configure automatic mounting of your drives, knowing how/when to use flatpak or apt or .deb, where to install apps... These are not really intuitive things, especially for someone coming from windows, and most "how to install linux" guides don't really go into these in any meaningful way.

          For instance at first I thought I could just keep a list of apt commands and make an "easy to reinstall" linux script at one time, and that lasted for whole of 10 minutes before I realized every app needs manual intervention in one or another way, or has a different way of installing. Also, as many people I just prefix everything with sudo to get it to install, but who knows if that is the correct thing to do? not me at least

          • I realized every app needs manual intervention in one or another way

            How do you mean? What kind of interventions?

            or has a different way of installing

            This is just a consequence of trying to use messy flatpaks in addition to your distro's native package manager. I get that people coming from Windows want to continue to do things the Windows way, but grabbing programs from the web is a bad habit on Linux.

            Also, as many people I just prefix everything with sudo to get it to install

            This is generally correct for native package managers like apt. I would never trust installing anything foreign with elevated privileges. Rule of thumb for learners: Don't run anything with sudo, and when you encounter commands that fail to proceed, investigate why. Only then, if it truly requires elevated privs, do you sudo.

            I thought I could just keep a list of apt commands and make an “easy to reinstall” linux script at one time

            Saving the "dot files", directories in your ~/home whose names start with a period, will preserve configuration settings for pretty much all of your user-facing programs. Copy these directories back into a fresh install and you'll find that there is little reconfiguration required. I personally do this with KDE-Marble, and it has been the same program, building upon the same map cache, since around 2017.

            I'd say that the best learning resource you can have is a spare computer specifically dedicated to exploring Linux, with which you can install and break and configure and break again without worry. Learning Linux can be like playing a roguelite, and I mean that also in the sense that it can be fun.

            • I'm trying out popOS and even the native package manager (popOS shop?) installs most applications as flatpaks afaik? I have no idea where they end up being compared to windows' program files or what kind of defaults they install with. I started putting my custom downloaded AppImages into the ~/Applications folder and then used AppImageLauncher to actually have them show up in search.

              Then I will run into something like docker which is not in the shop and has a ton of commands you have to run in order to get it to work, like uninstalling conflicting packages, installing some certificates and keyrings and i dont even know what - it was supposed to work better than on windows but it is nowhere near as neat as there!

              Then I install samba (again, not available in the popOS shop) and I have it running but i have no idea whether it's set to automatically run or not. Searching for it with GUI tools doesn't show it as installed anywhere so in this case i have to rely on the terminal. The popOS store does have a list of installed apps but the search field gets disabled when you go into this screen because it's only used for browsing the shop, not through your installed apps?

              I’d say that the best learning resource you can have is a spare computer specifically dedicated to exploring Linux, with which you can install and break and configure and break again without worry. Learning Linux can be like playing a roguelite, and I mean that also in the sense that it can be fun.

              This is what I do but the issue is that I have no feedback on whether Im doing the right thing or if im making the life unnecessarily difficult for me. Games will slap you and make you redo something if you fuck it up, linux just makes you live in agony until sometimes breaks and you dont know why.

              • I'd say that someone like you is more interested in using the command line to manage your package installations, so you can safely ignore the popshop as a convenience for others who are less interested in the details of their system

                • I want to use the terminal and I'd prefer the simplicity and reliability of a single command over various GUIs, but it doesn't feel like it's consistent or simple with the terminal either. For example with VSCode, it doesn't have apt-get install vscode command (at least not listed on its installation pages) - it recommends manually downloading the deb file and then apt installing it.

                  https://code.visualstudio.com/docs/setup/linux

                  I just don't know whats the proper / good way of doing it anymore. The popOS shop is horrible, you cant stop running installations cuz it freezes and stops giving any feedback, sometimes it breaks and doesn't open fully, the UX is bad, but i dont know what else to do. At least with the shop I have a clear list of installed apps and a place to uninstall them, if i do it with the terminal I have no idea where they end up living.

                  • dpkg -l will list all .deb packages installed on your system.

                    • That gives me a list of over 2000 rows inside of the terminal that i cant apparently search or sort -.-

                      Then I tried to be smart and do man dpkg -l to see if that has any options on how to use it better, and instead i got another huge text file that i cant search or navigate through properly

                      So then i googled how to open it in an editor and tried man dpkg -l | nano, which does open it for a second and then crashes, i just get "too many errors from stdin, buffer written to nano.12608.save" in the terminal

                      ofc something as simple as map dpkg -l | vscode doesnt work either

                      I'm just tired

                      • It can be exhausting to know just enough to see results that aren't quite what you're after, but not quite know enough to refine it to get what you want. And you're supper close to it. Here's some things to fill the gap (and correct a misunderstanding or two):

                        gives me a list of over 2000 rows inside of the terminal that i cant apparently search or sort

                        The dpkg -l command can be postfixed with a search pattern:
                        dpkg -l lib* will return all packages with names that start with lib

                        ||/ Name                                 Version                           Architecture Description
                        +++-====================================-=================================-============-===============================>
                        ii  libaa1:amd64                         1.4p5-46                          amd64        ASCII art library
                        un  libabiword-3.0                       <none>                            <none>       (no description available)
                        ii  libaccountsservice0:amd64            0.6.55-0ubuntu12~20.04.7          amd64        query and manipulate user accou>
                        ii  libacl1:amd64                        2.2.53-6                          amd64        access control list - shared li>
                        ii  libaio1:amd64                        0.3.112-5                         amd64        Linux kernel AIO access library>
                        ii  libalgorithm-diff-perl               1.19.03-2                         all          module to find differences betw>
                        ii  libalgorithm-diff-xs-perl            0.04-6                            amd64        module to find differences betw>
                        ii  libalgorithm-merge-perl              0.08-3                            all          Perl module for three-way merge>
                        ii  libamd2:amd64                        1:5.7.1+dfsg-2                    amd64        approximate minimum degree orde>
                        ii  libamtk-5-0:amd64                    5.0.2-1build1                     amd64        Actions, Menus and Toolbars Kit>
                        ii  libamtk-5-common                     5.0.2-1build1                     all          Actions, Menus and Toolbars Kit>
                        un  libansicolor-perl                    <none>                            <none>       (no description available)
                        ii  libapparmor1:amd64                   2.13.3-7ubuntu5.3                 amd64        changehat AppArmor library
                        ii  libappindicator3-1                   12.10.1+20.04.20200408.1-0ubuntu1 amd64        Application Indicators
                        ii  libappstream4:amd64                  0.12.10-2                         amd64        Library to access AppStream ser>
                        un  libapt-inst1.5                       <none>                            <none>       (no description available)
                        un  libapt-pkg                           <none>                            <none>       (no description available)
                        un  libapt-pkg5.0                        <none>                            <none>       (no description available)
                        ii  libapt-pkg6.0:amd64                  2.0.10                            amd64        package management runtime libr>
                        un  libarchive-tar-perl                  <none>                            <none>       (no description available)
                        un  libarchive1                          <none>                            <none>       (no description available)
                        ii  libarchive13:amd64                   3.4.0-2ubuntu1.2                  amd64        Multi-format archive and compre>
                        un  libarcus3                            <none>                            <none>       (no description available)
                        ii  libargon2-1:amd64                    0~20171227-0.2                    amd64        memory-hard hashing function - >
                        

                        dpkg -l ?lib* will return all packages with names that have lib in the second third and fourth character positions.

                        ||/ Name                     Version                  Architecture Description
                        +++-========================-========================-============-====================================================
                        ii  glib-networking:amd64    2.64.2-1ubuntu0.1        amd64        network-related giomodules for GLib
                        ii  glib-networking-common   2.64.2-1ubuntu0.1        all          network-related giomodules for GLib - data files
                        ii  glib-networking-services 2.64.2-1ubuntu0.1        amd64        network-related giomodules for GLib - D-Bus services
                        un  glib-networking-tests    <none>                   <none>       (no description available)
                        un  glibc-doc                <none>                   <none>       (no description available)
                        ii  klibc-utils              2.0.7-1ubuntu5.1         amd64        small utilities built with klibc for early boot
                        un  zlib1                    <none>                   <none>       (no description available)
                        ii  zlib1g:amd64             1:1.2.11.dfsg-2ubuntu1.5 amd64        compression library - runtime
                        

                        Then I tried to be smart and do man dpkg -l to see if that has any options on how to use it better, and instead i got another huge text file that i cant search or navigate through properly

                        Yeah, man pages are overwhelming at times. There are ways to navigate them in the terminal, but I would have to look that up because I pretty much never do that. It's easier for me to just look it up online or open the text in an editor. Looks like you had the same idea with trying man dpkg -l | nano and man dpkg -l | vscode and you were so close to the end goal of reading the man page in a text editor!

                        Here are two ways you can make it work:

                        For both methods you will need to drop the -l so just use man dpkg.

                        Method 1:

                        Use the > operator to redirect the output of man dpkg to a file: man dpkg > dpkg.man
                        (note that the file name after the > operator above can be anything you want the name of the file to be. I chose dpkg.man because it seemed like it would be easy to remember for me.)

                        Then open the file using nano or vscode:
                        nano dpkg.man
                        code dpkg.man
                        (note the name of the package for vscode is code)

                        Method 2:

                        Use the | operator to send the output of man dpkg to a nano filebuffer:
                        man dpkg | nano

                        Then open file that was saved when nano returned an error message. In your case:
                        nano nano.12608.save
                        code nano.12608.save
                        (This second method feels a bit janky but it works.)

                        Since you were talking about using apt-get and apt to manage packages, I'll suggest nala as a more beginner friendly alternative that is more verbose and explicit about what it is doing. Give nala a try.

                        I hope this helps and that you can return to learning how to get things done using Linux with renewed resolve now that you've had some time away from it.

                        Keep asking questions! You're probably learning more than you realize already.

          • There is and there isn't.

            Some things are pretty standardized. Users and groups, permissions, systemd (usually), a lot of the underlying architecture is pretty much the same everywhere.

            A lot is very much not standardized. Booting, networking, desktop environments, what specific software is installed, the specific package manager in use, I could go on and on.

            To learn the former, the book I recommend is the most accessible thing I've read. You don't need to read everything, but portions were very helpful. To learn the latter, your distro will have the info you need, or should at least tell you what to look up elsewhere.

You've viewed 27 comments.