2024年7月

前言

在数字化时代,网络安全已成为我们每个人都需要关注的重要议题。无论是个人隐私保护,还是企业数据安全,网络威胁无处不在。了解网络安全的基本知识和防护措施,对我们每个人来说都至关重要。

网络安全

网络安全并非只是对网络做一层防护,而是指保护网络空间的安全,包括硬件、软件、数据和网络本身的安全。随着互联网的普及,我们的个人信息、财产安全乃至国家安全都与网络安全息息相关。

image

网络安全不仅仅是技术问题,更是意识问题。普及网络安全知识,提高公众的网络安全意识,是构建安全网络环境的基础。

常见的网络安全威胁

网络安全领域是一个不断演变的战场事实上,威胁的种类如此繁多,如果能够简单地一一列举并完全防范,那么网络攻击几乎不会发生然而,现实情况远比这复杂得多。每一种威胁都可能以多种形式出现,它们不仅包括那些已经被广泛知晓和记录在案的漏洞,还有许多隐蔽的、不为公众所熟知的风险潜藏在暗处,等待时机发动攻击。我们先来看看有哪些常见的威胁吧。

  • 数据泄露:个人信息如用户名、密码、信用卡信息等被非法获取和使用。
  • 恶意软件攻击:病毒、蠕虫、特洛伊木马等恶意软件对设备造成损害。
  • 跨站脚本攻击(XSS):攻击者在网页中注入恶意脚本,盗取用户信息。
  • 拒绝服务攻击(DoS):通过大量请求使网站无法访问,影响正常服务。
  • SQL注入:攻击者通过注入恶意SQL代码,非法访问或操作数据库。
  • 文件上传漏洞:恶意文件上传执行,控制服务器。
  • 第三方组件漏洞:使用存在漏洞的第三方组件,增加安全风险。
  • 弱密码策略:简单或重复的密码容易被破解。

文件上传漏洞

这里如果看过我之前文章的话。在之前深入探讨腾讯云的EO边缘化CDN产品时,我曾经详细阐述过弱密码策略的问题,并分享了一些实用的防护措施和最佳实践。那么这里就不在讲解了。链接地址在这里:
https://www.cnblogs.com/guoxiaoyu/p/18146848

本次的主题是文件上传漏洞,然而,本篇文章的目的是为读者提供一个坚实的基础,通过详细解释文件上传漏洞的内在原理,帮助大家理解这一安全风险的根源和它对网络环境的潜在影响。但不会深入到具体的攻击技术或防御策略。这些内容将被保留到我们下一篇文章中。

image

文件上传漏洞通常发生在允许用户上传文件的网站上。如果网站的上传机制没有正确地验证和处理上传的文件,攻击者可能会利用这一点上传恶意文件,如可执行脚本或木马程序。这些文件一旦被执行,可能会导致以下后果:

  • 网站被控制:攻击者可以完全控制受影响的服务器。
  • 数据泄露:攻击者可以访问和窃取服务器上的敏感数据。
  • 服务中断:恶意文件可能会消耗服务器资源,导致服务不可用。

常见的文件上传漏洞类型有以下方面:

  • 未限制文件类型:允许上传任何类型的文件,包括可执行文件。
  • 未限制文件大小:允许上传过大的文件,可能导致服务器资源耗尽。
  • 未进行文件内容检查:未检查文件内容是否包含恶意代码。
  • 未限制上传路径:允许文件被上传到服务器的敏感目录。

导致出现这些漏洞的原因也有很多种,比如:在开发过程中未能充分考虑安全因素;服务器配置未正确限制文件上传权限;未实施有效的文件验证和过滤机制。

看着还是很可怕的,大多数开发人员缺乏安全意识,他们只专注于开发业务代码,毕竟已经非常辛苦了。如果还要考虑代码漏洞的话,可能就不再是996了,或许直接每天工作25小时吧。其实对于大多数程序员来讲,漏洞扫描然后升级到指定版本是最常见的了。

文件上传防护措施

  • 限制文件类型:只允许上传特定的文件类型,如图片、文档等。
  • 限制文件大小:设置文件大小上限,防止上传过大的文件。
  • 文件内容检查:对上传的文件进行内容检查,防止包含恶意代码。
  • 使用文件哈希校验:检查文件的哈希值,确保文件未被篡改。
  • 限制上传路径:确保文件只能被上传到非执行目录。
  • 使用文件扫描工具:使用防病毒软件扫描上传的文件,检测潜在的恶意代码。
  • 实施访问控制:限制只有特定用户或角色可以上传文件。
  • 定期审计和监控:定期检查和监控文件上传功能,及时发现和修复安全问题。

总结

在接下来的章节中,我们将继续深入探讨如何攻击和防护文件上传漏洞,以及如何通过简单的方法检查服务器资源。

网络安全是一场没有硝烟的战争,它要求我们时刻保持警惕,不断学习与适应。无论是采用强密码、数据加密,还是定期更新软件、安装安全软件,每一项措施都是我们构建网络安全防线的基石。同时,我们也应意识到,技术手段之外,提升安全意识、培养安全习惯同样至关重要。

说明

本项目将转为开源项目。

\(\text{GitHub}\)
仓库下载链接

\(|\)
项目初始化下载
\(|\)
项目编辑文件下载

项目说明

声明:此项目由
\(\text{So_noSlack}\)
开发,最终解释权归
\(\text{So_noSlack}\)
所有。

该项目是为了帮助老师管理学生量化的程序,默认有三个端口,分别为学生端、教师端和管理端。在主页面可查看版权说明。

该项目突出功能主要有分有
\(3\)
个端口,可分别处理多项操作,互不干扰,各端口功能也十分强大。主要突出“实用”二字,在某学校
\(2509\)
班已投入使用一年时间,期间不断优化代码,已升级至
\([2.1.11]\)
版本,不断改进完善中,更新了日志、提问、查看总排名和导出量化等多个功能。

主要功能:日志----日志功能的开发,主要是为防止学生恶意修改量化而开发的。可记录学生修改时的修改人、修改时间、被修改人、修改分数等。可有效防止恶意修改量化的情况出现,在投入使用期间多次发挥作用,可谓此功能十分强大。

