初识Linux shell

Linux系统

Linux可划分为以下四部分:

  • Linux内核
  • GNU工具
  • 图形化桌面环境
  • 应用软件

每一部分在Linux系统中各司其职。但就单个部分而言,其作用并不大,如下图,是一个基本结构框架,展示了各部分是如何协作起来构成整个Linux系统的。

初识Linux shell_linux

Linux内核

Linux系统的核心是内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。

内核主要负责以下四种功能:

  • 系统内存管理
  • 软件程序管理
  • 硬件设备管理
  • 文件系统管理

系统内存管理

操作系统内核的主要功能之一就是内存管理。内核不仅管理服务器上的物理内存,还可以创建和管理虚拟内存(即实际并不存在的内存)

交换空间

内核通过硬盘上的存储空间来实现虚拟内存,这块区域称为交换空间(swap space)。内核不断地在交换空间和实际的物理内存之间反复交换虚拟内存中的内容。这使得系统以为它拥有比物理内存更多的可用内存,如图所示:

初识Linux shell_c#_02

页面

内存存储单元按组划分成很多块,这些块称作页面(page)。内核将每个内存页面放在物理内存或交换空间。然后,内核会维护一个内存页面表,指明哪些页面位于物理内存内,哪些页面被换到了磁盘上。

换出

内核会记录哪些内存页面正在使用中,并自动把一段时间未访问的内存页面复制到交换空间区域(称为换出,swapping out)——即使还有可用内存。当程序要访问一个已被换出的内存页面时,内核必须从物理内存换出另外一个内存页面给它让出空间,然后从交换空间换入请求的内存页面。显然,这个过程要花费时间,拖慢运行中的进程。只要Linux系统在运行,为运行中程序换出内存页面的过程就不会停歇。

软件程序管理

Linux中的进程

Linux操作系统将运行中的程序称为进程。进程可以在前台运行,将输出显示在屏幕上,也可以在后台运行,隐藏到幕后。内核控制着Linux系统如何管理运行在系统上的所有进程。

内核创建了第一个进程(称为init进程)来启动系统上所有其他进程。当内核启动时,它会将init进程加载到虚拟内存中。内核在启动任何其他进程时,都会在虚拟内存中给新进程分配一块专有区域来存储该进程用到的数据和代码。

一些Linux发行版使用一个表来管理在系统开机时要自动启动进程。在Linux系统上,这个表通常位于专门文件​​/etc/inittab​​中。

然后我就​​cd​​到​​/etc​​目录下,果真发现这个目录,然后我再​​cd​​进去这个目录,就发现这些文件:

root@huangzihan:/# cd ..
root@huangzihan:/# ls -a
. bin dev home lib32 libx32 media opt root sbin swapfile tmp var
.. boot etc lib lib64 lost+found mnt proc run srv sys usr
root@huangzihan:/# cd etc
root@huangzihan:/etc# ls -a
. default iproute2 mke2fs.conf protocols ssl
.. deluser.conf issue modprobe.d .pwd.lock subgid
adduser.conf depmod.d issue.net modules python2.7 subuid
adjtime dhcp kernel modules-load.d python3 sudoers
alternatives dpkg kernel-img.conf motd python3.8 sudoers.d
...
...
...


另外一些系统(比如现在流行的Ubuntu Linux发行版)则采用​​/etc/init.d​​目录,将开机时启动或停止某个应用的脚本放在这个目录下。这些脚本通过​​/etc/rcX.d​​目录下的入口(entry)启动,这里的X代表运行级(run level)。

root@huangzihan:/etc# cd init.d
root@huangzihan:/etc/init.d# ls -a
. apparmor console-setup.sh fio irqbalance ntp procps rsyslog udev
.. atd cron grub-common keyboard-setup.sh plymouth resolvconf ssh ufw
aegis chrony dbus hwclock.sh kmod plymouth-log rsync sysstat uuidd


