初识Linux shell

Linux

Linux可划分为以下四部分:

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

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

深入探究Linux内核

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

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

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

系统内存管理

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

交换空间

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

页面

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

换出

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

软件程序管理

Linux中的进程

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

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

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

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

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

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

  1. root@huangzihan:/etc# cd init.d
  2. root@huangzihan:/etc/init.d# ls -a
  3. . apparmor console-setup.sh fio irqbalance ntp procps rsyslog udev
  4. .. atd cron grub-common keyboard-setup.sh plymouth resolvconf ssh ufw
  5. 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.drc1.drc2.drc3.drc4.drc5.drc6.drcS.d根据上面的意思,这里的X代表运行级(run level),那么这里的运行级分别是0、1、2、3、4、5、6、S,而且我还cd进去看看这里面都有什么文件,过程代码如下:

  1. root@huangzihan:/etc# cd rc0.d
  2. root@huangzihan:/etc/rc0.d# ls -a
  3. . .. K01atd K01chrony K01irqbalance K01plymouth K01resolvconf K01rsyslog K01udev K01uuidd
  4. root@huangzihan:/etc/rc0.d# cd ..
  5. root@huangzihan:/etc# cd rc1.d
  6. root@huangzihan:/etc/rc1.d# ls -a
  7. . .. K01atd K01chrony K01irqbalance K01rsyslog K01ufw K01uuidd
  8. root@huangzihan:/etc/rc1.d# cd ..
  9. root@huangzihan:/etc# cd rc2.d
  10. root@huangzihan:/etc/rc2.d# ls -a
  11. . K01irqbalance S01atd S01console-setup.sh S01dbus S01plymouth S01rsyslog S01sysstat S80aegis
  12. .. K01ntp S01chrony S01cron S01grub-common S01rsync S01ssh S01uuidd
  13. root@huangzihan:/etc/rc2.d# cd ..
  14. root@huangzihan:/etc# cd rc3.d
  15. root@huangzihan:/etc/rc3.d# ls -a
  16. . K01irqbalance S01atd S01console-setup.sh S01dbus S01plymouth S01rsyslog S01sysstat S80aegis
  17. .. K01ntp S01chrony S01cron S01grub-common S01rsync S01ssh S01uuidd
  18. root@huangzihan:/etc/rc3.d# cd ..
  19. root@huangzihan:/etc# cd rc4.d
  20. root@huangzihan:/etc/rc4.d# ls -a
  21. . K01irqbalance S01atd S01console-setup.sh S01dbus S01plymouth S01rsyslog S01sysstat S80aegis
  22. .. K01ntp S01chrony S01cron S01grub-common S01rsync S01ssh S01uuidd
  23. root@huangzihan:/etc/rc4.d# cd ..
  24. root@huangzihan:/etc# cd rc5.d
  25. root@huangzihan:/etc/rc5.d# ls -a
  26. . K01irqbalance S01atd S01console-setup.sh S01dbus S01plymouth S01rsyslog S01sysstat S80aegis
  27. .. K01ntp S01chrony S01cron S01grub-common S01rsync S01ssh S01uuidd
  28. root@huangzihan:/etc/rc5.d# cd ..
  29. root@huangzihan:/etc# cd rc6.d
  30. root@huangzihan:/etc/rc6.d# ls -a
  31. . .. K01atd K01chrony K01irqbalance K01plymouth K01resolvconf K01rsyslog K01udev K01uuidd
  32. root@huangzihan:/etc/rc6.d# cd ..
  33. root@huangzihan:/etc# cd rcS.d
  34. root@huangzihan:/etc/rcS.d# ls -a
  35. . .. S01apparmor S01keyboard-setup.sh S01kmod S01plymouth-log S01procps S01resolvconf S01udev S01ufw

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

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

硬件设备管理

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

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

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

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

以前,插入设备驱动代码的唯一途径是重新编译内核。每次给系统添加新设备,都要重新编译一遍内核代码。随着Linux内核支持的硬件设备越来越多,这个过程变得越来越低效。不过好在Linux开发人员设计出了一种更好的将驱动代码插入运行中的内核的方法。