安全性强:在登录教师端或管理端账号时需要输入专用密钥才可成功登录账号,此密钥组中设置了
\(1000\)
个专用密钥,且每次登录时需要输入的密钥都是不同的。因此,只有拥有此密钥组的人员才可登录教师或管理员的账号,若无此密钥组,即使知道了账号密码也不会登录成功。

各端介绍

学生端主要功能 -- 查看量化分数(自己)、查看排名(自己)、修改密码(自己)、修改量化(仅科代表)、向老师对量化提出疑问、退出登录。

教师端主要功能 -- 修改量化.查看排名(全班)、查看修改日志、查看账号(学生/教师 以防忘记密码)、注册账号(学生/教师)、导出数据(导出日志或量化排名)、查看疑问(仅可见向此教师提出的疑问)、退出登录。

管理端主要功能 -- 注册账号(学生/教师/管理)、查看修改日志、查看账号(学生/教师/管理)、修改账号(学生/教师)、查看排名(全班).导出数据(日志/排名)、退出登录。

该项目不仅帮助教师减少计算量化的时间,且有较大的发展空间,可逐渐完善添加更多的功能并优化操作页面,后期会考虑增加数据库支持、改为网页版方便更好的操作等。
在项目中的文件储存是存储在
\(.\text{So_noSlack}\)
文档中的,而这样有一个弊端就是在不同的设备上,数据不会同步,更进一步的打算是在
\(\text{C++}\)
中调用
\(\text{MySQL}\)
数据库,调用用
\(\text{SQL}\)
语句进行数据的储存这样方便在不同设备上的互通。

项目使用细则

项目所有者:
\(\text{So_noSlack}\)
本文作者:
\(\text{H_space & So_noSlack}\)
-----
\(2023.08.20\)

声明:本系统会随实际情况实时更新,如有漏洞,请及时汇报

量化管理系统具体介绍

一.管理特色

应身份管理的需求,本系统更新了新型管理方式,具体如下:

类型(级别) 使用人群 功能
\(\text{Lv}.0\)
(棕色)
被处罚者*
\(\text{Lv}.1\)
(蓝色)
普通学生 查看个人量化及排名,提出疑问
\(\text{Lv}.2\)
(绿色)
课代表、班委 查看个人量化,提出疑问、修改本科量化
\(\text{Lv}.3\)
(橙色)
一级管理员* 使用迟到扣分系统、查看全班量化
\(\text{Lv}.4\)
(红色)
二级管理员* 修改全班量化、导出数据等高级功能
\(\text{Lv}.5\)
(紫色)
三级管理员* 初始化、修改源代码、查处账号、设置密钥

注释:

【被处罚者*】量化低于
\(0\)
分或重大违纪,将会被关小黑屋,成为被处罚者,以后酌情处理。

【一级管理员*】一般授予 高级班委 此权限。

【二级管理员*】一般授予 学委 此权限。

【三级管理员*】一般授予 所有者 此权限。

二.系统简介

本项目的初衷为了帮助老师管理学生量化的程序,默认有三个端口,分别为学生端、教师端和管理端。在软件主页面可查看版权说明。

学生端主要功能 -- 查看量化分数及排名(自己)、修改量化(仅科代表)、向老师对量化提出疑问、退出登录。

教师端主要功能 -- 修改量化、查看排名(全班)、查看修改日志、查看账号(学生/教师 以防忘记密码)、导出数据(导出修改日志、登录日志或量化排名)、查看疑问(仅可见向此教师提出的疑问)、退出登录。

管理端主要功能 -- 查看修改日志、查看账号(学生/教师/管理)、查看排名(全班)、导出数据(导出修改日志、登录日志或量化排名)、退出登录。

迟到扣分系统

一.主要特色

特色一 :使用密钥 ---- 本系统应需求而生。因某种原因没有加登录模块,这使任何人都可进入该系统,并拥有一切权限。所以便想到了使用密钥,于是在进入系统前加上了输入使用密钥这一环节,大大加强了系统安全性及学生量化安全性。并且在进入系统后的所有操作,日志均会记录为
\(\text{Admin}\)
操作。

特色二 :与量化管理系统联动 ---- 本系统为量化管理系统的附属系统,因此如果与量化管理系统没有联动就失去了存在价值。所以我们在记录迟到这一功能中直接与量化管理系统联动,按迟到次数自动计算应扣分数并直接扣分至该学生量化中,不必再人工扣分,十分便捷。这一功能不仅大大方便了使用者而且增加了学生量化公平性。

二.系统简介

本项目因需要记录学生迟到便应运而生,初衷便是为了方便记录并实时扣分。
主要功能有记录迟到、查看扣分、日期查询、历史查询等。其中,记录迟到功能直接与量化系统联动,负责把学生迟到次数和迟到日志更新,该功能也是本项目的核心。查看扣分功能可直接查看所有有迟到记录的学生的迟到次数、本次扣分以及累计扣分,并自动屏蔽无用数据,清晰明了。

使用方法

下载完项目过后,用
\(\text{Visual Stdio}\)
打开编辑文件里的
\(\text{.sln}\)
文件。

找到
\(\text{Code.h}\)
文件中修改账号信息,修改完记得修改一下
\(\text{stu_num,tea_num,man_num}\)
三个变量,分别表示学生、教师、管理员人数。

账号修改完之后重新生成
\(\text{.exe}\)
即可,这样就可以愉快的使用本项目啦!

还有很多功能等你发现!

论文重新审视了深度神经网络中的不确定性估计技术,并整合了一套技术以增强其可靠性。论文的研究表明,多种技术(包括模型正则化、分类器改造和优化策略)的综合应用显着提高了图像分类任务中不确定性预测的准确性

来源:晓飞的算法工程笔记 公众号

论文: SURE: SUrvey REcipes for building reliable and robust deep networks

Introduction


深度神经网络 (
DNNs
) 已成为结构化数据预测任务中强大且适应性高的工具,但准确评估其预测的可靠性仍然是一个巨大的挑战。在医疗诊断、机器人、自动驾驶和地球观测系统等关键安全领域,过度自信的预测的决策可能会导致严重的后果。因此,确保基于
DNN
的人工智能系统的鲁棒性至关重要。

