Linux中国
1.73K subscribers
777 photos
6.34K links
Linux 中国官方 Telegram 频道
Download Telegram
如何在 Linux 或者 UNIX 下调试 Bash Shell 脚本

我写了一个 hello world 小脚本。我如何能调试运行在 Linux 或者类 UNIX 的系统上的 bash shell 脚本呢?Media

via https://linux.cn/article-9302-1.html
当 CPU 空闲时它都在做什么?

Media上篇文章中 我说了操作系统行为的基本原理是,在任何一个给定的时刻,在一个 CPU 上有且只有一个任务是活动的。但是,如果 CPU 无事可做的时候,又会是什么样的呢?事实证明,这种情况是非常普遍的,对于绝大多数的个人电脑来说,这确实是一种常态:大量的睡眠进程,它们都在等待某种情况下被唤醒,差不多在 100% 的 CPU 时间中,都处于虚构的“空闲任务”中。事实上,如果一个普通用户的 CPU 处于持续的繁忙中,它可能意味着有一个错误、bug、或者运行了恶意软件。因为我们不能违反我们的原理,一些任务需要在一个 CPU 上激活。首先是因为,这是一个良好的设计:持续很长时间去遍历内核,检查是否有一个活动任务,这种特殊情况是不明智的做法。最好的设计是没有任何例外的情况。无论何时,你写一个 if 语句,Nyan Cat 就会喵喵喵。其次,我们需要使用空闲的 CPU 去做一些事情,让它们充满活力,你懂得,就是创建天网计划呗。因此,保持这种设计的连续性,并领先于那些邪恶计划一步,操作系统开发者创建了一个空闲任务,当没有其它任务可做时就调度它去运行。我们可以在 Linux 的 引导过程 中看到,这个空闲任务就是进程 0,它是由计算机打开电源时运行的第一个指令直接派生出来的。它在 rest_init 中初始化,在 initidlebootup_task 中初始化空闲调度类scheduling class。简而言之,Linux 支持像实时进程、普通用户进程等等的不同调度类。当选择一个进程变成活动任务时,这些类按优先级进行查询。通过这种方式,核反应堆的控制代码总是优先于 web 浏览器运行。尽管在通常情况下,这些类返回 NULL,意味着它们没有合适的任务需要去运行 —— 它们总是处于睡眠状态。但是空闲调度类,它是持续运行的,从不会失败:它总是返回空闲任务。好吧,我们来看一下这个空闲任务到底做了些什么。下面是 cpuidleloop,感谢开源能让我们看到它的代码:
while (1) { while(!need_resched()) { cpuidle_idle_call(); } /* [Note: Switch to a different task. We will return to this loop when the idle task is again selected to run.] */ schedule_preempt_disabled();}
cpuidleloop我省略了很多的细节,稍后我们将去了解任务切换,但是,如果你阅读了这些源代码,你就会找到它的要点:由于这里不需要重新调度(即改变活动任务),它一直处于空闲状态。以所经历的时间来计算,这个循环和其它操作系统中它的“堂兄弟们”相比,在计算的历史上它是运行的最多的代码片段。对于 Intel 处理器来说,处于空闲状态意味着运行着一个 halt 指令:
static inline void native_halt(void) { asm volatile("hlt": : :"memory"); }
native_halthlt 指令停止处理器中的代码执行,并将它置于 halt 的状态。奇怪的是,全世界各地数以百万计的 Intel 类的 CPU 们花费大量的时间让它们处于 halt 的状态,甚至它们在通电的时候也是如此。这并不是高效、节能的做法,这促使芯片制造商们去开发处理器的深度睡眠状态,以带来着更少的功耗和更长休眠时间。内核的 cpuidle 子系统 是这些节能模式能够产生好处的原因。现在,一旦我们告诉 CPU 去 halt(睡眠)之后,我们需要以某种方式让它醒来。如果你读过 上篇文章《你的操作系统什么时候运行?》 ,你可能会猜到中断会参与其中,而事实确实如此。中断促使 CPU 离开 halt 状态返回到激活状态。因此,将这些拼到一起,下图是当你阅读一个完全呈现的 web 网页时,你的系统主要做的事情:Media除定时器中断外的其它中断也会使处理器再次发生变化。如果你再次点击一个 web 页面就会产生这种变化,例如:你的鼠标发出一个中断,它的驱动会处理它,并且因为它产生了一个新的输入,突然进程就可运行了。在那个时刻, need_resched() 返回 true,然后空闲任务因你的浏览器而被踢出而终止运行。如果我们呆呆地看着这篇文章,而不做任何事情。那么随着时间的推移,这个空闲循环就像下图一样:Media在这个示例中,由内核计划的定时器中断会每 4 毫秒发生一次。这就是滴答tick周期。也就是说每秒钟将有 250 个滴答,因此,这个滴答速率(频率)是 250 Hz。这是运行在 Intel 处理器上的 Linux 的典型值,而其它操作系统喜欢使用 100 Hz。这是由你构建内核时在 CONFIG_HZ 选项中定义的。对于一个空闲 CPU 来说,它看起来似乎是个无意义的工作。如果外部世界没有新的输入,在你的笔记本电脑的电池耗尽之前,CPU 将始终处于这种每秒钟被唤醒 250 次的地狱般折磨的小憩中。如果它运行在一个虚拟机中,那我们正在消耗着宿主机 CPU 的性能和宝贵的时钟周期。在这里的解决方案是 动态滴答,当 CPU 处于空闲状态时,定时器中断被 暂停或重计划,直到内核知道将有事情要做时(例如,一个进程的定时器可能要在 5 秒内过期,因此,我们不能再继续睡眠了),定时器中断才会重新发出。这也被称为无滴答模式。最后,假设在一个系统中你有一个活动进程,例如,一个长时间运行的 CPU 密集型任务。那样几乎就和一个空闲系统是相同的:这些示意图仍然是相同的,只是将空闲任务替换为这个进程,并且相应的描述也是准确的。在那种情况下,每 4 毫秒去中断一次任务仍然是无意义的:它只是操作系统的性能抖动,甚至会使你的工作变得更慢而已。Linux 也可以在这种单一进程的场景中停止这种固定速率的滴答,这被称为 自适应滴答 模式。最终,这种固定速率的滴答可能会 完全消失。对于阅读一篇文章来说,CPU 基本是无事可做的。内核的这种空闲行为是操作系统难题的一个重要部分,并且它与我们看到的其它情况非常相似,因此,这将帮助我们理解一个运行中的内核。via: https://manybutfinite.com/post/what-does-an-idle-cpu-do/作者:Gustavo Duarte 译者:qhwdw 校对:wxy本文由 LCTT 原创编译,Linux中国 荣誉推出Media

