树莓派基础之文件系统认知

文件系统认知

  • 一:文件系统:
  • 二:文件系统的补充:
  • 三:虚拟文件系统(Virtual File Systems)
  • 四:Linux内核结构介绍

一:文件系统:

1.什么是文件系统?
常规认知:根目录

文件系统是操作系统用于明确存储设备组织文件的方法。
以上说的方法:就是文件管理系统(程序),简称文件系统

2.文件系统(文件管理系统的方法)有哪些种类格式?
大致有:FAT、VFAT、NTFS、EXT1\2\3\4、HFS…它们是存储在文件系统上的格式

树莓派查看文件系统的命令:

df -T

树莓派基础之文件系统认知_第1张图片
vfat :boot(bootloader,kernel)
ext4 :根目录
tmpfs :内存文件系统

3.什么是分区?
windows:随意(面向普通用户PC),目录即分区
C盘(装系统的位置)也可以随意在C盘存放文件
D盘(用户随意发挥)

Linux:按照功能来分区,每个分区严格存放文件(开发者)
嵌入式系统可以分为4个区,分别是
bootloader:启动代码
para:启动代码向内核传递参数的位置
kernel:内核分区
根分区:文件系统结构

windows和Linux分区的不同:
windows:分区明显,C盘和D盘,哪些文件在哪个磁盘分区一目了然
Linux:分区不明显,所有的文件都在根目录(/)下 每个文件根据功能分布在各自目录下,四个分区的文件被包含在根目录下

4.什么是文件系统目录结构?
Linux系统中,目录被组织成一个:单根倒置树结构,文件系统从根目录开始,用/来表示。文件名称区分大小写( 大小写敏感还需要看具体的文件系统格式 ),以 . 开头的为隐藏文件,路径用 / 来进行分割(windows中使用 \ 来分割),文件有两个种类:元数据与数据本身 . 在操作linux系统时,通常会遵循以下的分层结构规则:

LSB (Linux Standard Base) / FHS(Filesystem Hierarchy Standard)
树莓派基础之文件系统认知_第2张图片
/ 所有linux操作系统的顶点目录,不像windows,每个分区都有一个顶点目录
/boot 存放系统启动时相关的文件,比如kernel内核,grub引导菜单.(不要删除.)
/bin 存放的都是命令,但仅普通用户能执行
/sbin 超级管理员能执行的命令.
/home 存放普通用户的家目录
/root 超级管理员的家目录,普通用户是无法进入
/etc 存放配置文件的目录,
/etc/hostname 主机名
/etc/hosts 本地解析域名一种方式
/etc/sysconfig/network-script/ifcfg-* 网卡的配置文件
/dev 设备目录,硬盘\硬盘的分区\光盘…
/dev/null 黑洞,接收所有的东西,只进不出
/dev/zero 摇钱树,可以生产源源不断的数据
/dev/random 产生随机数的一个设备
/dev/pts/0 虚拟的Bash Shell终端,提供给远程用户使用 0,代表一个终端 1代表2个终端 以此类推
/usr 类似于windows的C盘下面的windows目录
/usr/lib 共享库文件,后缀都是so结尾, share object
/usr/lib64 共享库文件64位,后缀都是so结尾, share object
/usr/local 早起大家都把软件放在这个目录下,和windows C:\ProgramFile
/usr/bin
/usr/sbin
/var 存放一些可变化的内容,比如/var/log日志,可以人为让其发生变化,也或者是随着时间推移产生变化
/tmp 存放临时文件,无论哪个用户都可以放
/proc 反馈当前运行的进程的状态信息.
/run 存放程序运行后所产生的pid文件
/media
/mnt 提供挂载的一个目录
/opt 早期第三方厂商的软件存放的目录.
/srv 物理设备产生的一些文件

Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。
/etc: 这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。
/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下的。
值得提出的是,/bin, /usr/bin 是给系统用户使用的指令(除root外的通用户),而 /sbin, /usr/sbin 则是给root使用的指令。
/var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在 /var/log 目录下,另外mail的预设放置也是在这里。

二:文件系统的补充:

1.进入根目录下的bin目录
总所周知,Linux操作系统下一切皆文件,bin目录下的是一些指令文件:
树莓派基础之文件系统认知_第3张图片

2.boot:内核启动相关的文件
在这里插入图片描述

3.home:用户开发目录,不同的用户有不同的目录,我们目前是在/home/pi用户下做开发
在这里插入图片描述
在工作中,在home下不可能只有一个用户目录,老板还会给其他人开通其他用户目录,然后一起在同一台服务器上愉快的做开发,每个用户目录之间不能相互干扰,顶多可以看,因为没有权限。

4.lib:系统库相关文件
在这里插入图片描述

5.proc:内核提供的用户的一些信息文件
树莓派基础之文件系统认知_第4张图片

6.root:超级管理员目录,一般都进不去
在这里插入图片描述

7.sbin:系统的一些指令,跟bin差不多
树莓派基础之文件系统认知_第5张图片

8.etc:系统程序配置文件
树莓派基础之文件系统认知_第6张图片
比如修改配置嵌入式设备开机启动文件:
树莓派基础之文件系统认知_第7张图片
在该文件下(红色框指令后面)添加某绝对路径下可执行程序,就可以使设备开机便启动该程序:
树莓派基础之文件系统认知_第8张图片
通常一般改etc目录下的rc.local文件:

vi rc.local //在/etc目录下

树莓派基础之文件系统认知_第9张图片
你看,我们的IP地址就是通过这样来固定,就是通过开机自动来配这段IP。所以我们也可以在后面添加某绝对路径下的可执行成程序,让设备一开机就可以执行该程序。

