ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Unix/Linux基础入门:内核、发行版、文件权限与命令行

Unix/Linux基础入门:内核、发行版、文件权限与命令行

简介:面向刚接触类 Unix 系统的学习者与运维入门者的基础讲义,围绕操作系统为何存在、Unix 与 Linux 如何演变这条主线展开,可用于课堂授课、自学补课或面试前梳理知识脉络。压缩包内为 1 个 doc 文档,约 13.46MB,章节层层递进:先讲操作系统的目标与承上启下地位,再梳理 Unix 家族从 MULTICS、UNICS 到 C 语言重写、BSD 与 AT&T 双线竞争的历史,随后交代 Minix、Linus 内核、GNU 计划与 POSIX 标准五个支柱,并延伸至 Linux 两类用户、与 Unix 的联系、内核版本与发行版差异、X Window 结构以及服务器与嵌入式等应用领域。已有 326 人学习。读者可借此建立从硬件封装到应用接口的整体认知,理清发行版选型与内核稳定版、开发版的区别,理解接口标准与可移植性的意义,为后续命令行操作与系统管理打底。

1. Unix/Linux 是什么:一个住在硬件和软件中间的「翻译」

你双击一个图标,播放器就弹出来了——这中间其实隔着一个你看不见的中间人。Unix/Linux 就是这样一个中间人:向下,它把硬盘、内存、网卡这些硬邦邦的零件封装成一组可以调用的接口;向上,它给浏览器、编辑器、播放器提供一套统一的干活方式。用更正式的说法,Unix/Linux 是一类多用户、多任务的操作系统,它的目标很朴素——让计算机好用、让资源用得高效、让新功能容易加进来。之所以值得花十分钟搞懂它,是因为「Linux 命令」「文件权限」「一切皆文件」这些词,几乎每个碰计算机的人都会撞上,而它们全都挂在这同一个骨架上。骨架立住了,后面那些零碎知识才有地方安放;骨架没立住,你记住的每一条命令都像孤立的咒语,换个场景就失效。

2. 为什么会有 Linux:一段被「太复杂」逼出来的历史

操作系统在计算机系统里的位置,用一句话就能说清:承上启下。往下,它把各种硬件的差异抹平,应用不需要知道数据到底落在哪块盘上;往上,它提供统一的调用接口,让程序有地方「抓手」。围绕这个位置,操作系统的目标也就三条:方便,让系统易于使用;有效,以更有效的方式使用计算机资源;扩展,方便用户开发、测试和引进新功能。理解了这三条,你再去看 Unix 和 Linux 那段历史,会发现每一次转折几乎都是被这三条推着走的——尤其是「有效」和「扩展」这两条,逼出了后来所有的分家与重写。

2.1 从一次失败的合作项目说起:Unix 长出来的路径

1965 年,一家研究机构拉上另一家公司与一所高校,三方合作要做一个「多使用者、多任务、多层次」的系统。听上去很超前,但摊子铺得太大,项目最终因为过于复杂而失败。失败的教训被其中一位参与者记住了:与其一次做全,不如先做一个能跑起来的小东西。1969 年,他带着一组开发者做出了一个新的多任务系统,最初是用 B 语言和汇编语言混合编写的。1971 年,他和同伴一起做出了 C 语言,1973 年整套系统改用 C 语言重写——这一步是整个故事里最关键的一步。用高级语言写操作系统,意味着这套系统可以从一种机器搬到另一种机器上,而不必每换一台机器就重写一遍。

1974 年,这套系统第一次走出实验室,被机关、研究机构、企业和高校注意到,慢慢流行开来。1980 年,市面上出现两条主要版本线:一条来自高校的学术分支,一条来自商业公司的分支。两者的竞争后来被称作「Unix 战争」,结果是变种遍地开花——每家都按自己的理解改,接口各写各的。1982 年,商业公司推出第一个商业版本,并且不再开源。再往后是长达近十年的版权官司,从 1992 年拖到 2001 年,两边都被拖得筋疲力尽。

这场拉锯没有赢家。商业那条线因为费用昂贵,基本只待在大型机上,普通用户够不着;学术那条线被官司压住,错过了宝贵的发展窗口。一个「系统很好用,但买不起、也拿不到源码」的空档,就这么留了下来。打个比方:一道菜最初只有一家店会做,后来分店各自改配方,最后为了「谁才是正宗」打起了官司,菜单越写越贵,吃得起的人越来越少。这时候有人从头写了一份公开的菜谱,谁都能照着做——Linux 就是那份菜谱。