via https://linux.cn/article-9303-1.html?utm_source=rss&utm_medium=rss
互联网化疗 —— BrickerBot 僵尸网络创建者的行动

本文作者 janit0r 被认为是 BrickerBot 病毒的作者。此病毒会攻击物联网上安全性不足的设备并使其断开和其他网络设备的连接。janit0r 宣称他使用这个病毒的目的是保护互联网的安全,避免这些设备被入侵者用于入侵网络上的其他设备。janit0r 称此项目为“互联网化疗”。janit0r 决定在 2017 年 12 月终止这个项目,并在网络上发表了这篇文章。Media

via https://linux.cn/article-9304-1.html
怎样完整地离线更新并升级基于 Debian 的操作系统

如果你想要离线更新你家里的操作系统怎么办?购买一个更加高速的网络链接?不,根本不需要!你仍然可以通过互联网离线更新升级你的操作系统。这正是 Apt-Offline工具可以帮助你做到的。Media

via https://linux.cn/article-9305-1.html
为初学者准备的 MariaDB 管理命令

现在我们再来看看一些有用的 MariaDB 管理命令。这些都是使用 MariaDB 最基础的命令,而且它们对 MySQL 也同样适合,因为 Mariadb 就是 MySQL 的一个分支而已。Media

via https://linux.cn/article-9306-1.html
如何统计 Linux 中文件和文件夹/目录的数量

今天我们再次带来一系列可以多方面帮助到你的复杂的命令。 通过操作命令,可以帮助您计数当前目录中的文件和目录、递归计数,统计特定用户创建的文件列表等。Media

via https://linux.cn/article-9307-1.html
为什么 Kubernetes 很酷

在我刚开始学习 Kubernetes(大约是一年半以前吧?)时,我真的不明白为什么应该去关注它。 在我使用 Kubernetes 全职工作了三个多月后,我才逐渐明白了为什么我应该使用它。Media

via https://linux.cn/article-9308-1.html
创建局域网内的离线 YUM 仓库

为了节省数据量,我们可以创建个离线 yum 源并将之分享到本地网络中。网络中的其他 Linux 机器就可以直接从本地 yum 上获取系统更新,从而节省数据量,而且传输速度也会很好。Media

via https://linux.cn/article-9309-1.html
用 Apache 服务器模块保护您的网站免受应用层 DOS 攻击