开发人员提出了内核模块的概念。它允许将驱动代码插入到运行中的内核而无需重新编译内核。同时,当设备不再使用时也可将内核模块从内核中移走。这种方式极大地简化和扩展了硬件设备在Linux上的使用。

设备文件

Linux系统将硬件设备当成特殊的文件,称为设备文件

设备文件的分类

设备文件有3种分类:

  • 字符型设备文件
  • 块设备文件
  • 网络设备文件
字符型设备文件

指处理数据时每次只能处理一个字符的设备。大多数类型的调制解调器和终端都是作为字符型设备文件创建的。

块设备文件

指处理数据时每次能处理大块数据的设备,比如硬盘。

网络设备文件

指采用数据包发送和接收数据的设备,包括各种网卡和一个特殊的回环设备。这个回环设备允许Linux系统使用常见的网络编程协议同自身通信。

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

文件系统管理

不同于其他一些操作系统,Linux内核支持通过不同类型的文件系统从硬盘中读写数据。除了自有的诸多文件系统外,Linux还支持从其他操作系统(比如Microsoft Windows)采用的文件系统中读写数据。内核必须在编译时就加入对所有可能用到的文件系统的支持。下表列出了Linux系统用来读写数据的标准文件系统。

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

GNU工具

除了由内核控制硬件设备外,操作系统还需要工具来执行一些标准功能,比如控制文件和程序。Linus在创建Linux系统内核时,并没有可用的系统工具。然而他很幸运,就在开发Linux内核的同时,有一群人正在互联网上共同努力,模仿Unix操作系统开发一系列标准的计算机系统工具。