2.2 五大支柱:Linux 并非凭空出现

先是有个教学用的迷你系统。某位教授仿照学术分支的源码,白手起家写了大约一万二千行 C 代码,做出来只是给学生看看内核长什么样,本身没什么实际应用价值。但它证明了一件事:内核没那么遥不可及,一个人带着学生也能写出来,而且源码是可以给人看的。

接着是一位学生的选择。1990 年,有人决定写一个自己的迷你内核,最初名字的意思是「某某的迷你内核」,1991 年正式发布,逐渐引起注意,后来改成了今天这个名字。很多人以为是「一个人写了个操作系统」,其实他写的只是内核——是发动机,不是整车。

让整车成型的,是另外几块拼图。第一块是前面说的 Unix,它提供了设计范式和「类 Unix」这个目标:接口怎么设计、命令怎么组织,已经有样板可循。第二块是那个教学系统,它提供了一条可以走通的路。第三块是一份自由软件计划:这个计划 1984 年发起,目标是造一套免费、类 Unix 的系统及其开发工具,编辑器、shell 程序、编译器、调试器都是它的产物。它几乎把零件都备齐了,唯独缺一个能跑起来的内核。第四块是一套接口标准:它规定了操作系统应该给应用程序提供什么样的接口,把各分支的编程接口统一起来,程序写一次就能在多个系统上编译运行,通用性和可移植性全靠它兜底。第五块是互联网:全世界的修改最终汇总到一个公开的源码站点,由社区甄别、讨论,再决定是否合进主线。

1992 年,内核与那批自由软件工具结合,一套完全自由的操作系统才算正式诞生。所以严格讲,日常挂在这个名字下的东西只有内核,完整的那套更准确的说法是「内核加自由软件工具」。这个称呼上的争论持续了很多年,对使用者来说无关紧要,但对你理解「内核」和「发行版」的区别很重要——很多人后面踩坑,都是因为把这俩当成了一回事。

2.3 内核与发行版:心脏和外衣

内核是系统的心脏,负责运行程序、管理磁盘和打印机这类硬件,在裸设备和应用程序之间提供一层抽象。你的程序想读一个文件,不需要知道数据落在哪块盘哪个扇区,只要调用内核给的接口就行。这就是「承上启下」的具体样子,一层薄薄的抽象,挡住了下面所有的复杂。

内核版本分两种,两种互相循环。稳定版具有工业级强度,可以广泛部署,新的稳定版相对旧的通常只是修 bug 或加入一些新驱动;开发版在试验各种方案,变化很快。所有源码修改最终都会汇总到一个公开站点,由社区判断要不要进入主线内核。

发行版是另一回事。它通常包含内核、大量来自自由软件计划的函数库、基于图形窗口系统的桌面环境,再加上办公套件、媒体播放器、数据库这些应用软件。图形窗口系统本身很有意思:它是客户机/服务器结构,由服务端和客户端两部分组成,实现与内核分开,而且是可选的应用程序组件,不是系统的必需部分——这也是为什么很多服务器根本不装桌面,照样跑得很好。

这个系统的特点能列一长串:开放性、完全免费、多用户、多任务、良好的用户界面、设备独立性、丰富的网络功能、可靠的安全性、良好的可移植性。这些不是宣传词,每一条都能对应到具体机制:多用户对应权限体系,设备独立性对应「设备也是文件」,可移植性对应当年那个「用 C 语言重写内核」的历史选择。

用在哪?服务器是应用最多的一个领域,Web、文件传输、邮件、域名解析这些服务都能扛,还支持服务器集群与虚拟主机;嵌入式是另一个大方向,把它裁剪修改后塞进各种硬件平台,性能稳定、剪裁性好、开发和使用都容易;桌面应用这些年进步很大,办公、多媒体、网络这些日常需求基本能覆盖;此外还有公共部门办公系统迁移的场景。对一个刚入门的人来说,这些领域的共同点是:都要跟目录、路径、权限、命令打交道。

3. 一切皆文件:Linux 看待世界的方式

3.1 只有一个根:为什么没有 C 盘

Windows 下打开「计算机」,看到的是一堆驱动器盘符,每个盘有自己的根目录结构,多个树并列。Linux 下看不到盘符,看到的是文件夹。所有分区都挂载到唯一的根目录「/」上,整台机器是一棵树。