通过配置普通的网页服务器,可以保护网页免受应用层攻击,至少是适度的防护。防止这种形式的攻击是非常重要的,因为 Cloudflare 最近 报告称 网络层攻击的数量正在减少,而应用层攻击的数量则在增加。Media

via https://linux.cn/article-9310-1.html
循序渐进学习如何在 MariaDB 中配置主从复制

复制是用于为我们的数据库创建多个副本,这些副本可以在其它数据库上用于运行查询,像一些非常繁重的查询可能会影响主数据库服务器的性能,或者我们可以使用它来做数据冗余,或者兼具以上两个目的。我们可以将这个过程自动化,即主服务器到从服务器的复制过程自动进行。执行备份而不影响在主服务器上的写操作。Media

via https://linux.cn/article-9311-1.html
Linux 与 Unix 之差异

在计算机时代,相当一部分的人错误地认为 Unix 和 Linux 操作系统是一样的。然而,事实恰好相反。让我们仔细看看。Media

via https://linux.cn/article-9312-1.html
我在 Twitch 平台直播编程的经验

最近几个开发者问我怎么开始自己的直播,因此我在这里想大家展示我给他们的建议!Media

via https://linux.cn/article-9313-1.html
为什么应该在 Linux 上使用命名管道

命名管道并不常用,但是它们为进程间通讯提供了一些有趣的特性。Media

via https://linux.cn/article-9314-1.html
如何在 Linux 系统查询机器最近重启时间

要查看 Linux 或类 UNIX 系统重启和关机的时间和日期,可以使用下面的命令:last 命令、who 命令、uptime 命令。Media

via https://linux.cn/article-9315-1.html
容器、GPL 与左版:无需过度担忧

提要:想要知道开源许可证对 Linux 容器有什么影响吗?以下问题您需要了解。Media尽管目前开源软件已经成为主流,但是不断涌现的软件新技术以及重新流行的旧技术有时也会引发对开源许可证的强烈担忧。大多数情况下,大家关注的焦点是 GPL 许可证,特别是经常(有时是误导性的)被描述为 GPL 衍生作品问题的左版(copyleft)范围问题。将该问题结构化的一个不完美方式是:遵循 GPL 许可证的代码在某种意义上与专有代码相结合,形成一个单独的修改后作品,是否可以解释为该专有代码受到 GPL 许可证的约束?虽然我们还没有看到很多针对 Linux 容器的问题,但随着容器的采用持续增长,我们预计会有更多的问题提出来。不过,有相当简单的方式可以表明,容器不会引发新的或有关 GPL 范围的问题。法规和判例在解释类似 GPL 这样的许可证方面几乎没有什么帮助。另一方面,即使是在自由软件基金会(FSF)不是相关软件版权持有者的典型情况下,我们中的许多人也重视 FSF 作为 GPL 起草者和管理者的解释性观点。除了作为许可证文本的作者之外,FSF 多年来一直致力于向社区提供有关许可证的评论和指导。基于自由软件政策的公共利益使命和领导力,FSF 的观点具有特殊的可信度和影响力。FSF 关于 GPL 解释的现有指导,有助于理解在容器中将 GPL 代码和非 GPL 代码包含在内所产生的效果。FSF 在界定左版范围时重点考虑了进程的边界,以及多个软件组件之间的通信机制和语义,以确定它们的紧密集成程度是否足以被视为 GPL 意义下的单个程序。例如,GNU 许可证常见问题解答认为,在没有足够“密切”(intimate)通信的情况下,管道、套接字和命令行参数通常可以被隐含认为是具备独立性的机制。考虑容器中有 GPL 代码和专有代码可能共存并执行的情况,实际上,容器是一个孤立的用户空间栈。在 OCI 容器映像格式中,代码被打包为一组文件系统的变更层,基本层通常是一个没有内核的精简传统 Linux 发行版。与非容器化的 Linux 发行版的用户空间一样,这些基本层包括许多遵循 GPL 许可证(GPL v2 以及 GPL v3)的软件包,以及许多遵循被认为与 GPL 不兼容许可证的软件包,并且通常作为专有以及开源应用的运行环境。GPL v2 中“单纯聚合(mere aggregation)”条款(以及 GPL v3 中有关“聚合”的条款)表明,这种组合通常是可以被接受的,在 GPL 中进行了特别考虑,如果不兼容的被许可组件是分离和独立的,就不会影响两个程序的许可。当然,在特定情况下,两个组件之间的关系可能不是“单纯聚合”,但是在 Linux 系统上的非容器化用户空间中运行的软件也是如此。容器或容器映像的技术构成中没有任何暗示表明需要应用特殊形式的左版范围分析。因此,当考察运行在容器中的代码和运行在容器外面的代码之间的关系时,几乎肯定会满足“分离和独立”的标准。代码将作为单独的进程运行,使用容器的整个技术要点是与运行在系统上的其他软件隔离。现在考虑两个组件的情况,其中一个遵循 GPL 许可证,另一个为专有软件,它们运行在分离但可能交互的容器中,也许作为使用微服务体系结构设计的应用程序的一部分。在没有特别不寻常事实的情况下,我们不应该期望看到左版的范围跨越多个容器。分离的容器涉及分离的进程。通过网络接口在容器之间进行通信类似于管道、套接字等机制,多容器微服务场景似乎排除了 FSF 所定义的“密切”通信。使用多个容器的应用程序的组成可能不是 GPL 范围问题的决定因素,但它使组件之间的技术边界更加明显,并为争论“分离性”提供了强有力的基础。这其中也没有容器的技术特征暗示对左版的范围分析应用不同或更严格的方法。过度关心分发 GPL 代码潜在影响的企业可能会试图禁止其开发人员将任何此类代码添加到计划分发的容器映像中,目的就是为了避免依据 GPL 许可证分发代码,但这是一个容易受到质疑的策略。如上所述,常规容器映像的基础层将包含多个遵循 GPL 的组件。如果该公司将容器映像推送到注册表中,通常无法保证这其中不包含基础层,即使它被广泛共享。另一方面,通过隔离 GPL 代码和专有代码,企业可能会决定采用容器化作为减少左版范围影响的一种手段,虽然人们希望基于技术上的益处,而不是莫须有的对 GPL 焦虑所带来的法律担忧来推动该决策。而在非容器化环境中,两个相互作用的软件组件之间的关系往往是单纯聚合,容器化所提供的“分离性”证据可能让那些担心 GPL 范围的人们感到安慰。共享容器映像时,可能会出现开源许可证合规义务问题。但是,对于容器来说,没有什么技术上的不同或独一无二的东西可以改变这些义务的性质,或者使它们更难满足。关于左版的范围,容器化应该能够缓解过度的担忧。作者简介:Richard Fontana 是红帽公司法律部门产品和技术团队的高级商业顾问。 他的大部分工作都集中在开源相关的法律问题上。译者简介:薛亮,集慧智佳知识产权咨询公司高级咨询师,擅长专利检索、专利分析、竞争对手跟踪、FTO分析、开源软件知识产权风险分析,致力于为互联网企业、高科技公司提供知识产权咨询服务。MediaMedia

