linux
Wiki

Intended audience: Windows users interested in switching to Linux, and new Linux users recently switched from using Windows.

What Is Linux?

Linux is technically an operating system kernel (like Darwin for OSX and NT for Windows) for the "GNU operating system". The entire operating system is called GNU/Linux. Many user space internal components were initially produced by the Free Software Foundation and historically, main developer of the Linux kernel, Linus Torvalds, offered his kernel as a basis for this operating system. Thus Linus' kernel and GNU's user space tools were primarily geared to work together.

However, for the reasons of simplicity; because Linux is usually (but not always) paired with the GNU toolchain anyway; and because some felt little sense in such a long name, some people started to refer to the whole operating system simply as "Linux". Thus "Linux" may refer to a class of operating systems, and also to the "Linux" kernel itself.

Packaging, maintaining and distributing Linux operating system along with various different software is called a 'distribution', and distributions may pick their own name that sometimes omit 'Linux' or 'GNU/Linux' completely from the title. For example: OpenSuse, Ubuntu, Debian GNU/Linux, Calculate Linux.

What Differentiates Linux Operating System?

Linux differs from Windows in a number of ways:

Linux Is A Joined Effort

The most distinguishing trait of Linux is its decentralized development process. No single entity makes or runs Linux. The Linux kernel, the core of the operating system, is developed and maintained by Linus Torvalds' Linux Foundation, often called 'vanilla kernel'. But various improvements and modifications are created by many organizations and individuals all over the world, some paid for by donations and some completely voluntary, that very often submit their changes back to Linus for review. Each Linux Distribution has it own development cycle, which is separate from the kernel development. In addition to this, the Desktop Environments and Window Managers are developed by yet other groups. This contrasts with the Microsoft way of doing things, where one company develops the whole OS: kernel, desktop environment, and much of the pre-installed software.

Typical 'Linux' Consists of Many Projects

Linux is really just the kernel and the drivers packed with the kernel. However, in order to put it to some use, a lot of programs from different projects ('Software') is used. For example, Xorg from Xorg Foundation, XFCE, KDE from KDE eV, GNOME from GNOME Project and so on.

Distributions

Just putting various pieces together does not make the operating system run. One needs to choose exact components for the task (server, desktop, gaming rig, thin client, cloud installation, workstation), correctly install and configure them, use some sort of installation script, add a package management component to allow easily adding software and solving possible conflicts, provide bug tracker for users to report eventual problems and help resolve them, consider the way to distribute the compilation, as well as ways to maintain it over time.

Thus, if you're looking to explore Linux, you need to find a 'distribution' that fits your goal. There are specialized websites that review and track status of various distributions (distrowatch.com as example). Most Linux Distributions include instructions on how to make a 'Live CD/USB', which allows you to boot your machine into Linux to try it without actually installing it or you can try running it inside a virtual machine, which is the preferred method for testing them out. When choosing a distro, it is advised to pick one with long history, high popularity, active community and importantly - one geared towards your technical level and goal.

Practical Differences Between Linux And Other Operating Systems

There aren't really any EXEs and DLLs in Linux

Linux does not rely on filename extensions like DOS/Windows does. Whether a file is executable is decided by a special file attribute, called the 'execute bit'. If it is set, then the shell opens the file and looks for a 'magic sequence' at the start of the file. Binary files are of 'ELF' or a.out internal format. To find out which format the file has, one can use the 'file' utility.

Libraries typically have .o or .so ending. '.o' stands for 'object' and refers to static library, comparable to '.lib' on Windows; where '.so' stands for 'shared object' and refers to dynamic library, comparable to '.dll' on Windows.

Linux has own free implementation of the Windows API, called WINE. WINE is a layer that is capable to directly execute native compiled Windows '.exe', '.dll', '.lib' and so on. WINE is highly compatible, but should not be abused for overuse, due to security, lack of full integration into Linux environment and performance reasons. WINE strives for 'bug-to-bug' compatibility, thus its capable of executing Windows malware inside the Linux system. This is why native Linux applications are always to be preferred.

Software is typically not installed via downloading and running a program

Most forms of Linux have an awesome thing called a Package Manager. The package manager accesses a huge online database, called repository, of software in packaged form, called packages (either in compressed, binary form, or containing automatically processed installation instructions), which are written against your distribution and lists them. This is somehow similar to Steam from Valve, Windows Store for Windows, Apple Store for Mac, Google Play for Android and so on; although originally all these mimic the original concept of a typical Linux Repository. This approach itself originates back to 'ports' from BSD operating system, although heavily modified.