解决深度学习中的过度自信问题一直是重大研究工作的焦点,但目前很多方法的一个关键限制是测试场景有限,通常仅限于单个预定义任务(例如故障预测或分布外检测(
OOD
))的基准数据集。这些方法在涉及更复杂的现实情况时(如数据损坏、标签噪声或长尾类分布等),其有效性仍很大程度上尚未得到充分探索。而且通过实验表明,没有一种方法能够在不同的场景中表现一致。为此,论文提出了一个有效解决所有这些挑战的统一模型。

在论文追求增强不确定性估计的过程中,论文首先检查几种现有方法的综合影响,从而发现一种可以显着改进的综合方法。根据这些方法在模型训练过程中的功能对进行分类:

  • 正则化和分类器:利用
    RegMixup
    正则化、正确性排名损失 (
    CRL
    ) 和余弦相似性分类器 (
    CSC
    ) 等技术,这有助于增加具有挑战性的样本的熵。
  • 优化策略:按照
    FMFP
    的建议结合了锐度感知最小化 (
    SAM
    ) 和随机权重平均 (
    SWA
    ),确保模型能够收敛到更平坦的最小值。

这些不同技术的协同整合最终形成了论文的新颖方法
SURE
,该方法利用了每个单独组件的优势,产生了更加稳健和可靠的模型。

在评估
SURE
时,论文首先关注错误预测(
failure prediction
),这是评估不确定性估计的关键任务。结果表明,
SURE
始终优于部署单独技术的模型。这种卓越的性能在
CIFAR10

CIFAR-100

Tiny-ImageNet
等各种数据集以及
ResNet

VGG

DenseNet

WideResNet

DeiT
等各种模型架构中都很明显。值得注意的是,
SURE
甚至超越了
OpenMix
,这是一种利用额外
OOD
数据的方法。通过将
SURE
直接应用到现实场景中,无需或只进行很少的特定于任务的调整,进一步见证了在为模型带来鲁棒性方面的有效性。具体来说,现实世界的挑战包括
CIFAR10-C
中的数据损坏、
Animal-10N

Food-101N
中的标签噪声以及
CIFARLT
中的类分布倾斜。在这些背景下,
SURE
取得的结果要么优于最新的方法,要么与最新的方法相当。
SURE

Food-101N
上达到了 88.0% 的令人印象深刻的准确率,显着超过了之前最先进的方法
Jigsaw-ViT
,该方法通过使用额外的预训练数据达到了 86.7% 的准确率,这证明了
SURE
在处理复杂的现实数据挑战方面的卓越能力。

本文的主要贡献总结如下:

  • 实验证明现有方法在应对各种现实挑战时并不总能表现出色,需要更可靠、更稳健的方法来处理现实世界数据的复杂性。
  • 提出用于鲁棒的不确定性估计的新颖方法
    SURE
    ,结合模型正则化、分类器和优化策略等多种技术所实现的协同效应。在
    SURE
    方法下训练的模型在故障预测方面始终比在各种数据集和模型架构中部署单独技术的模型取得更好的性能。
  • 直接应用于现实场景时,
    SURE
    始终表现出至少与最先进的方法相当的性能。

Methods


如图 2 所示,
SURE
旨在通过两个方面训练可靠且鲁棒的
DNN
:i)增加难样本的熵; ii) 在优化过程中强制寻找平坦极值(
flat minima
)。

定义
\(\{(\mathbf{x}_{i},\mathbf{y}_{i})\}_{i=1}^{N}\)
表示数据集,其中
\(\mathbf{x}_{i}\)
是输入图像,
\(\mathbf{y}_{i}\)
是其标签,
\(N\)
是样本数。

SURE
中增加难样本熵的方法由三个部分组成:

  • 增加
    RegMixup
    正则化
    \(\mathcal{L}_{mix}\)
    ,通过数据增强添加难样本。
  • 增加正确性排名损失
    \(\mathcal{L}_{crl}\)
    ,通过将实例的置信度与正确预测次数比例进行排序对齐来正则化类概率。
  • 在分类的交叉熵损失
    \({\mathcal{L}}_{ce}\)
    使用余弦相似度分类器(
    CSC
    )的结果作为输入,可以更好地表达难样本。

此外,为了平坦极值,在优化过程中使用锐度感知最小化 (
SAM
) 和随机权重平均 (
SWA
)。

Increasing entropy for hard samples

  • Total loss

如上所述,
SURE
的目标函数由三部分组成,表示为:

\[\mathcal{L}_{total}=\mathcal{L}_{ce}+\lambda_{mix}\mathcal{L}_{mix}+\lambda_{crl}\mathcal{L}_{crl}

\quad\quad (1)
\]

  • RegMixup regularization

Mixup
是一种广泛用于图像分类的数据增强方法。

给定两个输入目标对
\((\mathbf{x}_{i},\mathbf{y}_{i})\)

\((\mathbf{x}_{j},\mathbf{y}_{j})\)
,通过线性插值来获得增强样本
\((\tilde{\mathbf{x}}_{i}, {\tilde{\mathbf{y}}}_{i})\)

\[\tilde{{\bf x}}_{i}=m{\bf x}_{i}+(1-m){\bf x}_{j},\quad\tilde{{\bf y}}_{i}=m{\bf y}_{i}+(1-m){\bf y}_{j}

\quad\quad (2)
\]

其中
\(m\)
表示混合系数,遵循
Beta
分布:

\[m\sim\mathrm{Beta}(\beta,\beta),~~~\beta\in(0,\infty)

\quad\quad (3)
\]

RegMixup
正则化
\(\mathcal{L}_{mix}\)
计算增强样本的损失值:

\[\mathcal{L}_{mix}(\tilde{\bf x}_{i},\tilde{\bf y}_{i})=\mathcal{L}_{ce}(\tilde{\bf x}_{i},\tilde{\bf y}_{i})

\quad\quad (4)
\]

设置
\(\beta=10\)
,确保两个样本高度混合。


