Linux-Part.2
Linux 总是无处不在的,或许我对他并不陌生,但从未系统学习过,这篇文章将记录我系统学习 Linux 的过程经历,遇到的问题,总结的笔记,便于我留存记录,也供大家参考学习
学习路线可参考:https://labex.io/zh/linuxjourney
设备
/dev目录在 Linux 中,连接到系统的各种硬件设备(键盘、硬盘等),都由一个特殊文件表示,这些文件被称为设备文件,位于
/dev目录下,可以使用正常的标准命令来和这些文件进行交互1
ls /dev
这将显示许多条目,每个条目对应一个硬件设备或者虚拟设备,例如我们之前已经与
/dev/null这个虚拟设备进行过交互早期的
/dev目录是静态的,所有可能的硬件的设备文件都是在安装过程中创建的,导致可能某个设备文件对应于甚至不存在的硬件。此外,在重启系统时根据内核检测设备的顺序,设备名称可能会发生变化,导致设备文件的配置出现混乱现代的
/dev目录使用动态方法,根据硬件的连接状态动态的创建和删除设备文件,确保/dev只包含当前正在使用的设备的相应文件,并提供了一个持久的命名方案,使系统更可靠、更易于管理1
ls -l /dev
使用长选项查看
/dev目录的文件信息,文件类型不仅以-表示,设备文件的独特文件类型有助于我们识别:c:字符设备。这些设备一次传输一个字符的数据,许多伪设备被表示为字符设备,例如/dev/nullb:块设备。这些设备以固定大小的数据块进行传输,例如硬盘等,他们对基于块的数据访问进行了优化p:管道。FIFO(先进先出),允许进程间通信,作用类似字符设备,但他将输出引导到另一个进程而不是设备s:套接字(socket)。也促进了进程间通信,更加通用,支持多个进程之间的通信,甚至跨网络通信
原本的文件大小字段被替换成了两个字段,表示主设备号和次设备号,例如对于
8, 0的设备,8 通常用于表示 SCSI 磁盘驱动器,而 0 表示这个驱动程序的特定实例,0 通常表示第一个驱动器关于常见的设备名称,参考:https://labex.io/zh/lesson/device-names
/sys目录sysfs是一个虚拟文件系统,通常挂载在/sys,它将内核对象、硬件设备和驱动程序的信息从内核模型导出到用户空间。/sys目录的主要作用是提供对系统上所有设备的结构化视图,/sys能反映出内核和设备的当前状态,当内核与设备状态发生变化时,/sys能即时反应这种变化1
2
3
4
5
6 ~/mysrc ❯ ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 3月 1 09:12 /dev/sda
~/mysrc ❯ ls /sys/block/sda
alignment_offset dev diskseq events_poll_msecs holders mq queue ro sda16 stat uevent
bdi device events ext_range inflight partscan range sda1 size subsystem
capability discard_alignment events_async hidden integrity power removable sda15 slaves trace可以看到,
/sys比/dev提供了更详细的视图,他们作用不同,/dev提供设备节点,允许用户通过这些设备文件与设备交互;/sys用于查看有关设备的详细信息,暴露设备的底层模型udev在旧的 Linux 系统中,我们可以手动创建设备节点:
1
mknod /dev/sdb1 b 8 3
如果要删除设备,只需要在
/dev目录中rm该设备文件现在的 Linux 版本中,我们不需要这样做,
udev系统会根据设备是否连接来动态地为我们创建和删除设备文件。系统上运行着一个udev守护进程,它监听来自内核中关于连接到系统的设备的信息,依据/etc/udev/rules.d中的规则自动创建和删除设备文件。我们也可以编写自己的 udev 规则(通常不需要)
你还可以使用
udevadm info命令查看设备的详细信息,例如:1
udevadm info --query=all --name=/dev/sda
列出硬件设备
类似
ls列出文件,第三方工具提供了 ls 的衍生命令:1
2
3lsusb # sudo apt install usbutils
lspci # sudo apt install pciutils
lsscsi # sudo apt install lsscsi- USB 设备:通常指一些支持热插拔的外设,例如U盘、鼠标、摄像头等
- PCI 设备:直接连接在主板上的高速总线设备,例如显卡、网络设备器、声卡等
- SCSI 设备:Linux SCSI 子系统管理的存储设备(即使是 SATA、USB 等现代存储设备,Linux 也使用 SCSI 子系统统一管理),大多数存储设备设备都采用 SCSI 协议管理
dddd是一个强大而危险的命令,可以用来复制文件内容(按字节复制)1
dd if=~/mysrc/pic/kirito.jpg of=~/mysrc/pic/kirito-cp.jpg bs=1024
这个会将
kirito.jpg的内容复制到kirito-cp.jpg中,它每次读取 1024 个字节,循环完成复制整个文件if:in file,表示输入文件of:out file,表示输出文件bs:每次传输的数据大小,默认是 512 字节(b),可以使用后缀表示更大的单位,例如 1k, 1M, 1Gcount:如果你不想复制整个文件,可以用count = 2来制定复制 2 块
dd可以很方便的用来备份服务器数据,备份和恢复磁盘数据,但要注意输入命令的正确性,防止数据丢失
文件系统
文件系统层次结构
大家都知道 Linux 的文件系统是树状的,具体常见目录如下:
根目录
/:根目录,无须多言
关键系统目录
bin:包含所有用户可以使用的基本命令程序(二进制文件),如ls等sbin:存放基本的系统二进制文件,这些文件主要由系统管理员使用,通常只能由 root 运行/etc:核心系统配置文件目录,包含操作系统和已安装应用程序的配置文件,不应该包含任何可执行的二进制文件/boot:存放系统启动过程中所需要的文件,包括 Linux 内核和引导加载程序文件
用户和应用程序数据目录
/home:每个用户的个人目录,存放你的文档、应用程序设置和其他个人文件/root:root 用户的家目录/opt:用于存放完整的第三方应用程序软件包(不由发行版“官方仓库策略”管理,自己包含完整目录)/usr:包含用户安装的各种软件和应用程序。/usr有它自己的目录结构,例如/usr/bin下存放发行版提供的二进制文件,例如使用包管理器安装的 java 二进制文件位于/usr/bin/java,而/usr/local下常存放从外部源下载的软件,例如下载的golanag.tar.gz常解压到/usr/local/go中,以及/usr/local/bin/kubectl,还有自己手动编译的/usr/local/bin/hello
动态和临时目录
/var:表示“可变”目录,存储预期会发生大小和内容变化的文件,比如/var/log/目录下的日志文件,还有缓存文件,假脱机文件(系统为了“排队等待处理”的任务而创建的临时文件)等。/var/www目录是 Linux 的 Web 服务默认静态文件的存放位置,Apache 和 Nginx 的默认挂载点(Nginx 也常用/usr/share)/tmp:存放临时文件,每个人都可以写入,且不能删除和移动其他人的文件。重启系统后该目录中的文件通常会被删除/run:包含自上次启动以来,有关正在运行的系统的信息,例如进程 PID 等
设备和挂载点目录
/dev:设备文件,上有介绍/media:可移动媒体(如 USB 驱动器、SD 卡等)的标准挂载点/mnt:临时挂载文件系统的通用挂载点(一般要手动挂载)
系统信息目录
/proc:虚拟文件系统,提供内核和进程的实时详细信息,part1 有介绍/srv:用于提供一个目录,存放“对外提供的服务”的数据,一般普通用户不需要在这里存放个人资料
文件系统类型
使用
df -T命令,df命令报告文件系统磁盘空间使用情况,-T标志专门显示文件系统类型文件系统是操作系统用来管理存储设备上的数据等一套规则和结构,一些常见的 Linux 文件系统类型:
ext4:Linux 扩展文件系统(extended file system)的最新版本,是许多 Linux 发行版的默认设置。它向后兼容前身版本(ext3 ext2),支持非常大的磁盘卷Btrfs:B 树文件系统(B-tree file system),一种现代文件系统,具有内置快照、备份、改善性能等高级功能,作为某些发行版的默认文件系统,仍在积极开发中XFS:一种高性能的日志文件系统,在处理大文件和并行 I / O 操作方面表现出色。它是管理大量数据的系统的绝佳选择(如媒体服务器)NTFS 和 FAT:标准的 windows 文件系统类型,Linux 对他们的读写完全支持,对双系统启动十分有用HFS+:macOS 的主要文件系统类型,Linux 默认对其只提供只读支持
有着许多不同的文件系统实现,Linux 采用**虚拟文件系统(VFS)**来与他们进行统一交互,VFS 是 Linux 内核中的一个抽象层,位于应用程序和各种文件系统之间。它提供了一个单一的、统一的接口,确保应用程序可以无缝工作,而无需关心底层的文件系统类型
大多数现代文件系统默认包含日志记录功能,要理解它的重要性,想象一下在您电脑突然断电时复制一个大文件。在非日志文件系统中,这种中断可能导致文件损坏和文件系统状态不一致。重新启动后,您的系统需要执行完整的磁盘检查 (fsck),这对于大容量磁盘来说可能非常耗时。日志文件系统可以防止这个问题。在执行写入操作之前,它首先将预期的更改记录在一个特殊的日志文件中,一旦操作成功完成,日志就会被更新以标记任务已完成。如果发生崩溃,系统可以在重新启动时简单地读取日志,查看哪些操作正在进行中,并快速将文件系统恢复到一致状态
TODO…
启动系统
启动系统概述
Linux 系统的启动过程可以分为四个阶段:
Part1. BIOS
BIOS(基本输入 / 输出系统)或 UEFI(代替传统 BIOS)是打开计算机电源时运行的第一个软件。它执行开机自检(POST)来初始化和验证CPU、内存、磁盘等系统硬件。硬件检查通过后,BIOS 的主要任务是从存储设备定位并加载引导加载程序
Part2. 引导加载程序
引导加载程序从 BIOS 接管控制权。它的主要作用是将 Linux 内核加载到内存中,Linux 系统常见的引导加载程序是 GRUB,通常 GRUB 会显示一个菜单,允许你选择要启动的操作系统或内核版本。在用户选择后或超时后,它会将选定的内核和初始 RAM 加载到内存中,然后将控制权传递给内核
Part3. 内核
内核一旦加载到内存中,就接管了系统的控制权。它先解压缩自身并初始化核心硬件和内存管理,然后挂载根文件系统,启动第一个进程:
init进程Part4. Init
init进程是内核启动的第一个进程,也是系统上其他所有进程的祖先,它的工作主要是根据配置启动必要的服务和后台进程(守护进程)。init有几种实现,例如传统的System V、Upstart和现代的systemd
TODO…
内核
初始化
init 系统的主要作用是启动和停止必要的进程。Linux 经历了三种 init 实现:System V、Upstart、``
说些什么吧!