早期各家 Unix 厂商各自定义目录,命名一片混乱。1994 年推出了文件系统层次结构标准,规定了根目录下每个文件夹的名字和作用,局面才统一。不管哪个发行版,桌面和应用是外衣,文件组织和目录结构才是内心。

打个比方:Windows 像一栋楼,每层自己有一整套门牌和电梯,你要去某个房间,得先说清是哪一层的哪一套;Linux 像一棵树,不管你从哪根枝条接上来——新硬盘、U 盘、网络存储——位置都是这棵树上唯一的一条路径。挂载这个动作,就是把一根枝条接到树上。

好处是路径唯一,脚本里写死一个路径,换台机器大概率还能用;代价是一开始会不习惯,尤其是习惯找「D 盘」的人,第一次会怀疑自己的文件是不是丢了。

3.2 目录树速查:每个文件夹到底装什么

路径放什么
/根目录,一般只放目录;有且只有一个,一切都从这里开始
/bin、/usr/bin可执行二进制文件,常用的 ls、tar、mv、cat 都在这里
/sbin、/usr/sbin、/usr/local/sbin给管理员用的可执行命令,如 fdisk、shutdown、mount;普通用户一般只能查看
/boot系统启动时用到的文件,比如内核文件、系统引导管理器
/dev设备文件;访问这里的某个文件,等于访问某个设备
/etc系统配置文件,不建议放可执行文件
/home普通用户的家目录;~ 表示当前用户的家目录,~edu 表示用户 edu 的家目录
/root管理员的家目录
/lib、/usr/lib、/usr/local/lib系统使用的函数库;程序运行时要靠这些库文件协助
/mnt、/media挂载点,光盘、U 盘一般挂在这类位置
/opt额外安装的软件放这里
/proc数据都在内存里,如内核状态、外部设备、网络状态,不占磁盘空间
/tmp临时文件,任何人都能访问,重要数据不要放这里
/srv服务启动之后需要访问的数据
/usr应用程序存放目录;bin 放程序,share 放共享数据,local 放软件升级包,share/doc 放说明文档,share/man 放手册
/var执行过程中经常变化的文件,如日志、邮件、程序启动后的进程号
/lost+found系统异常时,把一些遗失的片段放这里

这张表不用背。记三条规律就够用:可执行的命令分在 bin 和 sbin,带 s 的那批是给管理员用的;会一直变化的文件进 var,日志就是典型;配置文件进 etc。剩下的,用到时再查,查过两三次自然就记住了。硬背目录表的性价比,比硬背字典还低。

3.3 五种文件类型:设备也是文件

所谓「一切皆文件」,是指系统对数据文件、程序文件、设备(屏幕、触摸屏、鼠标)、网络套接字这些东西,全都抽象成文件,用同一套方式管理。这里最容易误解的一点是扩展名:在这个体系里,文件可以没有扩展名,扩展名只是给人看的习惯,系统判断类型靠的是文件自身的属性。file命令能告诉你它到底是什么——后面跟文件名就查一个,跟通配符*就查当前目录下所有文件的类型。

常用的文件类型有五种。普通文件存放数据、程序等信息,一般长期放在外存,文本文件、数据文件、可执行的二进制程序都算。目录文件是特殊文件,利用它构成文件系统的树形结构;用户进程可以读取目录,但不能修改,只有系统管理员能改;每个目录文件至少包含两个条目,一个点表示这个目录本身,两个点表示上一级目录。设备文件是每个设备映射出来的文件,用于向输入输出设备提供连接,分字符设备和块设备——字符设备按字符存取,块设备按块存取,每一种设备对应一个设备文件放在 /dev 下。管道文件多用于进程之间的通信。链接文件类似于快捷方式,内部又分软链接和硬链接。

这里有个新手常问的问题:既然不看扩展名,那怎么知道一个文件能不能运行?答案是权限里的那一位执行位,第五章和第四章都会讲到它。

4. 路径与权限:读懂 / 和那串 rwx

4.1 绝对路径与相对路径

先说一个会让人第一次就翻车的细节:分隔符。这套系统的路径分隔符是斜杠/,另一套常见系统用的是反斜杠\。方向反了,路径就找不到。

路径分两种。绝对路径从目录树的根开始,往下直到目标文件所经过的所有节点,下级目录接在上级目录后面用/隔开,因为它总是从根开始,所以第一个字符一定是/。相对路径指的是目标目录相对于当前所在目录的位置。如果目标不在当前目录下,就要用两个特殊目录:一个点指向当前目录,两个点指向上级目录。