RegMixup
类似,将
\(\mathcal{L}_{mix}\)
作为附加正则化器,与
\((\mathbf{x}_{i},\mathbf{y}_{i})\)
上的原始交叉熵损失
\(\mathcal{L}_{ce}\)
一起使用。 较高的
\(\beta\)
值会导致样本严重混合,促使模型在大量的插值样本上表现出高熵,增加训练的挑战性。

  • Correctness ranking loss

正确性排名损失鼓励
DNN
将模型的置信度与训练期间收集的正确预测比例信息保持一致(即经常预测正确的图像,其置信度也应该高于不经常预测正确的图像)。

对于两个输入图像
\(\mathbf{x}_{i}\)

\(\mathbf{x}_{j}\)

\(\mathcal{L}_{crl}\)
的定义为:

\[{\mathcal{L}}_{crl}(\mathbf{x}_{i},\mathbf{x}_{j})=\operatorname*{max}(0,|c_{i}-c_{j}|-\operatorname{sign}(c_{i}-c_{j})(\mathbf{s}_{i}-\mathbf{s}_{j}))

\quad\quad (5)
\]

其中
\(c_{i}\)

\(c_{j}\)
表示训练期间
\(\mathbf{x}_{i}\)

\(\mathbf{x}_{j}\)
被正确预测的比例,
\(\mathbf{s}_{i}\)

\(\mathbf{s}_{j}\)
表示
\(\mathbf{x}_{i}\)

\(\mathbf{x}_{j}\)
的置信度得分,即
softmax
得分,
sign
表示符号函数。

\(\mathcal{L}_{crl}\)
旨在将置信度得分与正确性统计数据对齐,难样本在训练过程中不太可能被正确预测,因此鼓励其具有较低的置信度,从而具有较高的熵来进行反向更新。

  • Cosine Similarity Classifier (CSC)

CSC
通过简单地用余弦分类器替换最后一个线性层,在少样本分类中有不错效果。简单而言就是每个类学习一个原型向量,将其与图像的特征网络输出进行余弦相似计算,将结果作为预测分数。

对于图像
\(\mathbf{x}_{i}\)
,分类向量中对应
\(k\)
类的单元表示为
\(\mathbf{s}_{i}^{k}\)
,其定义如下:

\[\mathrm{s}_{i}^{k}=\tau\cdot\mathrm{cos}(f_{\theta}(\mathbf{x}_{i}),w^{k})=\tau\cdot\frac{f_{\theta}(\mathbf{x}_{i})}{||f_{\theta}(\mathbf{x}_{i})||_{2}}\cdot\frac{w^{k}}{||w^{k}||_{2}},

\quad\quad (6)
\]

其中
\(\tau\)
是温度超参数,
\(f_{\theta}\)

\(\theta\)
参数化的
DNN
网络,用于提取输入图像的特征,
\(w^{k}\)
代表第
\(k\)
类的原型向量。

CSC
鼓励分类器关注从输入图像提取的特征向量与类原型向量之间的方向对齐,这使得它在概念上不同于传统的线性分类器。传统的线性分类器中关注点积得出的幅值(用于进行
softmax
),而
CSC
仅关注其方向是否一致。
CSC
的一个主要好处是能够更好地处理难样品,将难样本视为与多个类原型向量在余弦角度相等,从而比使用点积的传统线性分类器提供更有效的可解释性和潜在更高的熵。

Flat minima-enforced optimization

论文联合采用锐度感知最小化(
SAM
)和随机权重平均(
SWA
)来增强平面最小值。

  • Sharpness-Aware Minimization (SAM)

由于参数量巨大,深度模型存在较多的局部极值,而优化过程就是在寻找其中一个极值。一般认为,平坦的极值比尖锐的极值的泛化能力更强。为此,
SAM
通过寻找邻域平坦的参数来增强模型泛化能力,从而使
DNN
具有一致的小损失,避免陷入尖锐的局部极值。

对于论文的目标函数
\({\mathcal{L}}_{total}\)

DNN
参数
\({\boldsymbol{\theta}}\)

SAM
优化器寻求满足以下公式的
\(\theta\)

\[\underset{\theta}{\mathrm{min}}\underset{||\epsilon||_2\leq\rho}{\mathrm{max}} \mathcal{L}_{total}(\theta+\epsilon)

\quad\quad(7)
\]

其中
\(\epsilon\)
是扰动向量,
\(\rho\)
是论文寻求最小化损失锐度的邻域大小。

SAM
算法在
\(\ell_2\)
范数小于
\(\rho\)
的范围内寻找使损失最大化的扰动向量
\(\epsilon\)
(此过程需要基于
\(\theta\)
产生的梯度进行计算),然后基于
\(\theta + \epsilon\)
产生的新梯度反向更新模型参数
\(\theta\)
,交替进行上面两个步骤来最小化扰动损失。

  • Stochastic Weight Averaging (SWA)

SWA
通过在训练过程中平均模型权重来提高
DNN
的泛化能力。

从标准训练阶段开始,
SWA
开始对后续每个周期的权重进行平均,权重更新为:

\[\theta_{\mathrm{SWA}}=\frac{1}{T}\sum_{t=1}^{T}\theta_{t}

\quad\quad(8)
\]

其中
\(\theta_{t}\)
表示
\(t\)
周期时的模型权重,
\(T\)
是应用
SWA
的周期总数。

Implementation details

使用以随机梯度下降(
SGD
)作为基础优化器的
SAM
进行训练,动量为 0.9,初始学习率为 0.1,权重衰减为 5e-4,采用余弦退火学习率策略,数据批次大小为128。总共训练 200 个周期,
SWA
起始周期设置为 120,将
SWA
的学习率设置为 0.05,以增强训练的有效性和模型鲁棒性。设置公式 (3) 中的
\(\beta\)
= 10 以进行混合数据增强,所有超参数(包括
\(\lambda_{mix}\)

\(\lambda_{crl}\)

\(\tau\)
)均根据验证集表现上进行调整。

在对
ImageNet
预训练模型
DeiT-Base
进行微调时,设置学习率为 0.01,在 50 个周期内权重衰减为 5e-5,
SWA
开始周期为 1,学习率为 0.004。

Experiments