Linux系统的运行级

Linux操作系统的init系统采用了运行级。运行级决定了init进程运行​​/etc/init.d​​文件或​​/etc/rcX.d​​目录中定义好的某些特定类型的进程。Linux操作系统有5个启动运行级。

同样,我也发现了这个​​/etc/rcX.d​​,而且还不止一个,分别是​​rc0.d​​、​​rc1.d​​、​​rc2.d​​、​​rc3.d​​、​​rc4.d​​、​​rc5.d​​、​​rc6.d​​、​​rcS.d​​根据上面的意思,这里的X代表运行级(run level),那么这里的运行级分别是0、1、2、3、4、5、6、S,而且我还​​cd​​进去看看这里面都有什么文件,过程代码如下:

root@huangzihan:/etc# cd rc0.d
root@huangzihan:/etc/rc0.d# ls -a
. .. K01atd K01chrony K01irqbalance K01plymouth K01resolvconf K01rsyslog K01udev K01uuidd
root@huangzihan:/etc/rc0.d# cd ..
root@huangzihan:/etc# cd rc1.d
root@huangzihan:/etc/rc1.d# ls -a
. .. K01atd K01chrony K01irqbalance K01rsyslog K01ufw K01uuidd
root@huangzihan:/etc/rc1.d# cd ..
root@huangzihan:/etc# cd rc2.d
root@huangzihan:/etc/rc2.d# ls -a
. K01irqbalance S01atd S01console-setup.sh S01dbus S01plymouth S01rsyslog S01sysstat S80aegis
.. K01ntp S01chrony S01cron S01grub-common S01rsync S01ssh S01uuidd
root@huangzihan:/etc/rc2.d# cd ..
root@huangzihan:/etc# cd rc3.d
root@huangzihan:/etc/rc3.d# ls -a
. K01irqbalance S01atd S01console-setup.sh S01dbus S01plymouth S01rsyslog S01sysstat S80aegis
.. K01ntp S01chrony S01cron S01grub-common S01rsync S01ssh S01uuidd
root@huangzihan:/etc/rc3.d# cd ..
root@huangzihan:/etc# cd rc4.d
root@huangzihan:/etc/rc4.d# ls -a
. K01irqbalance S01atd S01console-setup.sh S01dbus S01plymouth S01rsyslog S01sysstat S80aegis
.. K01ntp S01chrony S01cron S01grub-common S01rsync S01ssh S01uuidd
root@huangzihan:/etc/rc4.d# cd ..
root@huangzihan:/etc# cd rc5.d
root@huangzihan:/etc/rc5.d# ls -a
. K01irqbalance S01atd S01console-setup.sh S01dbus S01plymouth S01rsyslog S01sysstat S80aegis
.. K01ntp S01chrony S01cron S01grub-common S01rsync S01ssh S01uuidd
root@huangzihan:/etc/rc5.d# cd ..
root@huangzihan:/etc# cd rc6.d
root@huangzihan:/etc/rc6.d# ls -a
. .. K01atd K01chrony K01irqbalance K01plymouth K01resolvconf K01rsyslog K01udev K01uuidd
root@huangzihan:/etc/rc6.d# cd ..
root@huangzihan:/etc# cd rcS.d
root@huangzihan:/etc/rcS.d# ls -a
. .. S01apparmor S01keyboard-setup.sh S01kmod S01plymouth-log S01procps S01resolvconf S01udev S01ufw


运行级为1时,只启动基本的系统进程以及一个控制台终端进程。显然,在这种模式下,仅有一个人(通常是系统管理员)能登录到系统上操作数据。

标准的启动运行级是3。在这个运行级上,大多数应用软件,比如网络支持程序,都会启动。另一个Linux中常见的运行级是5。在这个运行级上系统会启动图形化的X Windows系统,允许用户通过图形化桌面窗口登录系统。

硬件设备管理

