2016年5月

网络安全公司 Sucuri 的安全专家说,他们在调查中发现有 68% 的被黑网站存在着隐藏的 后门 backdoor 脚本。这些后门脚本会给入侵者提供再次进入秘密通道,即便系统管理员改变了口令或应用了安全补丁,只要没有完全的清理整个系统,后门就会依旧存在。

从他们发布的网站被黑报告 2016 Q1 版中可以看到,全部取样的 11485 个网站中,有 4900 个网站发现了后门。

在这些被入侵的网站中,后门是最严重的问题,其次是恶意软件(通过浏览器端的代码进行 挂马攻击 drive-by download ),占比 60%。

第三名是 SEO 垃圾 SEO spam ,大约 32% 的网站存在该问题。SEO 垃圾通常会秘密嵌入到页面中,浏览者看不见,而对于搜索引擎的爬虫可见。

挂马攻击和 SEO 垃圾也很流行

SEO 垃圾可以帮助恶意攻击者提升其网站的搜索引擎排名,而对被感染的网站来说,则会受到搜索引擎的惩罚和排名下降。

这些受益的恶意攻击者通常会将 SEO 垃圾放到感染网站的源代码中、数据库中,或者通过 .htaccess 重定向实现。多数情况下,SEO 垃圾被用在药品方面,也有给成人内容或在线游戏提供的。

与去年相比,后门脚本比例略有降低,SEO 垃圾有小幅提升,而恶意软件感染则相较前些年增幅最大,从 2014 年的 41% 增加到了 2016 年的 60%!作为对比,后门脚本则从2014年的 59% 到 2015 年的 73%,现在回落到 68%;SEO 垃圾从 20% 到 28%,到了2016 年就增加到了 28%。

 title=

1. 我的世界: Pi

源于 Raspberry Pi 基金会. CC BY-SA 4.0

“我的世界”是世界上几乎每一个青少年都特别喜欢的一款游戏,而且它成功抓住了年轻人眼球,成为目前最能激发年轻人创造力的游戏之一。这个树莓派版本自带的我的世界不仅仅是一个具有创造性的建筑游戏,还是一个具有编程接口,可以通过 Python 与之交互的版本。

我的世界:Pi 版对于老师来说是一个教授学生解决问题和编写代码完成任务的好方式。你可以使用 Python API 创建一个房子,并且一直跟随这你的脚步移动,在所到之处建造一座桥,让天空落下熔岩雨滴,在空中显示温度,以及其它你可以想象到的一切东西。

详情请见 "我的世界: Pi 入门"

2. 反应游戏和交通灯

源于 Low Voltage Labs. CC BY-SA 4.0

使用树莓派可以很轻松地进行物理计算,只需要连接几个 LED 和按钮到开发板上的 GPIO 接口,再用几行代码你就可以按下按钮来开灯。一旦你了解了如何使用代码来完成这些基本的操作,接下来就可以根据你的想象来做其它事情了。

如果你知道如何让一个灯闪烁,你就可以控制三个灯闪烁。挑选三个和交通灯一样颜色的 LED 灯,然后编写控制交通灯的代码。如果你知道如何使用按钮触发事件,那么你就可以模拟一个行人过马路。同时你可以参考其它已经完成的交通灯附件,比如PI-TRAFFIC, PI-STOP, Traffic HAT,等等。

代码并不是全部——这只是一个演练,让你理解现实世界里系统是如何完成设计的。计算思维是一个让你终身受用的技能。

源于 Raspberry Pi 基金会. CC BY-SA 4.0

接下来试着接通两个按钮和 LED 灯的电源,实现一个双玩家的反应游戏 —— 让 LED 灯随机时间点亮,然后看是谁抢先按下按钮。

要想了解更多可以看看 GPIO Zero recipes。你所需要的资料都可以在 CamJam EduKit 1 找到。

3. Sense HAT 电子宠物

Astro Pi —— 一个增强版的树莓派 —— 将在 12 月问世,但是你并没有错过亲手把玩这个硬件的机会。Sense HAT 是使用在 Astro Pi 的一个传感器扩展板,现在已经开放购买了。你可以使用它来进行数据搜集、科学实验,游戏等等。可以看看下面树莓派的 Carrie Anne 拍摄的 Gurl Geek Diaries 的视频,里面演示了一种很棒的入门途径——在 Sense HAT 屏幕上自己设计一个生动的像素宠物:视频(墙外)。

详见 "探索 Sense HAT."

4. 红外鸟笼

源于 Raspberry Pi 基金会. CC BY-SA 4.0

让整个班级都可以参与进来的好主意是在鸟笼里放置一个树莓派和夜视镜头,以及一些红外线灯,这样子你就可以在黑暗中看见鸟笼里的情况了,然后使用树莓派通过网络串流视频。然后就可以等待小鸟归笼了,你可以在不打扰的情况下近距离观察小窝里的它们了。

要了解更多有关红外线和光谱的知识,以及如何校准摄像头焦点和使用软件控制摄像头,可以访问 打造一个红外鸟笼

5. 机器人

源于 Raspberry Pi 基金会. CC BY-SA 4.0

只需要一个树莓派、很少的几个电机和电机控制器,你就可以自己动手制作一个机器人。可以制作的机器人有很多种,从简单的由几个轮子和自制底盘拼凑的简单小车,到由游戏控制器驱动、具有自我意识、配备了传感器,安装了摄像头的金属小马。