表 1 中展示了
CIFAR10

CIFAR100

Tiny-ImageNet
上的故障预测结果。

表 2 展示了在长尾数据集
CIFAR10-LT

CIFAR100-LT
与最先进方法比较。

表 3 和表 4 展示了在含噪声标签的
Animal-10N

Food-101N
上的 top-1 准确率。

在实际应用中,环境条件容易频繁变化,例如天气从晴朗到多云,再到下雨。对于模型来说,在这种分布或领域偏移下保持可靠的决策能力至关重要。图 3 展示了在偏移数据集
CIFAR10-C
上评估使用
CIFAR10
的干净训练集训练的模型的性能比较。

论文在表 5 中分析了每个组件对
SURE

CIFAR100
上的性能贡献。

图 4 中可视化了
CIFAR100-LT IF=10
上的置信度分布,
SURE
明显比
MSP

FMFP
带来更好的置信度分离。



如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】

work-life balance.

一、物理设备的命名规则

在 Linux 系统中一切都是文件,硬件设备也不例外。所有的硬件设备文件都在
/dev
文件夹中。

硬件 在Linux内的文件名
SCSI/SATA/USB /dev/sd[a-p]
VirtI/O界面 /dev/vd[a-p]
软盘 /dev/fd[0-1]
打印机 /dev/lp[0-2] (25針印表機) /dev/usb/lp[0-15] (USB 介面)
鼠标 /dev/input/mouse[0-15] (通用) /dev/psaux (PS/2界面) /dev/mouse (當前滑鼠)
CDROM/DVDROM /dev/scd[0-1] (通用) /dev/sr[0-1] (通用,CentOS 較常見) /dev/cdrom (當前 CDROM)
磁带机 /dev/ht0 (IDE 界面) /dev/st0 (SATA/SCSI界面) /dev/tape (當前磁帶)
IDE设备 /dev/hd[a-d] (老系统才有)

由于现在的 IDE 设备已经很少见了,所以一般的硬盘设备都是以“/dev/sd”开头。而一台主机上可以有多块硬盘,因此系统采用 a~z 来代表 26 块不同的硬盘(默认从 a 开始分配),而且硬盘的分区编号也很有讲究:

➢ 主分区或扩展分区的编号从 1 开始,到 4 结束;

➢ 逻辑分区从编号 5 开始。

有两点需要注意:

  1. 设备名称由内核识别顺序决定
    :/dev 目录中 sda 设备之所以是 a,并不是由插槽决定的,而是由系统内核的识别顺序来决定的,而恰巧很多主板的插槽顺序就是系统内核的识别顺序,因此才会被命名为/dev/sda。
  2. 分区名称中的数字不代表分区数量
    :比如sda3,它代表编号为3的分区,有可能不存在sda2,因为这个数字可以手动指定。

下图讲解了一个sata硬盘的名字所蕴含的信息

image-20240718094420030

二、MBR和GPT分区格式

MBR和GPT是两种磁盘分区方式,当我们使用磁盘分区助手格式化硬盘的时候,它会提示你让你选择一种分区格式

img

1、 MBR分区

MBR分区方式出现的比较早,在Win7及Win7以前的系统都使用MBR分区方式,所以在磁盘管理界面,就能看到有主分区、逻辑分区等字眼

img

那MBR是什么呢?

MBR,全称Master Boot Record, 主引导记录的意思,开机之后读取的第一个硬盘内容,帮助系统找到开机程序并正常开机。

硬盘由许多个扇区组成,MBR硬盘每个扇区的大小是512字节,最重要的第一个扇区格式如下所示

image-20240718110916877

可以看到在第一个扇区中,MBR占据446个字节,结束符占2个字节,剩余64个字节用于存放分区表,每个分区表条目占用16字节,分区表中一共四条记录,代表着四个主分区。这也说明了为什么早期Windows7系统为什么在分区的时候会提示“该磁盘已包含最大分区数”不允许添加,因为早期Windows使用的MBR硬盘,它的设计只允许有4个主分区。

当然不可能只让创建四个分区,这不合理,所以可以让第四个分区变成扩展分区,在扩展分区内创建多个逻辑分区。

做个总结,在MBR硬盘中:

  • 主分区最多只能有四个(硬盘的限制)
  • 扩展分区最多只能有一个(操作系统的限制)
  • 逻辑分区是扩展分区中持续切割出来的分割槽。
  • 只有主分区和逻辑分区能被格式化,扩展分区无法被格式化。
  • 逻辑分区的数量在不同的操作系统上上限不一样,Linux系统中SATA硬盘已经能够划分出63个以上的逻辑分区。
  • 逻辑分区的编号从5开始,就算只有一个主分区一个扩展分区,那逻辑分区的编号也从5开始。

另外,磁盘分区表只有64字节大小,每条记录只有16字节大小,所以它能录的数据是很有限的,这导致它无法正确获取2.2TB以上硬盘的实际容量。

早期的 Linux 系统为了兼容于Windows 的磁盘,因此使用的是支持 Windows 的 MBR的方式来处理开机引导程序和分区表。

现在Linux系统安装的时候根据磁盘大小,如果安装磁盘小于2TB,则默认使用MBR初始化硬盘;大于2TB,则会使用GPT初始化硬盘。

当然,也可以在安装系统的时候强制使用GPT进行磁盘分区。

查看磁盘类型的命令:
fdisk -l

image-20240718132917700

disk label type 如果是dos,就是mbr硬盘;如果是gpt,则为gpt硬盘。

2、 GPT分区

GPT分区(
GUID partition table
)模式使用GUID分区表,是源自EFI标准的一种较新的磁盘分区表结构的标准。与普遍使用的主引导记录(MBR)分区方案相比,GPT提供了更加灵活的磁盘分区机制。

GPT磁盘分区格式如下所示

圖2.2.7、GPT 分割表的結構示意圖

在MBR分区中,一个扇区是512字节,在GPT分区中,用LBA(Logical Block Address)来表示“一个扇区”,默认大小也是512字节。整个GPT硬盘就是由N多个LBA组成。