举个例子。假设当前在/home/edu/doc,想访问/home/edu/note.txt,可以写成../note.txt——先退到上一级,再进目标文件。想访问自己刚新建的临时文件,写./tmp.txt和写tmp.txt是一回事,一个点只是把「当前目录」显式写出来。

再打个比方:绝对路径是快递全地址,省市区街道门牌一个不落;相对路径是「从我这出门左转第二栋」,省字,但必须站在对的位置上说。什么时候用哪个?脚本里用绝对路径,因为脚本可能在任意目录被调用;手敲的时候用相对路径,图个短。

4.2 三种身份、三种权限

这是典型的多人系统,不同用户处在不同位置,对文件和目录有不同权限。除了身份认证、访问控制、传输安全这些层面,最基础的一层是文件读写权限:每个文件和目录都带访问权限,这些权限决定了谁能访问、以及如何访问。

身份分三种。所有者,就是创建文件的用户,文件归他,他可以允许同组的人访问自己的文件。用户组,把一类人组合在一起,比如某个项目里的成员全归到一个组,组内成员可以按组权限访问。其他用户,系统里剩下的所有人。

用相册类比最直观:这个相册是我的,我相当于管理者,想怎么看怎么看;我可以设置「只让这一组人看」,这组人相当于用户组;也可以设置「所有人都能看」,剩下的那些人就是其他用户。三种身份,三档开关。

权限也分三种。读权限对文件而言是读取内容,对目录而言是浏览目录;写权限对文件而言是新增和修改内容,对目录而言是删除、移动目录内的文件;执行权限对文件而言是能运行它,对目录而言是能进入它。

注意:通常只有文件的属主或超级用户能修改文件的读写权限。这条经常被忽略——你看到一个文件权限不对、想动手改,先确认自己是不是属主,否则会白白折腾半天。

4.3 读懂 -rwxr-xr--

用长格式列目录时,第一列就是这串字符。第 1 个字母代表文件类型:d 是文件夹,- 是普通文件,c 是硬件字符设备,b 是硬件块设备,l 是软链接,管道这类特殊文件用另外的字母表示。

后面 9 个字母分三组,每组三位,依次是所有者、用户组、其他用户拥有的权限。每一位要么是字母表示有权限,要么是短横线表示没有。所以-rwxr-xr--读起来就是:这是一个普通文件;所有者可读可写可执行;同组的人可读可执行、但不能写;其他人只可读。

数字记法更快:r 记 4,w 记 2,x 记 1,一组三位加起来。rwx 是 7,r-x 是 5,r-- 是 4,所以刚才那个权限就是 754。

# 查看当前目录详情,-l 是长格式,-h 让文件大小更好读 ls -lh # 把 note.sh 设为「自己可读写执行、同组可读执行、其他人无权限」 # 7 = rwx,5 = r-x,0 = ---,三组数字依次对应三种身份 chmod 750 note.sh # 只给所有者增加执行权限,其余权限保持不变 chmod u+x note.sh

代码里的chmod就是改权限的动作。三组数字对应所有者、用户组、其他用户;也可以用字母写法,u 代表所有者、g 代表用户组、o 代表其他、a 代表全部,加号减号表示增加或取消。写完立刻用ls -l看一眼,是最省事的自查方式——权限这东西改错了不会报错,只会让你在几分钟后莫名其妙地失败。

5. 常见误区:四个最容易混的概念

概念本身不难,难的是它们彼此长得太像。下面这四组,是初学者最容易糊在一起的地方,每一组都值得停下来分清楚。

5.1 Unix 和 Linux 是父子,还是各过各的

易混点:以为 Linux 是 Unix 的新版本,或者 Unix 后来改名成了 Linux。

为什么会混:两者的命令几乎一样,目录结构一样,连「一切皆文件」这种设计思路都一样,还共用「类 Unix」这个说法。

怎么区分:Unix 是 70 年代起发展起来的一批系统,商业授权、源码闭源、绑定在大型机和小型机上、价格昂贵;Linux 是 90 年代重新写出来的内核,免费、不受版权制约、跑在普通 x86 硬件上,把这套系统的特性在那类硬件上重新实现了一遍。两者的关系更像两套方言,而不是父子。一个简单的判断方法:要授权费、拿不到源码、绑特定硬件的,多半属于 Unix 那一支;能自由下载、能自己编译、由社区维护的,属于 Linux 这一支。

5.2 内核版本和发行版版本,不是一回事

易混点:看到系统版本号,以为那就是内核版本。