要学习如何控制不同的电机,可以使用 RTK 电机驱动开发板入门或者使用配置了电机、轮子和传感器的 CamJam 机器人开发套件——具有很大的价值和大量的学习潜力。

或者,如果你还想了解更多核心内容,可以试试 PiBorg 的 4Borg(£99/$150)和 [DiddyBorg](https://www.piborg.org/diddyborg)(£180/$273),或者购买 Metal 版 DoodleBorg (£250/$380),然后构建一个最小版本的 DoodleBorg tank(非卖品)。

详情可见 机器人装备表


via: https://opensource.com/education/15/12/5-great-raspberry-pi-projects-classroom

作者:Ben Nuttall 译者:ezio 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出

几个月前, Linux 基金会宣布 LFCS (Linux 基金会认证系统管理员) 认证诞生了,这个令人兴奋的新计划定位于让来自全球各地的初级到中级的 Linux 系统管理员得到认证。这其中包括维护已经在运行的系统和服务的能力、第一手的问题查找和分析能力、以及决定何时向开发团队提交问题的能力。

Linux Foundation Certified Sysadmin – Part 7

第七讲: Linux 基金会认证系统管理员

下面的视频简要介绍了 Linux 基金会认证计划。

本讲是系列教程中的第七讲,在这篇文章中,我们会介绍如何管理 Linux 系统自启动进程和服务,这是 LFCS 认证考试要求的一部分。

管理 Linux 自启动进程

Linux 系统的启动程序包括多个阶段,每个阶段由一个不同的图示块表示。下面的图示简要总结了启动过程以及所有包括的主要组件。

Linux Boot Process

Linux 启动过程

当你按下你机器上的电源键时,存储在主板 EEPROM 芯片中的固件初始化 POST(通电自检) 检查系统硬件资源的状态。POST 结束后,固件会搜索并加载位于第一块可用磁盘上的 MBR 或 EFI 分区的第一阶段引导程序,并把控制权交给引导程序。

MBR 方式

MBR 是位于 BIOS 设置中标记为可启动磁盘上的第一个扇区,大小是 512 个字节。

  • 前面 446 个字节:包括可执行代码和错误信息文本的引导程序
  • 接下来的 64 个字节:四个分区(主分区或扩展分区)中每个分区一条记录的分区表。其中,每条记录标示了每个一个分区的状态(是否活跃)、大小以及开始和结束扇区。
  • 最后 2 个字节: MBR 有效性检查的魔法数。

下面的命令对 MBR 进行备份(在本例中,/dev/sda 是第一块硬盘)。结果文件 mbr.bkp 在分区表被破坏、例如系统不可引导时能排上用场。

当然,为了后面需要的时候能使用它,我们需要把它保存到别的地方(例如一个 USB 设备)。该文件能帮助我们重新恢复 MBR,这只在我们操作过程中没有改变硬盘驱动布局时才有效。

备份 MBR

# dd if=/dev/sda of=mbr.bkp bs=512 count=1

Backup MBR in Linux

在 Linux 中备份 MBR

恢复 MBR

# dd if=mbr.bkp of=/dev/sda bs=512 count=1

Restore MBR in Linux

在 Linux 中恢复 MBR

EFI/UEFI 方式

对于使用 EFI/UEFI 方式的系统, UEFI 固件读取它的设置来决定从哪里启动哪个 UEFI 应用。(例如, EFI 分区位于哪块磁盘或分区。

接下来,加载并运行第二阶段引导程序(又名引导管理器)。GRUB[GRand Unified Boot] 是 Linux 中最常使用的引导管理器。今天大部分使用的系统中都能找到它两个中的其中一个版本。

  • GRUB 有效配置文件: /boot/grub/menu.lst(旧发行版, EFI/UEFI 固件不支持)。
  • GRUB2 配置文件: 通常是 /etc/default/grub。

尽管 LFCS 考试目标没有明确要求了解 GRUB 内部知识,但如果你足够大胆并且不怕把你的系统搞乱(为了以防万一,你可以先在虚拟机上进行尝试)你可以运行:

# update-grub

为了使更改生效,你需要以 root 用户修改 GRUB 的配置。

首先, GRUB 加载默认的内核以及 initrd 或 initramfs 镜像。补充一句,initrd 或者 initramfs 帮助完成硬件检测、内核模块加载、以及发现挂载根目录文件系统需要的设备。

一旦真正的根目录文件系统启动,为了显示用户界面,内核就会执行系统和服务管理器(init 或 systemd,进程号 PID 一般为 1)开始普通用户态的引导程序。

init 和 systemd 都是管理其它守护进程的守护进程(后台进程),它们总是最先启动(系统引导时),最后结束(系统关闭时)。

Systemd and Init

Systemd 和 Init

自启动服务(SysVinit)

Linux 中运行等级通过控制运行哪些服务来以不同方式使用系统。换句话说,运行等级控制着当前执行状态下可以完成什么任务(以及什么不能完成)。

传统上,这个启动过程是基于起源于 System V Unix 的形式,通过执行脚本启动或者停止服务从而使机器进入指定的运行等级(换句话说,是一个不同的系统运行模式)。

在每个运行等级中,独立服务可以设置为运行、或者在运行时关闭。一些主流发行版的最新版本中,已经移除了标准的 System V,而用一个称为 systemd(表示系统守护进程)的新服务和系统管理器代替,但为了兼容性,通常也支持 sysv 命令。这意味着你可以在基于 systemd 的发行版中运行大部分有名的 sysv 初始化工具。

除了启动系统进程,init 还会查看 /etc/inittab 来决定进入哪个运行等级。

RunlevelDescription
0停止系统。运行等级 0 是一个用于快速关闭系统的特殊过渡状态。
1别名为 s 或 S,这个运行等级有时候也称为维护模式。在这个运行等级启动的服务由于发行版不同而不同。通常用于正常系统操作损坏时低级别的系统维护。
2多用户。在 Debian 系统及其衍生版中,这是默认的运行等级,还包括了一个图形化登录(如果有的话)。在基于红帽的系统中,这是没有网络的多用户模式。
3在基于红帽的系统中,这是默认的多用户模式,运行除了图形化环境以外的所有东西。基于 Debian 的系统中通常不会使用这个运行等级以及等级 4 和 5。
4通常默认情况下不使用,可用于自定制。
5基于红帽的系统中,支持 GUI 登录的完全多用户模式。这个运行等级和等级 3 类似,但是有可用的 GUI 登录。
6重启系统。

要在运行等级之间切换,我们只需要使用 init 命令更改运行等级:init N(其中 N 是上面列出的一个运行等级)。 请注意这并不是运行中的系统切换运行等级的推荐方式,因为它不会给已经登录的用户发送警告(因而导致他们丢失工作以及进程异常终结)。

相反,应该用 shutdown 命令重启系统(它首先发送警告信息给所有已经登录的用户,并锁住任何新的登录;然后再给 init 发送信号切换运行等级)但是,首先要在 /etc/inittab 文件中设置好默认的运行等级(系统引导到的等级)。

因为这个原因,按照下面的步骤切当地切换运行等级。以 root 用户在 /etc/inittab 中查找下面的行。

id:2:initdefault:

并用你喜欢的文本编辑器,例如 vim(本系列的 LFCS 系列第二讲:如何安装和使用纯文本编辑器 vi/vim),更改数字 2 为想要的运行等级。

然后,以 root 用户执行

# shutdown -r now

最后一个命令会重启系统,并使它在下一次引导时进入指定的运行等级,并会执行保存在 /etc/rc[runlevel].d 目录中的脚本以决定应该启动什么服务、不应该启动什么服务。例如,在下面的系统中运行等级 2。

Change Runlevels in Linux

在 Linux 中更改运行等级

使用 chkconfig 管理服务

为了在启动时启动或者停用系统服务,我们可以在 CentOS / openSUSE 中使用 chkconfig 命令,在 Debian 及其衍生版中使用 sysv-rc-conf 命令。这个工具还能告诉我们对于一个指定的运行等级预先配置的状态是什么。

列出某个服务的运行等级配置。

# chkconfig --list [service name]
# chkconfig --list postfix
# chkconfig --list mysqld

Listing Runlevel Configuration

列出运行等级配置

从上图中我们可以看出,当系统进入运行等级 2 到 5 的时候就会启动 postfix,而默认情况下运行等级 2 到 4 时会运行 mysqld。现在假设我们并不希望如此。

例如,我们希望运行等级为 5 时也启动 mysqld,运行等级为 4 或 5 时关闭 postfix。下面分别针对两种情况进行设置(以 root 用户执行以下命令)。

为特定运行等级启用服务

# chkconfig --level [level(s)] service on
# chkconfig --level 5 mysqld on

为特定运行等级停用服务

# chkconfig --level [level(s)] service off
# chkconfig --level 45 postfix off

在 Linux 中启用/停用服务Enable Disable Services in Linux

启用/停用服务

我们在基于 Debian 的系统中使用 sysv-rc-conf 完成类似任务。

使用 sysv-rc-conf 管理服务

配置服务自动启动时进入指定运行等级,同时禁止启动时进入其它运行等级。

  1. 我们可以用下面的命令查看启动 mdadm 时的运行等级。
# ls -l /etc/rc[0-6].d | grep -E 'rc[0-6]|mdadm'

查看运行中服务的运行等级Check Runlevel of Service Running

查看运行中服务的运行等级

  1. 我们使用 sysv-rc-conf 设置防止 mdadm 在运行等级2 之外的其它等级启动。只需根据需要(你可以使用上下左右按键)选中或取消选中(通过空格键)。
# sysv-rc-conf

Sysv 运行等级配置SysV Runlevel Config

Sysv 运行等级配置

然后输入 q 退出。

  1. 重启系统并从步骤 1 开始再操作一遍。
# ls -l /etc/rc[0-6].d | grep -E 'rc[0-6]|mdadm'

验证服务运行等级Verify Service Runlevel

验证服务运行等级

从上图中我们可以看出 mdadm 配置为只在运行等级 2 上启动。

那关于 systemd 呢?

systemd 是另外一个被多种主流 Linux 发行版采用的服务和系统管理器。它的目标是允许系统启动时多个任务尽可能并行(而 sysvinit 并非如此,sysvinit 一般比较慢,因为它每次只启动一个进程,而且会检查彼此之间是否有依赖,在启动其它服务之前还要等待守护进程启动),充当运行中系统动态资源管理的角色。

因此,服务只在需要的时候启动,而不是系统启动时毫无缘由地启动(为了防止消耗系统资源)。

要查看你系统中运行的原生 systemd 服务和 Sysv 服务,可以用以下的命令。

# systemctl

在 Linux 中查看运行中的进程Check All Running Processes in Linux

查看运行中的进程

LOAD 一列显示了单元(UNIT 列,显示服务或者由 systemd 维护的其它进程)是否正确加载,ACTIVE 和 SUB 列则显示了该单元当前的状态。

显示服务当前状态的信息

当 ACTIVE 列显示某个单元状态并非活跃时,我们可以使用以下命令查看具体原因。

# systemctl status [unit]

例如,上图中 media-samba.mount 处于失败状态。我们可以运行:

# systemctl status media-samba.mount

查看 Linux 服务状态Check Linux Service Status

查看服务状态

我们可以看到 media-samba.mount 失败的原因是 host dev1 上的挂载进程无法找到 //192.168.0.10/gacanepa 上的共享网络。

启动或停止服务

一旦 //192.168.0.10/gacanepa 上的共享网络可用,我们可以再来尝试启动、停止以及重启 media-samba.mount 单元。执行每次操作之后,我们都执行 systemctl stats media-samba.mout 来查看它的状态。

# systemctl start media-samba.mount
# systemctl status media-samba.mount
# systemctl stop media-samba.mount
# systemctl restart media-samba.mount
# systemctl status media-samba.mount

启动停止服务

启动停止服务

启用或停用某服务随系统启动

使用 systemd 你可以在系统启动时启用或停用某服务

# systemctl enable [service]        # 启用服务
# systemctl disable [service]       # 阻止服务随系统启动

启用或停用某服务随系统启动包括在 /etc/systemd/system/multi-user.target.wants 目录添加或者删除符号链接。

启用或停用服务

启用或停用服务

你也可以用下面的命令查看某个服务的当前状态(启用或者停用)。

# systemctl is-enabled [service]

例如,

# systemctl is-enabled postfix.service

另外,你可以用下面的命令重启或者关闭系统。

# systemctl reboot
# systemctl shutdown

Upstart

基于事件的 Upstart 是 /sbin/init 守护进程的替代品,它仅为在需要那些服务的时候启动服务而生,(或者当它们在运行时管理它们),以及处理发生的实践,因此 Upstart 优于基于依赖的 sysvinit 系统。

一开始它是为 Ubuntu 发行版开发的,但在红帽企业版 Linux 6.0 中得到使用。尽管希望它能在所有 Linux 发行版中替代 sysvinit,但它已经被 systemd 超越。2014 年 2 月 14 日,Mark Shuttleworth(Canonical Ltd. 创建者)发布声明之后的 Ubuntu 发行版采用 systemd 作为默认初始化守护进程。

由于 Sysv 启动脚本已经流行很长时间了,很多软件包中都包括了 Sysv 启动脚本。为了兼容这些软件, Upstart 提供了兼容模式:它可以运行保存在常用位置(/etc/rc.d/rc?.d, /etc/init.d/rc?.d, /etc/rc?.d或其它类似的位置)的Sysv 启动脚本。因此,如果我们安装了一个还没有 Upstart 配置脚本的软件,仍然可以用原来的方式启动它。

另外,如果我们还安装了类似 chkconfig 的工具,你还可以和在基于 sysvinit 的系统中一样用它们管理基于 Sysv 的服务。

Upstart 脚本除了支持 Sysv 启动脚本,还支持基于多种方式启动或者停用服务;例如, Upstart 可以在一个特定硬件设备连接上的时候启动一个服务。

使用 Upstart以及它原生脚本的系统替换了 /etc/inittab 文件和 /etc/init 目录下和运行等级相关的以 .conf 作为后缀的 Sysv 启动脚本目录。

这些 *.conf 脚本(也称为任务定义)通常包括以下几部分:

  • 进程描述
  • 进程的运行等级或者应该触发它们的事件
  • 应该停止进程的运行等级或者触发停止进程的事件
  • 选项
  • 启动进程的命令

例如,

# My test service - Upstart script demo description "Here goes the description of 'My test service'" author "Dave Null <[email protected]>"
# Stanzas

#
# Stanzas define when and how a process is started and stopped
# See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas#respawn
# When to start the service
start on runlevel [2345]
# When to stop the service
stop on runlevel [016]
# Automatically restart process in case of crash
respawn
# Specify working directory
chdir /home/dave/myfiles
# Specify the process/command (add arguments if needed) to run
exec bash backup.sh arg1 arg2

要使更改生效,你要让 upstart 重新加载它的配置文件。

# initctl reload-configuration

然后用下面的命令启动你的任务。

$ sudo start yourjobname

其中 yourjobname 是之前 yourjobname.conf 脚本中添加的任务名称。

关于 Upstart 更完整和详细的介绍可以参考该项目网站的 “Cookbook” 栏目。

总结

了解 Linux 启动进程对于你进行错误处理、调整计算机系统以及根据需要运行服务非常有用。

在这篇文章中,我们分析了你按下电源键启动机器的一刻到你看到完整的可操作用户界面这段时间发生了什么。我希望你能像我一样把它们放在一起阅读。欢迎在下面留下你的评论或者疑问。我们总是期待听到读者的回复。


via: http://www.tecmint.com/linux-boot-process-and-manage-services/

作者:Gabriel Cánepa 译者:ictlyh 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

头条消息

GNOME 基金会宣布即将召开第一届 LAS (Libre Application Summit) GNOME 大会,大会将在 9 月 19 日至 23 日于美国俄勒冈州波特兰市召开 。大会的主要目的是通过加强主要的 GNU/Linux 发行版和 Linux 内核之间的合作来推进 GNU/Linux 应用生态系统的发展。大会面向大小不等的开源应用开发者,包括参与开发各种 FOSS 的公司和个人,以便让他们可以分享他们知识,推进 GNU/Linux 软件项目的发展。

版本更迭

  • Manjaro ARM 16.05 正式发布,完全支持树莓派 2,开发团队正在努力开发支持蓝牙和 WiFi 的树莓派 3 版本。它是基于非官方的 Arch Linux for ARM 的衍生版。这个该项目的第一个稳定版本。
  • Linux 4.5.5 和 4.4.11 LTS 内核发布。
  • Enlightenment 开发者日 2016 大会刚刚结束, Enlightenment 就发布了 0.20.8 版本。这是一个轻量级的漂亮的桌面环境。而备受期待的 0.21 还在努力开发中,当前还在 Beta 阶段。
  • pfSense BSD 防火墙 2.3.1 发布,注意,这不是之前发布的 pfSense 2.3 Update 1(即 2.3-1),而是一个完整的维护版本,带来了超过100个更新。

Credit: Moini

作为一个程序员,我知道我肯定会犯错误——怎么可能不犯错!程序员也是人啊。有的错误能在编码过程中及时发现,而有些却得等到软件测试了才能显露出来。然而,还有一类错误并不能在这两个阶段被解决,这就导致软件不能正常运行,甚至是提前终止。

如果你还没猜出是那种错误,我说的就是和内存相关的错误。手动调试这些错误不仅耗时,而且很难发现并纠正。值得一提的是,这种错误很常见,特别是在用 C/C++ 这类允许手动管理内存的语言编写的软件里。

幸运的是,现在有一些编程工具能够帮你在软件程序中找到这些和内存相关的错误。在这些工具集中,我评估了五款支持 Linux 的、流行的、自由开源的内存调试器: Dmalloc 、 Electric Fence 、 Memcheck 、 Memwatch 以及 Mtrace 。在日常编码中,我已经用过这五个调试器了,所以这些评估是建立在我的实际体验之上的。

Dmalloc

开发者:Gray Watson

评估版本:5.5.2

支持的 Linux 版本:所有种类

许可: CC 3.0

Dmalloc 是 Gray Watson 开发的一款内存调试工具。它是作为库来实现的,封装了标准内存管理函数如malloc() , calloc() , free()等,使程序员得以检测出有问题的代码。

cw dmalloc output

Dmalloc

如同工具的网页所示,这个调试器提供的特性包括内存泄漏跟踪、 重复释放内存 double free 错误跟踪、以及 越界写入 fence-post write 检测。其它特性包括报告错误的文件/行号、通用的数据统计记录。

更新内容

5.5.2 版本是一个 bug 修正发行版,修复了几个有关构建和安装的问题。

有何优点

Dmalloc 最大的优点就是高度可配置性。比如说,你可以配置它以支持 C++ 程序和多线程应用。 Dmalloc 还提供一个有用的功能:运行时可配置,这表示在 Dmalloc 执行时,可以轻易地启用或者禁用它提供的一些特性。

你还可以配合 GNU Project Debugger (GDB)来使用 Dmalloc ,只需要将dmalloc.gdb文件(位于 Dmalloc 源码包中的 contrib 子目录里)的内容添加到你的主目录中的.gdbinit文件里即可。

另外一个让我对 Dmalloc 爱不释手的优点是它有大量的资料文献。前往官网的 Documentation 栏目,可以获取所有关于如何下载、安装、运行、怎样使用库,和 Dmalloc 所提供特性的细节描述,及其生成的输出文件的解释。其中还有一个章节介绍了一般问题的解决方法。

注意事项

跟 Mtrace 一样, Dmalloc 需要程序员改动他们的源代码。比如说你可以(也是必须的)添加头文件dmalloc.h,工具就能汇报产生问题的调用的文件或行号。这个功能非常有用,因为它节省了调试的时间。

除此之外,还需要在编译你的程序时,把 Dmalloc 库(编译 Dmalloc 源码包时产生的)链接进去。

然而,还有点更麻烦的事,需要设置一个环境变量,命名为DMALLOC_OPTION,以供工具在运行时配置内存调试特性,比如定义输出文件的路径。可以手动为该环境变量分配一个值,不过初学者可能会觉得这个过程有点困难,因为该值的一部分用来表示要启用的 Dmalloc 特性——以十六进制值的累加值表示。这里有详细介绍。

一个比较简单方法设置这个环境变量是使用 Dmalloc 实用指令,这是专为这个目的设计的方法。

总结

Dmalloc 真正的优势在于它的可配置选项。而且高度可移植,曾经成功移植到多种操作系统如 AIX 、 BSD/OS 、 DG/UX 、 Free/Net/OpenBSD 、 GNU/Hurd 、 HPUX 、 Irix 、 Linux 、 MS-DOG 、 NeXT 、 OSF 、 SCO 、 Solaris 、 SunOS 、 Ultrix 、 Unixware 甚至 Unicos(运行在 Cray T3E 主机上)。虽然使用 Dmalloc 需要学习许多知识,但是它所提供的特性值得为之付出。

Electric Fence

开发者:Bruce Perens

评估版本:2.2.3

支持的 Linux 版本:所有种类

许可:GPL v2

Electric Fence 是 Bruce Perens 开发的一款内存调试工具,它以库的形式实现,你的程序需要链接它。Electric Fence 能检测出内存溢出和访问已经释放的内存。

cw electric fence output

Electric Fence

顾名思义, Electric Fence 在每个所申请的缓存边界建立了虚拟围栏,这样一来任何非法的内存访问都会导致段错误。这个调试工具同时支持 C 和 C++ 程序。

更新内容

2.2.3 版本修复了工具的构建系统,使得 -fno-builtin-malloc 选项能真正传给 GNU Compiler Collection (GCC)

有何优点

我喜欢 Electric Fence 的首要一点是它不同于 Memwatch 、 Dmalloc 和 Mtrace ,不需要对你的源码做任何的改动,你只需要在编译的时候把它的库链接进你的程序即可。

其次, Electric Fence 的实现保证了产生越界访问的第一个指令就会引起段错误。这比在后面再发现问题要好多了。

不管是否有检测出错误, Electric Fence 都会在输出产生版权信息。这一点非常有用,由此可以确定你所运行的程序已经启用了 Electric Fence 。

注意事项

另一方面,我对 Electric Fence 真正念念不忘的是它检测内存泄漏的能力。内存泄漏是 C/C++ 软件最常见也是最不容易发现的问题之一。不过, Electric Fence 不能检测出栈溢出,而且也不是线程安全的。

由于 Electric Fence 会在用户分配内存区的前后分配禁止访问的虚拟内存页,如果你过多的进行动态内存分配,将会导致你的程序消耗大量的额外内存。

Electric Fence 还有一个局限是不能明确指出错误代码所在的行号。它所能做只是在检测到内存相关错误时产生段错误。想要定位错误的行号,需要借助 GDB这样的调试工具来调试启用了 Electric Fence 的程序。

最后一点,尽管 Electric Fence 能检测出大部分的缓冲区溢出,有一个例外是,如果所申请的缓冲区大小不是系统字长的倍数,这时候溢出(即使只有几个字节)就不能被检测出来。

总结

尽管局限性较大, Electric Fence 的易用性仍然是加分项。只要链接一次程序, Electric Fence 就可以在监测出内存相关问题的时候报警。不过,如同前面所说, Electric Fence 需要配合像 GDB 这样的源码调试器使用。

Memcheck

开发者Valgrind 开发团队

评估版本:3.10.1

支持的 Linux 发行版:所有种类

许可:GPL

Valgrind 是一个提供好几款调试和分析 Linux 程序性能的工具的套件。虽然 Valgrind 能和不同语言——Java 、 Perl 、 Python 、 Assembly code 、 ortran 、 Ada 等——编写的程序一起工作,但是它主要还是针对使用 C/C++ 所编写的程序。

Memcheck ,一款内存错误检测器,是其中最受欢迎的工具。它能够检测出如内存泄漏、无效的内存访问、未定义变量的使用以及堆内存分配和释放相关的问题等诸多问题。

更新内容

工具套件( 3.10.1 )主要修复了 3.10.0 版本发现的 bug 。除此之外,“从主干开发版本向后移植的一些补丁,修复了缺失的 AArch64 ARMv8 指令和系统调用”。

有何优点

同其它所有 Valgrind 工具一样, Memcheck 也是命令行程序。它的操作非常简单:通常我们会使用诸如 prog arg1 arg2 格式的命令来运行程序,而 Memcheck 只要求你多加几个值即可,如 valgrind --leak-check=full prog arg1 arg2

cw memcheck output

Memcheck

(注意:因为 Memcheck 是 Valgrind 的默认工具,所以在命令行执行命令时无需提及 Memcheck。但是,需要在编译程序之初带上 -g 参数选项,这一步会添加调试信息,使得 Memcheck 的错误信息会包含正确的行号。)

我真正倾心于 Memcheck 的是它提供了很多命令行选项(如上所述的--leak-check选项),如此不仅能控制工具运转还可以控制它的输出。

举个例子,可以开启--track-origins选项,以查看程序源码中未初始化的数据;可以开启--show-mismatched-frees选项让 Memcheck 匹配内存的分配和释放技术。对于 C 语言所写的代码, Memcheck 会确保只能使用free()函数来释放内存,malloc()函数来申请内存。而对 C++ 所写的源码, Memcheck 会检查是否使用了deletedelete[]操作符来释放内存,以及new或者new[]来申请内存。

Memcheck 最好的特点,尤其是对于初学者来说,是它会给用户建议使用哪个命令行选项能让输出更加有意义。比如说,如果你不使用基本的--leak-check选项, Memcheck 会在输出时给出建议:“使用 --leak-check=full 重新运行以查看更多泄漏内存细节”。如果程序有未初始化的变量, Memcheck 会产生信息:“使用 --track-origins=yes 以查看未初始化变量的定位”。

Memcheck 另外一个有用的特性是它可以创建 抑制文件 suppression files ,由此可以略过特定的不能修正的错误,这样 Memcheck 运行时就不会每次都报警了。值得一提的是, Memcheck 会去读取默认抑制文件来忽略系统库(比如 C 库)中的报错,这些错误在系统创建之前就已经存在了。可以选择创建一个新的抑制文件,或是编辑现有的文件(通常是/usr/lib/valgrind/default.supp)。

Memcheck 还有高级功能,比如可以使用定制内存分配器检测内存错误。除此之外, Memcheck 提供监控命令,当用到 Valgrind 内置的 gdbserver ,以及客户端请求机制(不仅能把程序的行为告知 Memcheck ,还可以进行查询)时可以使用。

注意事项

毫无疑问, Memcheck 可以节省很多调试时间以及省去很多麻烦。但是它使用了很多内存,导致程序执行变慢(由文档可知,大概会花费 20 至 30 倍时间)。

除此之外, Memcheck 还有其它局限。根据用户评论, Memcheck 很明显不是线程安全的;它不能检测出 静态缓冲区溢出;还有就是,一些 Linux 程序如 GNU Emacs 目前还不能配合 Memcheck 工作。

如果有兴趣,可以在这里查看 Valgrind 局限性的详细说明。

总结

无论是对于初学者还是那些需要高级特性的人来说, Memcheck 都是一款便捷的内存调试工具。如果你仅需要基本调试和错误检查, Memcheck 会非常容易上手。而当你想要使用像抑制文件或者监控指令这样的特性,就需要花一些功夫学习了。

虽然罗列了大量的局限性,但是 Valgrind(包括 Memcheck )在它的网站上声称全球有成千上万程序员使用了此工具。开发团队称收到来自超过 30 个国家的用户反馈,而这些用户的工程代码有的高达两千五百万行。

Memwatch

开发者:Johan Lindh

评估版本:2.71

支持的 Linux 发行版:所有种类

许可:GNU GPL

Memwatch 是由 Johan Lindh 开发的内存调试工具,虽然它扮演的主要角色是内存泄漏检测器,但是(根据网页介绍)它也具有检测其它如内存重复释放和错误释放、缓冲区溢出和下溢、野指针写入等等内存相关问题的能力。

Memwatch 支持用 C 语言所编写的程序。也可以在 C++ 程序中使用它,但是这种做法并不提倡(由 Memwatch 源码包随附的 Q&A 文件中可知)。

更新内容

这个版本添加了ULONG_LONG_MAX以区分 32 位和 64 位程序。

有何优点

跟 Dmalloc 一样, Memwatch 也有优秀的文档资料。参考 USING 文件,可以学习如何使用 Memwatch ,可以了解 Memwatch 是如何初始化、如何清理以及如何进行 I/O 操作,等等。还有一个 FAQ 文件,旨在帮助用户解决使用过程遇到的一般问题。最后还有一个test.c文件提供工作案例参考。

cw memwatch output

Memwatch

不同于 Mtrace , Memwatch 产生的日志文件(通常是memwatch.log)是人类可阅读的格式。而且, Memwatch 每次运行时总会把内存调试结果拼接到输出该文件的末尾。如此便可在需要之时轻松查看之前的输出信息。

同样值得一提的是当你执行了启用 Memwatch 的程序, Memwatch 会在标准输出中产生一个单行输出,告知发现了错误,然后你可以在日志文件中查看输出细节。如果没有产生错误信息,就可以确保日志文件不会写入任何错误,多次运行的话确实能节省时间。

另一个我喜欢的优点是 Memwatch 还提供了在源码中获取其输出信息的方式,你可以获取信息,然后任由你进行处理(参考 Memwatch 源码中的mwSetOutFunc()函数获取更多有关的信息)。

注意事项

跟 Mtrace 和 Dmalloc 一样, Memwatch 也需要你往你的源文件里增加代码:你需要把memwatch.h这个头文件包含进你的代码。而且,编译程序的时候,你需要连同memwatch.c一块编译;或者你可以把已经编译好的目标模块包含起来,然后在命令行定义MEMWATCHMW_STDIO变量。不用说,想要在输出中定位行号, -g 编译器选项也少不了。

此外, Memwatch 缺少一些特性。比如 Memwatch 不能检测出对一块已经被释放的内存进行写入操作,或是在分配的内存块之外的进行读取操作。而且, Memwatch 也不是线程安全的。还有一点,正如我在开始时指出,在 C++ 程序上运行 Memwatch 的结果是不能预料的。

总结

Memcheck 可以检测很多内存相关的问题,在处理 C 程序时是非常便捷的调试工具。因为源码小巧,所以可以从中了解 Memcheck 如何运转,有需要的话可以调试它,甚至可以根据自身需求扩展升级它的功能。

Mtrace

开发者: Roland McGrath 和 Ulrich Drepper

评估版本: 2.21

支持的 Linux 发行版:所有种类

许可:GNU GPL

Mtrace 是 GNU C 库中的一款内存调试工具,同时支持 Linux 上的 C 和 C++ 程序,可以检测由函数malloc()free()不匹配的调用所引起的内存泄漏问题。

cw mtrace output

Mtrace

Mtrace 实际上是实现了一个名为mtrace()的函数,它可以跟踪程序中所有 malloc/free 调用,并在用户指定的文件中记录相关信息。文件以一种机器可读的格式记录数据,所以有一个 Perl 脚本——同样命名为 mtrace ——用来把文件转换并为人类可读格式。

更新内容

Mtrace 源码Perl 文件同 GNU C 库( 2.21 版本)一起释出,除了更新版权日期,其它别无改动。

有何优点

Mtrace 最好的地方是它非常简单易学。你只需要了解在你的源码中如何以及何处添加 mtrace() 及对应的 muntrace() 函数,还有如何使用 Mtrace 的 Perl 脚本。后者非常简单,只需要运行指令mtrace <program-executable> <log-file-generated-upon-program-execution>(例子见开头截图最后一条指令)。

Mtrace 另外一个优点是它的可伸缩性,这体现在不仅可以使用它来调试完整的程序,还可以使用它来检测程序中独立模块的内存泄漏。只需在每个模块里调用mtrace()muntrace()即可。

最后一点,因为 Mtrace 会在mtrace()——在源码中添加的函数——执行时被触发,因此可以很灵活地使用信号动态地(在程序执行时)使能 Mtrace 。

注意事项

因为mtrace()mauntrace()函数 —— 声明在mcheck.h文件中,所以必须在源码中包含此头文件 —— 的调用是 Mtrace 工作的基础(mauntrace()函数并非总是必要),因此 Mtrace 要求程序员至少改动源码一次。

需要注意的是,在编译程序的时候带上 -g 选项( GCCG++ 编译器均有提供),才能使调试工具在输出结果时展示正确的行号。除此之外,有些程序(取决于源码体积有多大)可能会花很长时间进行编译。最后,带 -g 选项编译会增加了可执行文件的大小(因为提供了额外的调试信息),因此记得程序需要在测试结束后,不带 -g 选项重新进行编译。

使用 Mtrace ,你需要掌握 Linux 环境变量的基本知识,因为在程序执行之前,需要把用户把环境变量MALLOC_TRACE的值设为指定的文件(mtrace()函数将会记录全部信息到其中)路径。

Mtrace 在检测内存泄漏和试图释放未经过分配的内存方面存在局限。它不能检测其它内存相关问题如非法内存访问、使用未初始化内存。而且,有人抱怨 Mtrace 不是线程安全的。

总结

不言自明,我在此讨论的每款内存调试器都有其优点和局限。所以,哪一款适合你取决于你所需要的特性,虽然有时候容易安装和使用也是一个决定因素。

要想捕获软件程序中的内存泄漏, Mtrace 最适合不过了。它还可以节省时间。由于 Linux 系统已经预装了此工具,对于不能联网或者不可以下载第三方调试调试工具的情况, Mtrace 也是极有助益的。

另一方面,相比 Mtrace , Dmalloc 不仅能检测更多错误类型,还提供更多特性,比如运行时可配置、 GDB 集成。而且, Dmalloc 不像这里所说的其它工具,它是线程安全的。更不用说它的详细资料了,这让 Dmalloc 成为初学者的理想选择。

虽然 Memwatch 的资料比 Dmalloc 的更加丰富,而且还能检测更多的错误种类,但是你只能在 C 语言写就的程序中使用它。一个让 Memwatch 脱颖而出的特性是它允许在你的程序源码中处理它的输出,这对于想要定制输出格式来说是非常有用的。

如果改动程序源码非你所愿,那么使用 Electric Fence 吧。不过,请记住, Electric Fence 只能检测两种错误类型,而此二者均非内存泄漏。还有就是,需要基本了解 GDB 以最大化发挥这款内存调试工具的作用。

Memcheck 可能是其中综合性最好的了。相比这里提及的其它工具,它能检测更多的错误类型,提供更多的特性,而且不需要你的源码做任何改动。但请注意,基本功能并不难上手,但是想要使用它的高级特性,就必须学习相关的专业知识了。


via: http://www.computerworld.com/article/3003957/linux/review-5-memory-debuggers-for-linux-coding.html

作者:Himanshu Arora 译者:soooogreen 校对:PurlingNayuki,ezio

本文由 LCTT 原创编译,Linux中国 荣誉推出

开源先锋及 SUSE Linux 的创造者 SUSE 公司宣布推出 SUSE Linux 企业版的 实时补丁 Live Patching

SUSE 是首批为基于 Linux 内核的操作系统提供实时补丁的开源公司之一。实时补丁技术是在 Linux 4.0 系列内核中实现的一种技术,发布于一年前。

但是,只有很少的 GNU/Linux 操作系统在其架构内支持了实时补丁功能,因为看起来该技术大多会用于企业用户,大型公司并不希望由于内核升级而导致业务中断。

从今天开始,所有运行 SAP NetWeaver 技术平台、SAP HANA 平台以及其它的 SAP( 系统应用产品 Systems Applications Products )应用的 SUSE 用户都可以使用 SUSE Linux 企业版实时补丁了,这可以帮助他们节约开销,业务永不停顿。

“依赖于实时数据和分析的服务日益竞争激烈,而保持应用服务器可持续访问很关键”,SUSE 战略联盟与市场总裁 Michael Miller 说道,“我们认为业务将不应该由于服务器更新而停顿。”

实时内核补丁可以让业务免受停机困扰

在过去,在那些需要高度安全的 IT 环境中,许多业务由于例行的停机维护而造成了大量损失。但是现在这一切都将改变,因为 SUSE Linux 企业版实时补丁,可以让企业级 Linux 用户应用内核补丁而不需要重启服务器。

SUSE Linux 企业版实时补丁也对于重要的 SAP 商业应用非常关键,比如那些运行 SAP HANA 的企业。该技术内建于内核之中,可以让 SUSE Linux 用户更新其正在运行的 Linux 内核,而不需要中断服务或由于重启服务器导致 SAP HANA 平台关闭。