9.dev:所有驱动设备的文件
树莓派基础之文件系统认知_第10张图片

三:虚拟文件系统(Virtual File Systems)

1.什么是虚拟文件系统?
虚拟文件系统(VFS)是对各种文件系统的一个抽象,它为各种文件系统提供了一个通用的接口

2.虚拟文件系统有什么作用?
简化应用程序员的开发
不管是什么文件类型,不管文件是磁盘还是设备,都只用open read write 统一操作
树莓派基础之文件系统认知_第11张图片
用户端不管是打开的硬盘上的文件,还是串口文件,都不用担心该文件的文件系统格式,因为vfs 都给你提供了帮助,直接就可以调用。

四:Linux内核结构介绍

1.内核结构框图:
树莓派基础之文件系统认知_第12张图片
一般我们开发是在应用级,然后通过内核的系统调用接口,让内核去完成我们想要的功能。

2.补充:另一种内核结构框架图:
树莓派基础之文件系统认知_第13张图片
最内层是硬件,最外层是用户常用的应用。硬件是物质基础,而应用提供服务。但在两者之间,还要经过一番周折。

还记得。Linux首先启动内核 (kernel),内核是一段计算机程序,这个程序直接管理管理硬件,包括CPU、内存空间、硬盘接口、网络接口等等。所有的计算机操作都要通过内核传递给硬件。

为了方便调用内核,Linux将内核的功能接口制作成系统调用(system call)。系统调用看起来就像C语言的函数。你可以在程序中直接调用。Linux系统有两百多个这样的系统调用。用户不需要了解内核的复杂结构,就可以使用内核。系统调用是操作系统的最小功能单位。一个操作系统,以及基于操作系统的应用,都不可能实现超越系统调用的功能。一个系统调用函数就像是汉字的一个笔画。任何一个汉字都要由基本的笔画(点、横、撇等等)构成。我不能臆造笔画。

在命令行中输入 m a n 2 s y s c a l l s 可以查看所有的系统调用。你也可以通过 man 2 syscalls可以查看所有的系统调用。你也可以通过 man2syscalls可以查看所有的系统调用。你也可以通过man 2 read来查看系统调用read()的说明。在这两个命令中的2都表示我们要在2类(系统调用类)中查询 (具体各个类是什么可以通过$man man看到)。

系统调用提供的功能非常基础,所以使用起来很麻烦。一个简单的给变量分配内存空间的操作,就需要动用多个系统调用。Linux定义一些库函数(library routine)来将系统调用组合成某些常用的功能。上面的分配内存的操作,可以定义成一个库函数(像malloc()这样的函数)。再比如说,在读取文件的时候,系统调用要求我们设置好所需要的缓冲。我可以使用Standard IO库中的读取函数。这个读取函数既负责设置缓冲,又负责使用读取的系统调用函数。使用库函数对于机器来说并没有效率上的优势,但可以把程序员从细节中解救出来。库函数就像是汉字的偏旁部首,它由笔画组成,但使用偏旁部首更容易组成字,比如"铁"。当然,你也完全可以不使用库函数,而直接调用系统函数,就像“人”字一样,不用偏旁部首。

(实际上,一个操作系统要称得上是UNIX系统,必须要拥有一些库函数,比如ISO C标准库,POSIX标准等。)

shell是一个特殊的应用。很多用户将它称为 :shell是一个命令解释器(interpreter),当我们输入“ls -l”的时候,它将此字符串解释为:
1.在默认路径找到该文件(/bin/ls),
2.执行该文件,并附带参数"-l"。

我之前用 ,也是通过shell解释&或者|的含义。Shell接着通过系统调用指挥内核,实现具体的重定向或者管道。在没有图形界面之前,shell充当了用户的界面,当用户要运行某些应用时,通过shell输入命令,来运行程序。shell是可编程的,它可以执行符合shell语法的文本。这样的文本叫做shell脚本(script)。可以在架构图中看到,shell下通系统调用,上通各种应用,同时还有许多自身的小工具可以使用。Shell脚本可以在寥寥数行中,实现复杂的功能。

UNIX的一条哲学是让每个程序尽量独立的做好一个小的功能。而shell充当了这些小功能之间的"胶水",让不同程序能够以一个清晰的接口(文本流)协同工作,从而增强各个程序的功能。这也是Linux老鸟鼓励新手多用shell,少用图形化界面的原因之一。

(shell也有很多种,最常见的是bash, 另外还有sh, csh, tcsh, ksh。它们出现的年代不同,所支持的功能也有差异。)

一个使用bash shell的终端

一个shell对应一个终端 (terminal)。曾经来说,终端是一个硬件设备,用来输入并显示输出。如今,由于图形化界面的普及,终端往往就像上图一样,是一个图形化的窗口。你可以通过这个窗口输入或者输出文本。这个文本直接传递给shell进行分析解释,然后执行。

最后,我们进入一般的应用。应用是一个程序,它可以

1.直接调用系统函数
2.调用库函数
3.运行shell脚本

这些应用可以由多种语言开发。最常见的是C语言。

总结

Linux利用内核实现软硬件的对话。

通过系统调用的这个接口,Linux将上层的应用与下层的内核分离,隐藏了底层的复杂性,也提高了上层应用的可移植性。

库函数利用系统调用创造出模块化的功能,

Shell则提供了一个用户界面,并让我们可以利用shell的语法编写脚本,以整合程序。

你可能感兴趣的:(树莓派基础,linux,运维)