GPT分区比较复杂,更多信息不在此讨论,只需要知道

  1. 分区表有32条记录,每条记录可以记录四个分区,所以它最多能有4*32=128个分区,所以它必要像MBR一样区分主分区、逻辑分区,在GPT中所有分区都是主分区。
  2. 最高支持18EiB的单硬盘容量,1EiB = 1048576 TiB。

GPT分区很明显比MBR分区要功能更强大;但是GPT分区在linux中不能使用fdisk命令进行管理,只能使用parted工具管理。

3、MBR和GPT分区的区别

磁盘分区形式 支持最大磁盘容量 支持分区数量 Linux分区工具
主启动记录分区(MBR) 2 TiB ● 4个主分区
● 3个主分区和1个扩展分区
MBR分区包含主分区和扩展分区,其中扩展分区里面可以包含若干个逻辑分区。扩展分区不可以直接使用,需要划分成若干个逻辑分区才可以使用。以创建6个分区为例,以下两种分区情况供参考:
● 3个主分区,1个扩展分区,其中扩展分区中包含3个逻辑分区。
● 1个主分区,1个扩展分区,其中扩展分区中包含5个逻辑分区。
以下两种工具均可以使用:fdisk工具parted工具
全局分区表(GPT, Guid Partition Table) 18 EiB1 EiB = 1048576 TiB 不限制分区数量
GPT格式下没有主分区、扩展分区以及逻辑分区之分。
parted工具

三、普通分区挂载

当我们有了一块新硬盘,从插入电脑开始,一共需要做分区、格式化、挂载三个步骤,下面就依次详细说说这个流程中的细节。

以下流程是基于Vmware Workstation环境做的实验。

1、新增硬盘

原来我已经有两块硬盘了,现在新增加一块12G的硬盘,只需要修改下设置,新增一块硬盘即可

image-20240718165452809

然后开机启动,查看下dev文件夹,可以发现多出一个sdc文件,它就是第三块磁盘。

image-20240718170058807

2、分区命令:fdisk

fdisk命令(format disk)用于新建、修改及删除磁盘的分区表信息,语法格式为
fdsk 磁盘名称
,它和大多数普通linux命令不同的是,它是一个交互式的命令,键入命令
fdisk /dev/sdc
,进入交互界面

image-20240718171058774

进入交互界面之前,有两段英文提示

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x2394a4f6.

翻译成中文,包含以下几点

  1. 所有的改变都只是暂存在内存中,直到最后收到写入命令才依次执行内存中的操作。
  2. 当前设备不包含任何可识别的分区表,这意味着这是一块新设备,还没有分区过。
  3. 你要知道你正在做什么事情:进入此交互界面意味着你正在对当前磁盘进行分区操作,分区类型为dos,也就是MBR。

这段提示信息量还是有的,如果已经分区过的磁盘,则会提示如下信息

image-20240718171812021

可以看到少了一些提示信息。

接下来看看该命令的怎么使用,它有提示,就是m命令。

m

m命令是首次提示的命令,它用于展示所有可用的命令以及每个命令的作用,键入m命令

image-20240718172423556

