Linux 是什么?初学者速查表
大家好!我是大聪明-PLUS!
什么是 Linux?
您好!本文旨在系统化地讲解一些 Linux 基础知识。对于那些对 Linux 系统经验很少甚至完全没有,不知从何入手,但想尝试一下(无论是自己尝试还是出于操作原因)的高级用户、开发者和 Windows 管理员来说,它或许会有所帮助。每个部分并非包含详尽的信息,而是提供进一步探索的起点(可能需要通过 百度 搜索)
什么是 Linux?
如今,当人们听到 Linux 这个名字时,他们想到的是以下两种情况之一:
- 基于 GNU/Linux 的操作系统,或者说,发行版。最受欢迎的有 RedHat/CentOS、Debian、Ubuntu 等等。KDPV 上展示了其中一小部分 :)
- Linux 内核以及可选的 GNU coreutils 程序套件。
关于内核,
我先简单介绍一下 GNU/Linux 内核。
首先,你应该知道所有操作系统内核都分为三种类型:
- 微内核;
- 整体式(Linux);
- 混合(OS X、Windows 7)。
单片机和微内核之间的主要区别在于微内核仅包括:
- IPC(进程间通信系统)、内存管理、调度程序和分派程序。
而单片内核还包括:
- 文件系统、驱动程序、VFS(对于 Linux 内核而言)。
Linux 内核负责:
- 流程管理。
- 内存管理。
- 与设备交互(通过驱动程序)。
- 系统调用和安全。
用户启动的所有程序都在所谓的用户空间中运行。这些程序通过系统调用接口 (SCI) 与内核交互。内核还限制用户程序对 CPU 和内存的访问,而内核代码可以不受限制地访问计算机资源。所有用户程序都使用进程间通信 (IPC) 相互通信。
尽管大多数人认为内核是单片的,但它使用模块。模块可以是内置的,也可以是可加载的。可加载模块可以在操作系统运行时启用或禁用。
GNU 核心实用程序 (coreutils)
GNU 核心实用程序 (coreutils) 是几乎所有 GNU/Linux 发行版中都有的一组程序和系统实用程序。它包括:
我的同事一直要求我添加以下内容:您可以随时通过输入“man name_of_the_tool”来获取帮助。另一种选择是“name_of_the_tool --help”,这几乎是所有 CLI(命令行界面)实用程序的标准配置。最后,查找命令文档的另一个方法是输入“info name_of_the_tool”。
现在我们对内核和系统实用程序有了一些了解,在开始使用 GNU/Linux 机器之前,我们需要熟悉一些其他内容,并且可能值得从执行上述所有程序的环境——Bash 命令行开始。
Bash 是一个命令行解释器。
现在我想介绍一下 Linux 中的命令行。命令行是输入命令的界面,而 Bash 是一个 Shell 和命令解释器。大多数人都熟悉 DOS、Windows 中的 command.com,或者更新更高级的 PowerShell,但 Linux 的惊喜在于:它有如此之多的解释器。它有各种各样的解释器,有的简单,有的复杂,有的体积小巧,等等。事实上,如果你使用 Linux 服务器,你肯定会用到其中一种解释器。
多年来,Bash 一直是 Linux 发行版的默认 Shell,并在 RHEL/CentOS、Oracle Linux 等系统中使用。但它也有流行的替代方案:Dash(Debian、Ubuntu)、zsh 等。它们通常彼此相似,因为它们都支持 POSIX 标准,但在细节上略有不同。Bash是 Bourne Again Shell,其名称与 Bourne(出生)一词双关。 Bourne 是原始 Bourne shell(1979 年)的作者,该 shell 是针对 Unix 7 版的,简称为 shell。Bash 的第一个版本由 Brian Fox 编写,并于 1989 年发布,旨在用开源产品取代专有的 Bourne Shell。Bash 在保持与原始 shell 兼容性的同时,引入了许多新功能,并借鉴了其他项目的理念。例如,history 命令就是从 csh 和 ksh 项目中“借用”的。
包管理系统
在 Windows 上,你通常会访问网站,下载程序或安装程序的 .exe 文件,然后复制或安装它。而在 Linux 系统上,这通常以不同的方式进行。虽然你仍然可以下载文件并安装它,但这被认为是最不流行的安装方法。
最流行的安装方法是使用包管理系统进行安装。
以下任何一种方法都会执行以下操作:
- 安装软件包(程序),包括其依赖项。
- 更新它们。
- 卸载它们。
我为什么要特别提到安装依赖项?事实上,Windows 程序通常将其依赖项(例如 *.dll 文件)存储在与程序相同的文件夹中,而在 Linux 系统上,依赖项会安装在所有程序的共享目录中,以便后续重复使用这些依赖项和库。通常,Linux 上库文件的扩展名是 *.so。
当然,随着 .Net Framework 的出现,这个问题变得容易得多,从而减少了所需依赖项的数量,但无论如何,Windows 系统就是这样运作的。Linux的风格是编写精简的小程序,只做好一件事。这也是依赖项数量众多且难以管理的原因之一。GNU/Linux 有两种最流行的软件包管理系统。
第一种是 Yum(或 DNF)。它使用 RPM(RPM 软件包管理器)软件包管理器。它用于以下发行版:
- RedHat Enterprise Linux/CentOS
- Fedora
- Oracle 企业 Linux
- SUSE/OpenSUSE(可选,本机是 zypper)
第二个是 Apt。它使用 dpkg 作为包管理器。使用它的最流行的发行版有:
- Debian
- Ubuntu
- Linux Mint
Slackware 和 Arch 使用它们自己的软件包管理器:slackpkg 和 pacman。
每个预装了软件包管理系统的 Linux 系统都包含预配置的 Internet 存储库(或者,正如他们所说,repos — 这是行话)。系统管理员也可以轻松添加自己的存储库。
最后,如果您发现自己处于隔离网络中,则可以使用软件包管理器从安装文件安装程序包。
rpm -i filename.rpm
这将在 RHEL/CentOS、Fedora、Oracle Linux、SUSE/OpenSUSE 上安装软件包。
这将在 Debian、Ubuntu、Linux Mint 上安装软件包 。PC 用户的另一种选择。最近,一些最终用户软件开发人员决定使用独立于发行版的软件包管理器。为此,所有依赖项都打包到一个文件中。最受欢迎的选项是 Snap、Flatpak 和 AppImage。前两者提供了通过其存储库下载更新来更新已安装软件的功能;AppImage 没有此功能。Snap 从 16.04 LTS 开始预装在 Ubuntu 中。
dnf install https://mirror.yandex.ru/epel/9/Everything/x86_64/Packages/e/epel-release-9-3.el9.noarch.rpm
dnf install ./skype.rpm
dpkg -i filename.deb
apt install ./filename.deb
初始化系统
另一个不属于内核但重要性仅次于内核的子系统是 init 系统,它用于初始化用户空间并管理用户进程。
这里有几种替代方案;让我们概述一下最受欢迎的几种:
- SysVinit(sysvinit、sysv,或简称“init”)是 UNIX System V 操作系统中 init 系统的直接继承(移植)。在过去 20 多年(1991-2011 年)中,它一直是最受欢迎的 init 系统。
- Upstart 是第一个成功替代 SysVinit 的尝试,它解决了 SysVinit 的缺点,但后来它的受欢迎程度逐渐下降。Upstart 最初由 Canonical 于 2006 年开发,目前唯一使用它的操作系统(虽然不是 GNU/Linux)是 Chrome OS。
- OpenRC 是 sysvinit 的一个轻量级、简单的替代方案。它被用在 Gentoo Linux、Alpine Linux 和其他一些轻量级发行版中。
- systemd 是目前大多数 Linux 发行版的解决方案。
Slackware 是一款流行的发行版,它使用类似于 BSD 的 init 系统,与众不同。
在 Linux 中,所有进程都有一个进程 ID (PID)。启动时,内核会初始化所有内部结构,并启动第一个 PID 为 1 的用户空间进程——通常,这就是 init 系统。它还充当所有用户进程的父进程。顺便提一句,Linux 的一个实用功能是不仅显示进程本身的 PID,还会显示其父进程。您可以像这样查看父进程:
ps -efj
进程终止时,有时会留下没有父进程的进程(从技术上讲,init 成为它们的父进程)——这些进程称为孤立进程,表示系统可能存在问题。您可能遇到的另一个问题是显示为Terminated
终止状态的进程。这些进程又称为僵尸进程。
系统
您可能会用到这个 init 系统。首先要用到的是 systemctl 和 journalctl 这两个实用程序。前者的语法相当简单
systemctl command service
。例如, [systemctl]systemctl status networking
将显示网络接口守护进程(服务)的当前状态。[ systemctl restart mysql
systemctl] 将重新启动 MySQL 服务器守护进程。[systemctl] 将停止或启动指定的守护进程。
为了进行调试,您需要经常检查日志中的错误
journalctl -xe
。
[systemctl] 可用于将常规程序转换为服务。
首次登录 Linux 服务器
当然,您可以使用键盘、鼠标和显示器连接到服务器。但是,大多数人都是远程连接到服务器。sshd 服务(ssh 守护进程或 ssh 服务器)就是为此目的而生的。它监听 TCP 端口 22,并允许使用登录名、密码和密钥进行连接。登录设置取决于具体的安装。Windows10 自某个时间点起就内置了 ssh 客户端。对于旧版本的 Windows,可以使用 Putty 客户端——一个用于登录远程 Linux 服务器的小型、简单且免费的客户端。需要注意的是,Putty 无法使用常规密钥对登录,需要 .ppk 格式的密钥。
如果要设置基于密钥的登录,则需要生成一个密钥对(私钥和公钥),并将远程服务器上的公钥内容输入到位于 .ppk 文件夹中的 authorized_keys 文件中~/.ssh
。~ — 表示用户的主目录,“。” — 表示该文件或文件夹是隐藏的。如果该文件夹不存在,您需要使用命令 创建它mkdir .ssh
,使用命令 访问它cd .ssh
,然后创建文件vi authorized_keys
。重要提示:要退出 vi 文本编辑器,请按esc
,然后键入:wq
(exit with write)。之后,您需要使用命令 设置此文件的正确权限chmod 0600 authorized_keys
。其中 0600 表示所有者用户可以读取(4)和写入(2),因此总共 6 个权限,而其所在组的用户(0)和其他用户(0)均不允许对此文件执行任何操作。
还有一种“人性化”的方法:ssh-copy-id
此外,权限系统还可以指示文件的可执行性(1)。例如,一个用户可以允许其他用户运行某个文件,则权限为 0755 — 即他拥有完全权限(4+2+1),其他用户可以读取(4)并运行(1)该可执行文件。
权限通常以文本形式表示。因此,rwx 表示 7,rw- 表示 6,rx 表示 5,依此类推。例如,r--r--r-- 表示 444——该文件对所有用户(包括所有者)都是只读的。
用户管理
大多数情况下,新服务器都会被分配一个 root 帐户,该帐户被视为超级用户(Linux 术语中称为“admin”)。但是,强烈建议不要在日常操作中使用 root 用户。为此,您需要学习如何管理用户。这非常简单明了:
useradd
— 创建新用户,-d 开关允许您指定主目录;usermod
- 更改用户;userdel -r
— 删除用户及其主文件夹;passwd $username
— 更改用户密码。
有一个命令chage (-l)
允许您设置(查看)密码有效期,还有一个选项可以完全阻止用户或仅阻止用户登录(行为和确切命令取决于分布)
网络
以前,net-tools 是最流行的网络实用程序包。它提供了诸如 ifconfig(用于查看网络接口)、netstat(用于查看网络连接)等实用工具。但时代变了,现在 net-tools 不再是默认安装的
,而是被更现代的 iproute2 包取代。
因此,ifconfig
它被ip addr
、ip link
、取代ip -s
;
arp
被ip n
、
iptunnel
、、取代。它被、、、取代。设置和配置网络适配器有几个“基本”选项,因此最好在您的发行 版中查找如何具体执行此操作(记住指定其版本)。ip tunnel
例如 ,在 RedHat 中,接口设置位于。 在较旧的 Ubuntu 系统中, 而在较新的系统中,一切都是通过 netplan 实用程序完成的,配置文件本身可以在这里找到: 某些系统(并非全部)安装了NetworkManager,然后可以在这里找到静态配置文件: 您可以检查是否已安装 NetworkManager,如下所示:或者 在遗嘱中,我被要求提及(嗯,systemd-networkd。已更正,我提到了它。 还值得注意的是内置防火墙 - 旧系统使用 iptables,它为 Netfilter 内核组件定义规则;现在建议使用 ufw 实用程序(一个 iptables 附加组件),因为它具有更加用户友好的界面。iwconfig
iw
nameif
ip link
netstat
ss
netstat -r
ip route
netstat -i
ip -s link
netstat -g
ip maddr
/etc/sysconfig/network-scripts/
/network/interfaces
/etc/network/interfaces
/etc/NetworkManager/NetworkManager.conf
/usr/sbin/NetworkManager --version
nmcli --version
FHS — 文件系统层次结构标准
我以前很喜欢 Windows 的简洁。A:\ 用来放软盘(没错,我年纪大了),C:\ 用来放系统盘,而且通常它是唯一一个驱动器(如果不是,D:\ 用来放游戏发行版、照片和视频),最后 E:\ 用来放 CD-ROM。就是这么简单!
现在我来给你展示一下大多数发行版中都能找到的最低配置,哈哈:
/
/boot — 引导加载程序文件
/dev — 设备文件
/root — root 用户的主文件夹(可选)。可以与 /home/root 链接
/etc — 存储机器配置
/home — 用户“hamsters”的根目录
/lib — 存储重要的共享库和内核模块
/media — 可移动驱动器的挂载点
/mnt — 临时挂载文件系统(闪存驱动器、外部驱动器、网络驱动器)的挂载点
/usr — 存储用户安装的软件
/opt — 也存储用户安装的软件
/var — 存储非静态内容。例如,日志 /var/logs
/sbin — 系统可执行文件
/bin — 共享可执行文件
/srv — 用于存储服务数据(例如 Web 服务器)
/tmp — 临时分区;其中的数据在服务器重启、用户注销、服务关闭等情况下会被删除。
大多数文件可以根据两个标准分为四类:
“可共享”和“不可共享”。可
共享文件存储在一台机器上,可以从其他机器访问。“不可共享”文件不用于共享访问。“
静态”和“可变”。
“静态”文件包括库、二进制文件、文档和其他仅在系统管理员干预下才会更改的文件。
“可变”文件是指非静态文件,可以在系统、用户或程序运行期间进行修改。例如,在组织备份时,此类文件需要更频繁的备份计划。
理解这一概念将有助于理解标准文件系统的层次结构和组织结构。
此外,还值得一提的是 inode(文件描述符)。它们包含正在创建的文件的元数据。在某些安装中,如果您向磁盘写入大量小文件(例如聊天记录),它们可能会耗尽。虽然可能有足够的可用空间,但您将无法创建新文件。您可以使用以下命令检查当前状态df -hTi
。
我还想指出的是,虽然 NTFS 是 Windows 的默认文件系统,但 Linux 有更多选择。常用的文件系统包括 ext3、ext4、xfs 和 btrfs。每种文件系统都用于特定的发行版,并且各有优缺点。
窗口服务器/显示系统
好吧,既然你已经了解了命令行,你可能会想:“啊哈,这就是 Linux 在普通用户中不受欢迎的原因!” 幸运的是,原因并非如此。Linux 目前有两种流行的显示服务器:X11(虽然比较老旧,但仍然是最受欢迎的选择)和 Wayland。后者已经实验了大约十年。桌面环境 (DE) 安装在显示服务器上,而且有很多。最受欢迎的有 Gnome、KDE、Unity 等等。安装了显示服务器和桌面环境后,系统看起来几乎就像一台普通的 PC,包含窗口、桌面、面板等等。