为什么会混:两者都叫「版本」,都出现在「关于本机」这类地方,而且经常一起升级。

怎么区分:内核版本是心脏的版本,分稳定版和开发版循环演进,改的是驱动、调度、内存管理这些底层东西;发行版版本是整套打包的版本,包含内核、函数库、桌面环境、办公套件、媒体播放器、数据库等。同一个内核可以被包装成很多发行版,同一个发行版的不同版本也可能用同一个内核。所以「系统升级了」和「内核升级了」是两件事,前者可能只换了外衣。类比一下:同一款发动机装进不同的车,车年年改款,发动机可能三五年才换一代。

5.3 软链接和硬链接,都叫快捷方式但差很远

易混点:以为两种链接都是那种点一下就跳转的快捷方式。

为什么会混:另一套系统里只有快捷方式一个概念,于是很容易把两种链接都往里套。

怎么区分:软链接是一个独立的小文件,内容是「目标在哪条路径」,目标一删,它就成了悬空的指针;硬链接是同一份数据的另一个名字,删掉其中一个名字,数据还在,另一个名字照常能用。软链接可以跨分区、可以指向目录;硬链接通常不能跨分区、不能指向目录。看ls -l的第一列最直接:l 开头的是软链接,后面还会显示它指向哪里。

5.4 目录的读权限和执行权限,意义完全不同

易混点:以为目录有读权限就能进去。

为什么会混:文件的读权限就是读内容,太直观了,顺手就套到目录上。

怎么区分:目录的读权限是「能列出里面有哪些名字」,对应列目录的动作;目录的执行权限才是「能进入、能穿过」,对应切换目录的动作;目录的写权限是「能在里面新建、删除、改名文件」。只有读没有执行,你能看到名字,却打不开也进不去,这种状态最让人懵。反过来只有执行没有读,你能进去,但列不出内容——人站在屋子里,看不见屋里有什么。这两种半吊子状态,是权限排查里最常见的坑。

6. 什么时候该用命令行,什么时候别硬啃

图形界面越来越友好,很多人会问:还学命令行干什么?答案不是「必须学」,而是「某些场景下没有替代品」。把边界划清楚,比咬牙背两百个命令有用得多。

值得走命令行的场景有三种。第一种是够不着图形界面的时候:远程连上一台机器,屏幕上只有一行提示符,所有操作都得靠命令完成。第二种是批量操作:要在一堆文件里挑出特定后缀的那些,逐个点开太慢,而通配符一条就能命中一批。第三种是出问题的时候:日志、进程、磁盘占用,这些信息在命令行里看得最全。

# 列出当前目录下所有 .c 文件的详细信息,-h 让大小更人性化 ls -lh *.c # 把 /var/log 的目录列表写进文件,终端上不再显示;> 会覆盖同名文件 ls -lh /var/log > log_list.txt # 忘了参数含义时,先看命令自带的帮助,再查手册 ls --help man 1 ls

这里几个要点:*是通配符,代表文件名中的任意多个字符,?代表任意一个字符,方括号里可以写字符范围,想让通配符当普通字符用就在前面加反斜杠;>是输出重定向,命令本来显示在屏幕上的结果会被写进指定文件,文件不存在就创建,存在就覆盖。查帮助有两条路:多数命令自带--help,但并不是所有命令都有;man是更完整的手册,分很多章节,标准命令在第 1 章,系统调用在第 2 章,库函数在第 3 章,设备文件在第 4 章,文件格式在第 5 章,管理员命令在第 8 章。手册里空格翻页、回车滚一行、q退出、/加关键词搜索。有个细节值得记住:如果命令名和函数名重名,不指定章节号就只会查到命令那一份,所以老手习惯写成man 1 ls这种形式。

不必硬啃的情况也有两种。一种是纯一次性的桌面操作:装个软件、改个壁纸,图形界面三下点完,非要敲命令属于给自己找事。另一种是拿不熟的命令直接在重要机器上试手——权限和删除类的操作没有后悔药,先在一台不重要的环境里跑一遍,看清楚输出再动真格的。

我自己的血泪经验是:早些年图快,在一台跑着服务的机器上直接敲了一条带通配符的删除命令,手一抖少打了一个字符,通配符的范围一下子扩大了好几倍。那次之后,我每次敲完带通配符或者重定向的命令,都强制先用ls把同样的匹配列一遍,确认命中的文件就是我以为的那些,才敢按回车。多花的那三秒钟,抵得上事后一整天。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表