via https://linux.cn/article-9316-1.html?utm_source=rss&utm_medium=rss
在 Linux 上检测 IDE/SATA SSD 硬盘的传输速度

你知道你的硬盘在 Linux 下传输有多快吗?不打开电脑的机箱或者机柜,你知道它运行在 SATA I (150 MB/s) 、 SATA II (300 MB/s) 还是 SATA III (6.0Gb/s) 呢?Media

via https://linux.cn/article-9317-1.html
手把手指导您使用 Git

如果您从未使用过 Git,甚至可能从未听说过它。莫慌张,只需要一步步地跟着这篇入门教程,很快您就会在 GitHub 上拥有一个全新的 Git 仓库。Media

via https://linux.cn/article-9319-1.html
Linux 终端下的多媒体应用

Linux 终端是支持多媒体的,所以你可以在终端里听音乐,看电影,看图片,甚至是阅读 PDF。Media

via https://linux.cn/article-9320-1.html
使用 Vi/Vim 编辑器:基础篇

VI 编辑器是一个基于命令行的、功能强大的文本编辑器,最早为 Unix 系统开发,后来也被移植到许多的 Unix 和 Linux 发行版上。Media

via https://linux.cn/article-9323-1.html
定制嵌入式 Linux 发行版

如何构建一个针对特定用途的交叉编译应用程序的自定义发行版呢? 正如 Michael J. Hammel 在这里解释的那样,它并不像你想象的那么难。Media

via https://linux.cn/article-9324-1.html
优化 MySQL: 3 个简单的小调整

我并不期望成为一个专家级的 DBA,但是,在我优化 MySQL 时,我推崇 80/20 原则,明确说就是通过简单的调整一些配置,你可以压榨出高达 80% 的性能提升。尤其是在服务器资源越来越便宜的当下。Media

via https://linux.cn/article-9325-1.html