内核的另一职责是管理硬件设备。任何Linux系统需要与之通信的设备,都需要在内核代码中加入其驱动程序代码。驱动程序代码相当于应用程序和硬件设备的中间人,允许内核与设备之间交换数据。

插入设备驱动代码的方法:

在Linux内核中有两种方法用于插入设备驱动代码:

  • 编译进内核的设备驱动代码
  • 可插入内核的设备驱动模块
设备文件

Linux系统将硬件设备当成特殊的文件,称为设备文件。设备文件有3种分类:

  • 字符型设备文件:指处理数据时每次只能处理一个字符的设备。大多数类型的调制解调器和终端都是作为字符型设备文件创建的。
  • 块设备文件:指处理数据时每次能处理大块数据的设备,比如硬盘。
  • 网络设备文件:指采用数据包发送和接收数据的设备,包括各种网卡和一个特殊的回环设备。这个回环设备允许Linux系统使用常见的网络编程协议同自身通信。

Linux为系统上的每个设备都创建一种称为节点的特殊文件。与设备的所有通信都通过设备节点完成。每个节点都有唯一的数值对供Linux内核标识它。数值对包括一个主设备号和一个次设备号。类似的设备被划分到同样的主设备号下。次设备号用于标识主设备组下的某个特定设备。

文件系统管理

不同于其他一些操作系统,Linux内核支持通过不同类型的文件系统从硬盘中读写数据。除了自有的诸多文件系统外,Linux还支持从其他操作系统(比如Microsoft Windows)采用的文件系统中读写数据。

Linux系统用来读写数据的标准文件系统

文件系统

描述

ext

Linux扩展文件系统,最早的Linux文件系统

ext2

第二扩展文件系统,在ext的基础上提供了更多的功能

ext3

第三扩展文件系统,支持日志功能

ext4

第四扩展文件系统,支持高级日志功能

hpfs

OS/2高性能文件系统

jfs

IBM日志文件系统

iso9660

ISO 9660文件系统(CD-ROM)

minix

MINIX文件系统

msdos

微软的FAT16

ncp

Netware文件系统

nfs

网络文件

ntfs

支持Microsoft NT文件系统

proc

访问系统文件

ReiserFS

高级Linux文件系统,能提供更好的性能和硬盘恢复功能

smb

支持网络访问的Samba SMB文件系统

sysv

较早期的Unix文件系统

ufs

BSD文件系统

umsdos

建立在msdos上的类Unix文件系统

vfat

Windows 95

XFS

高性能64位日志文件系统

Linux服务器所访问的所有硬盘都必须格式化成Linux系统用来读写数据的标准文件系统这份表格所列文件系统类型中的一种。

Linux内核采用虚拟文件系统(Virtual File System,VFS)作为和每个文件系统交互的接口。这为Linux内核同任何类型文件系统通信提供了一个标准接口。当每个文件系统都被挂载和使用时,VFS将信息都缓存在内存中。

GNU工具

核心GNU工具

GNU coreutils软件包由三部分构成:

  • 用以处理文件的工具
  • 用以操作文本的工具
  • 用以管理进程的工具
shell

GNU/Linux shell是一种特殊的交互式工具。它为用户提供了启动程序、管理文件系统中文件以及运行在Linux系统上的进程的途径。shell的核心是命令行提示符。命令行提示符是shell负责交互的部分。它允许你输入文本命令,然后解释命令,并在内核中执行。

shell包含了一组内部命令,用这些命令可以完成诸如复制文件、移动文件、重命名文件、显示和终止系统中正运行的程序等操作。shell也允许你在命令行提示符中输入程序的名称,它会将程序名传递给内核以启动它。

你也可以将多个shell命令放入文件中作为程序执行。这些文件被称作shell脚本。你在命令行上执行的任何命令都可放进一个shell脚本中作为一组命令执行。这为创建那种需要把几个命令放在一起来工作的工具提供便利。