Package managers differ in how much automation is done or possible. Additionally, depending on package manager, an individual package is either a compressed file with pre-compiled binaries or data - this is called binary approach; or a recipe that allows the package manager to automatically download needed source code, automatically configure, compile and insert it in your system - this is called source-based approach. Some package managers allow both ways, but these types usually don't implement all possibilities of both approaches at the same time, due to various technical and logical conflicts (compare emerge vs apt-source). Packages can also have individual dependencies (for example, any software package would require the kernel package to be installed) and be split into smaller packages (binary, data, optional parts, extensions) for sake of minimizing download size on next update.

There are many advantages to using package managers over downloading software as an executable or binary (as you might do on Windows from the website of the developer).

Linux loves scripting

If you can do it with a mouse in Linux, there is probably a command that will do the same thing. That means you can automate a lot of things right off the bat. A considerable number of developers recognize this culture, and write command-line programs first. Then, they write a GUI with all of the pictures and buttons we know and love. The GUI simply converts your clicks into commands which are run in the background. However, while scripting is exceptionally powerful feature, it is also slower than compiled application, thus this aspect should not be left out of attention. Various source code converters and script compilers are available for Linux.

Linux Terminology

The different terminology used in the Linux world can be confusing for a new user. Do not forget, that Linux is simply different. Thus carrying over and applying old approaches usually does not lead to anything good. Nevertheless, these differences are widely documented. Should you have any question, there is very high chance of someone already asking such question - google is your friend.

Some of the more common differences are:

Devices and drive partitions are represented as files

USB ports, hard drives, any detected partitions on those hard drives, temperature sensors, and most any other device is represented by a file and placed in the 'dev' directory.

There are different approach to access the same device: via label, serial number, numerical position on controller, unique ID. Each of these approaches creates features that can turn out as advantages or disadvantages - strictly depending on a use case. Since devices are mapped as files, one can work with whole device as if its a file. One can just tell a program what port or hard drive to use, by simply pointing it to that file.

Position-based approach (/dev/sda1, /dev/sda2 etc): naming follows very specific convention, 's' stands for 'sata' type bus devices, 'h' for IDE bus - where this drive is attached to; 'a' for first physical drive on controller, 'b' for second and so on; '1' for first partition, '2' for second and so on. Approach makes it easy to access device on running system, but changing drive position can produce problems if drive position is hardcoded anywhere.

UniqueID-based approach (/dev/disk/by-uuid/9ae35c45-c420-43e0-bf40-1dbe3f68): the long number is given at filesystem creation time and can be changed. This approach makes it easy to locate partition regardless of disk position, but can produce problems if its not changed after cloning.

Label-based approach (/dev/disk/by-label/label): label is similar to disk label. This is quite similar to UUID, but its given by user - where UUID is automatically given by software.

Serial Number based approach(/dev/disk/by-id/serial_number): should the device implement hardware serial number, it is possible to address the device by it. Device must have serial number and should device be replaced with a different one, references to it must also be replaced.

Mounting

Any device or folder can be attached to another folder. One can bind almost any directory in Linux into another location - like different filesystem on the same drive, another drive, a network drive, or even a ZIP file. This is called 'mounting', it synonyms to words like 'attach', 'connect', 'link' - but refers to a very specific action: when mounting is performed, device is opened by a filesystem driver that reads its structure and can present its contents as files; that device is then linked with specified folder.

Prior to device being usable, it must be mounted. Prior to removal, it must be unmounted. Without mounting, only RAW, direct access to device is possible.

If you remove the device prior to unmounting, the logical structure of filesystem may be damaged. In Windows, you can see similar thing in Disk Management, where you can unmount any drive that is not in use; and you see similar thing when you add or remove USB drives.

Everything revolves around the root directory

The root directory (/) is the beginning of it all. All folders are 'leaves' of this tree. Some are created by kernel, some are attached drives, some are projections of hardware locations.

Compared to Windows, Linux structure is much more flexible and powerful. But this power comes at price of a bit higher complexity.

Root is basically your C: drive, when compared to Windows, but stuff is added to it - it is not permanently nailed to specific location on specific disk.