翻译过来如下所示

  • a
    :切换引导标志(toggle a bootable flag)。允许您在分区上切换引导标志,以指示该分区是否可引导。
  • b
    :编辑BSD磁盘标签(edit bsd disklabel)。用于编辑BSD磁盘标签的命令。
  • c
    :切换DOS兼容性标志(toggle the dos compatibility flag)。允许您在分区上切换DOS兼容性标志,以指示该分区是否与DOS兼容。
  • d
    :删除一个分区(delete a partition)。用于删除选择的分区。
  • g
    :创建一个新的空GPT分区表(create a new empty GPT partition table)。用于创建一个新的空GUID分区表(GPT)。
  • G
    :创建一个IRIX(SGI)分区表(create an IRIX (SGI) partition table)。用于创建一个IRIX(SGI)分区表。
  • l
    :列出已知的分区类型(list known partition types)。显示已知的分区类型列表。
  • m
    :打印此菜单(print this menu)。打印
    fdisk
    命令的菜单,显示可用的操作选项。
  • n
    :添加一个新分区(add a new partition)。用于添加新的分区。
  • o
    :创建一个新的空DOS分区表(create a new empty DOS partition table)。用于创建一个新的空DOS分区表。
  • p
    :打印分区表(print the partition table)。显示磁盘上的分区表。
  • q
    :退出而不保存更改(quit without saving changes)。退出
    fdisk
    命令,不保存对分区表的更改。
  • s
    :创建一个新的空Sun磁盘标签(create a new empty Sun disklabel)。用于创建一个新的空Sun磁盘标签。
  • t
    :更改分区的系统ID(change a partition's system ID)。允许您更改选择的分区的系统ID。
  • u
    :更改显示/输入单位(change display/entry units)。用于更改
    fdisk
    命令中显示和输入的单位。
  • v
    :验证分区表(verify the partition table)。验证磁盘上的分区表以确保其有效性。
  • w
    :将表写入磁盘并退出(write table to disk and exit)。将对分区表的更改写入磁盘并退出
    fdisk
    命令。
  • x
    :额外功能(仅供专家使用)(extra functionality (experts only))。提供额外的高级功能,仅供有经验的用户使用。

p

p命令用于查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息。

image-20240718173330716

可以看到是空的,当前磁盘还没有分区过。

n

n命令用于创建分区,键入n命令

image-20240718173545428

它会提示创建的是主分区还是扩展分区(因为是MBR分区格式,所以才会有主分区或者扩展分区),默认是主分区,那就键入回车就行

image-20240718173805110

接下来提示分区编号,还是默认就行

image-20240718173927657

回车后提示输入开始的扇区位置,默认值2048,这个地方敲回车即可,因为系统会自动计算出最靠前的空闲扇区的位置。

image-20240718174055021

系统提示输入结束的扇区位置,这里输入
+2G
,表示要2G的分区大小,系统会自动计算出结束的扇区位置。

然后分区就创建成功了。输入p命令,可以看到多了一个分区,分区名为sdc1

image-20240718174248012

w

w命令用于将分区表写入磁盘,这样就完成了对磁盘的分区。

image-20240718174435337

有时候该命令执行完成之后,并不会将分区信息同步给内核,导致操作失败。可以使用
partprobe
命令手动同步分区信息到内核,多执行几次,如果还不行,就
重启
linux,重启之后肯定就好了。

3、格式化命令:mkfs

mkfs是linux的格式化操作的命令,mkfs双按tab键,可以看到它有多个衍生命令

image-20240718175015563

现在linux都是xfs文件系统格式了,所以这里按照
mkfs.xfs
命令执行格式化操作,执行格式为:
mkfs.xfs /dev/sdc1

image-20240718175158349

这样就完成了格式化操作,接下来进行系统挂载。

4、挂载命令:mount

mount命令是挂载命令,将分区挂载到某个目录,这样对目录中文件的CRUD操作就作用到了对应的分区上。

mount命令的格式是:
mount 分区名 文件夹
或者
mount UUID=分区UUID 文件夹

首先先建立个文件夹:
mkdir /dir3
,然后将
/dev/sdc1
挂载到
/dir3
,挂载命令为:
mount /dev/sdc1 /dir3

这样就完成了挂载。

UUID挂载方式需要知道分区的UUID,获取方式是使用
blkid
命令

5、获取分区UUID:blkid

blkid的英文全称是:block id,该命令用于获取每个分区的UUID信息;有时候该命令会受到缓存的影响设设备列表可能不会更新,使用
blkid -g
命令可以清除缓存。

image-20240719102357044

然后使用命令
mount UUID="74cbf319-cb9f-417e-9027-5328689477c1" /dir3
完成挂载。

需要注意的是mount命令只能一次挂载,重启系统之后挂载就会失效,需要将挂载写入
/etc/fstab
文件,这样才能完成分区的永久性挂载。

5、永久挂载:/etc/fstab文件

/etc/fstab文件存放着需要永久挂载的数据,系统启动之后会自动读取该文件,并完成文件中的所有挂载。写入格式如下

设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检

image-20240719103001648

为了将/dev/sdc1永远挂载到/dir3目录,需要将以下信息追加到/etc/fstab文件

/dev/sdc1               /dir3                   xfs     defaults        0 0

写入该文件并不会自动生效,需要使用命令
mount -a
或者重启系统生效。

已经实现了/dev/sdc1挂载到/dir3目录,接下来使用
df
命令查看挂载状态和硬盘使用量信息。

6、磁盘使用情况统计:df

df命令(disk free)用于显示目前在Linux系统上的文件系统磁盘使用情况,其使用格式为
df [选项]... [FILE]...

  • -a, --all
    :显示所有文件系统,包括虚拟文件系统。
  • -B, --block-size=SIZE
    :指定块大小,以特定单位显示磁盘空间信息(如 MB、GB)。
  • -h, --human-readable
    :以人类可读的格式显示输出结果。
  • -H, --si
    :以 1000 作为基数,以 SI 单位显示输出结果(例如,MB、GB)。
  • -i, --inodes
    :显示 inode 使用情况而不是块使用情况。
  • -k, --kilobytes
    :以 KB 作为单位显示磁盘空间信息。
  • -l, --local
    :仅显示本地文件系统。
  • -m, --portability
    :使用 POSIX 输出格式。
  • -n, --no-sync
    :不执行文件系统同步操作。
  • -P, --portability
    :使用 POSIX 输出格式。
  • -t, --type=TYPE
    :仅显示指定类型的文件系统。
  • -T, --print-type
    :显示文件系统的类型。
  • -x, --exclude-type=TYPE
    :排除指定类型的文件系统。
  • --sync
    :在显示文件系统信息之前执行文件系统同步操作。
  • --total
    :在输出的最后一行显示总计。
  • -v, --verbose
    :详细显示文件系统信息。
  • -l, --local
    :仅显示本地文件系统。
  • --help
    :显示帮助信息并退出。
  • --version
    :显示版本信息并退出。

最常用的命令就是
df -h
了,接下来使用该命令查看磁盘使用量情况

image-20240718180121196

可以看到sdc1已经挂载到了/dir3目录还剩余2G存储可用。这样看起来似乎不是非常直观,总觉得有点乱,使用
lsblk
命令则能够更直观的看到每个磁盘以及它们的分区情况和分区大小。

7、树状展示硬盘分区:lsblk

lsblk命令的英文全称是:list block,实际上它就是以树状结构展示磁盘分区情况,这样会更直观

image-20240719104500694

8、查看文件占用大小:du

du(disk usage)命令用于查看分区或者目录所占用的磁盘大小,常用的命令:
du -sh 目录名
,比如
du -sh /*
,这样就能查询到根目录的所有文件和文件夹占用磁盘的大小

s: 仅显示指定目录或文件的总大小,而不显示其子目录的大小。

h:--human-readable 以K,M,G为单位,提高信息的可读性。

image-20240719105304570

s参数比较重要,没有它的话,默认du命令会递归查询所有文件夹及子文件夹、子文件,疯狂打印到屏幕上,显得非常乱,所以如果没有特殊需要,一般是要加-s参数的。

四、交换分区挂载

1、新建分区

交换(SWAP)分区是一种通过在硬盘中预先划分一定的空间,然后把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。通俗来讲就是让硬盘帮内存分担压力。但由于交换分区毕竟是通过硬盘设备读写数据的,速度肯定要比物理内存慢,所以只有当真实的物理内存耗尽后才会调用交换分区的资源。

在生产环境中,交换分区的大小一般为真实物理内存的 1.5~2 倍。

接下来切出一个大小为5G的分区用于扩容交换分区。

image-20240719110602548

这样就得到了一个5G的新分区sdc2。接下来修改该分区类型,将其改为
swap
类型

image-20240719111112629

最后,敲击w完成分区表编辑。

接下来键入lsblk命令,可以看到sdc2分区已经存在了

image-20240719111636065

2、格式化交换分区:mkswap

交换分区使用前也要格式化,只是它的格式化命令不是mkfs,而是mkswap,英文全称是"make swap",语法格式是"mkswap 设备名称"

image-20240719112104178

这样就完成了交换分区格式化。

3、激活交换分区:swapon

swapon命令用于激活新的交换分区设别,英文全称为“swap on”,语法格式为:
swapon 设备名称

接下来执行命令:swapon /dev/sdc2

为了验证是否扩容成功,可以使用命令
free -m
查看内存和交换分区的大小

4、查看内存和交换空间大小:free

free 命令显示系统使用和空闲的内存情况,包括物理内存、交互区内存(swap)和内核缓冲区内存。共享内存将被忽略。

命令参数:

-b 以Byte为单位显示内存使用情况。

-k 以KB为单位显示内存使用情况。

-m 以MB为单位显示内存使用情况。

-g 以GB为单位显示内存使用情况。

-o 不显示缓冲区调节列。

-s<间隔秒数> 持续观察内存使用状况。

-t 显示内存总和列。

-V 显示版本信息。

image-20240719113003479

可以看到扩容之后交换空间扩大了5G。

5、修改fstab永久挂载

之前的一次分区普通挂载的配置是这样的

/dev/sdc1               /dir3                   xfs     defaults        0 0

swap分区的挂载则是这样的

/dev/sdc2               swap                    swap    defaults        0 0

也就是挂载目标变成了swap,而非一个目录;文件系统类型也是swap,而非普通分区的xfs格式。

之后运行命令
mount -a
或者重启系统即可生效。

五、卸载分区

1、卸载普通分区

其实就是逆向操作,首先,删除fstab中的记录

image-20240719132353693

然后
umount
命令卸除挂载

umount /dev/sdc1

然后删除分区

image-20240719133412618

之后,再用
lsblk
命令查看下分区,发现sdc1已经没了,sdc硬盘下只剩下了sdc2分区。

image-20240719134050851

2、卸载交换分区

还是老规矩,先从fstab文件中删除交换分区的挂载信息

image-20240719134338727

然后运行命令
swapoff
关闭指定的交换分区

swapoff /dev/sdc2

最后,删除分区,删除分区的方法和卸载普通分区一样。

删除完毕之后,再看sdc磁盘分区,就发现该磁盘已经没有分区了

image-20240719134933435

这时候就可以安全移除磁盘了。

如果没有争取的卸载磁盘,有可能会导致开机失败的情况,这点需要注意。

最后,欢迎关注我的博客:
https://blog.kdyzm.cn

一、实验目的:

  1. 掌握Linux环境中软件的安装。
  2. 搭建Samba服务器,基本了解搭建服务器的基本步骤。
  3. 理解Samba服务器作用与工作原理。

二、实验环境:

操作系统:Centos7 Windows 10
硬件设备:虚拟机

三、实验步骤及结果:

某院系构建一台资源共享服务器,为本院系网络班和云计算班的的计算机提供文件共享服务,客户端计算机采用用户隔离的方式访问服务器上的资源,实现Windows和Linux资源共享。要求网络班的资料存放在samba服务器(smb.dingli.com)的/mnt/network目录中,云计算班的资料存放在samba服务器的/mnt/cloud目录中。

1. 安装Samba服务器

配置本地源

[root@servera ~]# lsblk 
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   20G  0 disk 
├─sda1   8:1    0  300M  0 part /boot
├─sda2   8:2    0    2G  0 part [SWAP]
└─sda3   8:3    0 17.7G  0 part /
sr0     11:0    1  9.5G  0 rom  /run/media/root/CentOS 7 x86_64
sr1     11:1    1 1024M  0 rom  
[root@servera ~]# mkdir /mnt/cdrom
[root@servera ~]# mount /dev/cdrom /mnt/cdrom/
mount: /dev/sr0 is write-protected, mounting read-only
[root@servera ~]# rm -rf /etc/yum.repos.d/*
[root@servera ~]# vim /etc/yum.repos.d/local.repo
[root@servera ~]# yum makecache 
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
local                                                    | 3.6 kB     00:00     
(1/4): local/group_gz                                      | 153 kB   00:00     
(2/4): local/primary_db                                    | 6.1 MB   00:00     
(3/4): local/filelists_db                                  | 7.2 MB   00:00     
(4/4): local/other_db                                      | 2.6 MB   00:00     
Metadata Cache Created

image.png

安装samba服务

image.png

2. 创建共享目录

mkdir -p /mnt/network
mkdir -p /mnt/cloud

image.png

3. 配置Samba

编辑Samba的主配置文件,通常是/etc/samba/smb.conf。在文件末尾添加以下内容,以定义两个共享目录及其权限:

vim /etc/samba/smb.conf

[network]
comment = Network Class Share
path = /mnt/network
browseable = yes
writable = yes
create mask = 0664
directory mask = 0775
force group = network_class
valid users = @network_class
force user = nobody
[cloud]
comment = Cloud Computing Class Share
path = /mnt/cloud
browseable = yes
writable = yes
create mask = 0664
directory mask = 0775
force group = cloud_class
valid users = @cloud_class
force user = nobody

image.png

4. 创建用户组和用户

为每个班级创建一个用户组,并为每个用户分配到相应的组中。假设网络班的用户组为network_class,云计算班的用户组为cloud_class。

groupadd network_class
groupadd cloud_class
useradd -m user1 -g network_class
useradd -m user2 -g cloud_class
passwd user1
passwd user2

image.png

5. 设置目录权限

chown -R root:network_class /mnt/network
chmod -R 2775 /mnt/network

chown -R root:cloud_class /mnt/cloud
chmod -R 2775 /mnt/cloud

image.png

6. 加入Samba用户

smbpasswd -a user1
smbpasswd -a user2

image.png

7.启动服务与防火墙

systemctl restart smb.service 
setenforce 0
systemctl stop firewalld.service 
systemctl status smb.service 

image.png

8. 测试与客户端配置

现在,网络班的用户(如user1)应该只能访问network共享,而云计算班的用户(如user2)只能访问cloud共享。在Windows客户端上,用户可以通过文件浏览器输入smb://smb.dingli.com/network或smb://smb.dingli.com/cloud来访问相应的共享资源,同时输入各自的用户名和密码进行身份验证。
服务器IP
image.png

Cloud测试

image.png
image.png
image.png

image.png
image.png

Network测试

image.png
image.png
image.png