GNU组织(GNU是GNU's Not Unix的缩写)开发了一套完整的Unix工具,但没有可以运行它们的内核系统。这些工具是在名为开源软件(open source software,OSS)的软件理念下开发的。

开源软件理念允许程序员开发软件,并将其免费发布。任何人都可以使用、修改该软件,或将该软件集成进自己的系统,无需支付任何授权费用。将Linus的Linux内核和GNU操作系统工具整合起来,就产生了一款完整的、功能丰富的免费操作系统。

尽管通常将Linux内核和GNU工具的结合体称为Linux,但你也会在互联网上看到一些Linux纯粹主义者将其称为GNU/Linux系统,藉此向GNU组织所作的贡献致意。

核心GNU工具

GNU项目的主旨在于为Unix系统管理员设计出一套类似于Unix的环境。这个目标促使该项目移植了很多常见的Unix系统命令行工具。供Linux系统使用的这组核心工具被称为coreutils(core utilities)软件包。

GNU coreutils软件包

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

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

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

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

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

在Linux系统上,通常有好几种Linux shell可用。不同的shell有不同的特性,有些更利于创建脚本,有些则更利于管理进程。所有Linux发行版默认的shell都是bash shell。bash shell由GNU项目开发,被当作标准Unix shell————Bourne shell(以创建者的名字命名)的替代品。bash shell的名称就是针对Bourne shell的拼写所玩的一个文字游戏,称为Bourne again shell。

Linux中常见的几种不同shell
shell 描述
ash 一种运行在内存受限环境中简单的轻量级shell,但与bash shell完全兼容
korn 一种与Bourne she兼容的编程shell,但支持如关联数组和浮点运算等一些高级的编程特性
tcsh 一种将C语言中的一些元素引入到shell脚本中的shell
zsh 一种结合了bash、tcsh和korn的特性,同时提供高级编程特性、共享历史文件和主题化提示符的高级shell

初识Linux shell的更多相关文章

  1. Linux命令行–初识Linux shell

    shell及脚本简介  GNU/Linux shell 是个交互工具,它为用户提供了启动程序.管理文件系统上的文件以及管理运行在Linux系统上的进程的途径 . shell的核心是命令行提示符 它是s ...

  2. 第一章 初识Linux shell

    Linux 由内核.GNU.桌面环境.应用软件四部分组成 内核基本功能: (1). 管理内存 (2). 管理硬件设备 (3). 管理文件系统 (4). 管理软件程序 GNU:操作系统需要一些工具来执行 ...

  3. Linux编程 3 (初识bash shell与man查看手册)

    一.初识bash shell 1.1 启动 shell   GNU bash shell 能提供对Linux系统的交互式访问.通常是在用户登录终端时启动,登录时系统启动shell依赖于用户账户的配置. ...

  4. .Neter玩转Linux系列之一:初识Linux

    一.为什么要学习Linux (1)首先我们欣赏一下,曾经的微软是如何看待Linux的,是不是很惊讶,微软还是很可爱的(#^.^#) 如今的微软看待Linux的态度:有人说微软技术那么厉害,难道微软就不 ...

  5. Linux shell 脚本(一)

    一.初识脚本 shell:一类介于系统内核与用户之间的解释程序.脚本:一类使用特定语言,按预设顺序执行的文件批处理.宏.解释型程序创建shell脚本:理清任务过程--整理执行语句--完善文件结构1.任 ...

  6. Linux学习之CentOS(二)--初识linux的一些常用命令

    Linux学习之CentOS(二)--初识linux的一些常用命令 在VM上安装完了CentOS6.4以后,看着linux系统成功跑起来,心里小激动了一把......但是前方学习的道路还很遥远... ...

  7. linux学习:【第1篇】初识Linux及安装

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! linux学习:[第1篇]初识Linux及安装 写在前面 学习之初看了一段文章,很有感触,所以也 ...

  8. linux shell 脚本攻略学习20--awk命令入门详解

    awk生于1977年,创始人有三个,分别为 Alfred Aho,Peter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母. 作用:处理文本文件. awk ...

  9. Linux入门——初识Linux

    Linux入门——初识Linux 摘要:本文主要说明了Linux是什么,Linux发展历史,以及同Linux系统有关的一些基本知识. 简介 操作系统 Linux系统同Windows系统.Mac系统一样 ...

随机推荐

  1. 跨域@RequestBody@RequestParam 和JSON.stringify

  2. vue3.0入门(三)

    前言 最近在b站上学习了飞哥的vue教程 学习案例已上传,下载地址 class绑定 对象绑定 :class='{active:isActive}' // 相当于class="active&q ...

  3. Spring笔记(4)

    集成Web环境 1.步骤 导入Spring-web坐标 <!-- spring-web--> <dependency> <groupId>org.springfra ...

  4. Kotlin之内联回调函数

    let 定义: let扩展函数的实际上是一个作用域函数,当你需要去定义一个变量在一个特定的作用域范围内,let函数的是一个不错的选择:let函数另一个作用就是可以避免写一些判断null的操作. 翻译: ...

  5. 微前端框架single-spa初探

    前言 最近入职的一家公司采用single-spa这个微前端框架,所以自学了此框架. single-spa这个微前端框架虽然有中文文档,但是有些零散和晦涩. 所以我想在学习之余,写篇博客拉平一下这个学习 ...

  6. Django项目从创建到运行

    环境: Windows Server 2008 R2 标准版 1.安装python运行环境(省略) 2.安装Django pip install Django==3.1.5 # 不写版本号也可以 3. ...

  7. Java匿名内部类只可使用一次的理解

    匿名内部类只能使用一次,就不能在使用. 为了验证"只能使用一次"的实际含义,首先在程序中实例化了两个对象.并且在相应的类中加入了实现接口的匿名内部类: package com.An ...

  8. 'Specifying a namespace in include() without providing an app_name '报错解决

    需要在每个ap下面的url.py 加入一个指定app的名字 比如  user  app  下的 url.py  文件加入: urlpatterns = []app_name = "user& ...

  9. list使用详解

    List双向链表 再谈链表 List链表的概念再度出现了,作为线性表的一员,C++的STL提供了快速进行构建的方法,为此,在前文的基础上通过STL进行直接使用,这对于程序设计中快速构建原型是相当有必要 ...

  10. 如何使用SQL的备份文件(.bak)恢复数据库

    出于很多情况,数据库只剩下.bak文件,想要恢复数据库,找了很多资料才知道可以这样!!!!! 个人觉得图片教程更有意义,请看步骤: 1.选中"数据库" 右击 选择"还原数 ...