分类 技术 下的文章

Public vs Private blockchain

区块链 2.0系列的前一篇文章探索了智能合同的现状。这篇文章旨在揭示可以创建的不同类型的区块链。它们每个都用于非常不同的应用程序,并且根据用例的不同,每个应用程序所遵循的协议也不同。现在,让我们将公有链之于私有链对比一下开源软件之于专有技术。

正如我们所知,基于区块链的分布式分类账本的基本三层结构如下:

图 1 – 区块链分布式账本的基本结构

这里提到的类型之间的差异主要归因于底层区块链其所依赖的协议。该协议规定了参与者的规则和参与的方式。

阅读本文时,请记住以下几点事项:

  • 任何平台的产生都是为了解决需求而生。技术应该采取最好的方向。例如,区块链具有巨大的应用价值,其中一些可能需要丢弃在其他情形中看起来很重要的功能。在这方面,分布式存储就是最好的例子。
  • 区块链本质上是一个数据库系统,通过时间戳和区块的形式组织数据来跟踪信息。此类区块链的创建者可以选择谁有权产出这些区块并进行修改。
  • 区块链也可以“中心化”,参与的程度可以限定于由“中央权威”认定为符合条件的人。

大多数区块链要么是公有的,要么是私有的。广义上说,公有链可以被认为是开源软件的等价物,大多数私有链可以被视为源自公有链的专有平台。下图应该会让大多数人明显地看出基本的区别。

图 2 – 公有链/私有链与开源/专有技术的对比

虽然这是最受欢迎的理解。但是这并不是说所有的私有链都是从公有链中衍生出来的。

公有链

公有链可以被视为是一个无需许可的、开放的平台或网络。任何拥有专业知识和计算资源的人都可以参与其中。这将产生以下影响:

  • 任何人都可以加入公有链网络并参与到其中。“参与者” 所需要的只是稳定的网络资源和计算资源。
  • 参与行为包括了读取、写入、验证和提供交易期间的共识。比特币矿工就是很好的例子。作为网络的参与者,矿工会得到比特币作为回报。
  • 平台完全去中心,完全冗余。
  • 由于去中心化,没有一个实体可以完全控制分类账本中记录的数据。所有 (或大多数) 参与者都需要通过验证区块的方式检查数据。
  • 这意味着,一旦信息被验证和记录,就不能轻易改变。即使能改变,也不可能不留下痕迹。
  • 在比特币和莱特币等平台上,参与者的身份仍然是匿名的。设计这些平台的目的是保护和保护用户身份。这主要是由上层协议栈提供的功能。
  • 公有链有比特币、莱特币、以太坊等不同的网络。
  • 广泛的去中心化意味着,在区块链分布式网络实现的交易,获得共识可能需要一段时间,对于旨在每时每刻都在推动大量交易的大型企业来说,吞吐量可能是一个挑战。
  • 开放式参与,使比特币等公有链中的大量参与者,往往会增加对计算设备和能源成本的初始投资。
  • 公有链以设计安全著称。它们的实现依靠以下几点:

    • 匿名参与者
    • 多个节点上的分布式和冗余的加密存储
    • 创建和更改数据需要大量的共识

私有链

相比之下,私有链是一个被许可的区块链*。这意味着:

  • 参与网络的许可受到限制,并由监督网络的所有者或机构主持。这意味着,即使个人能够存储数据并进行交易(例如,发送和接收付款),这些交易的验证和存储也只能由选定的参与者来完成。
  • 参与者一旦获得中心机构的许可,将受到条款的限制。例如,在金融机构运营的私有链网络中,并不是每个客户都可以访问整个区块链的分布式账本,甚至在那些获得许可的客户中吗,也不是每个人都能访问所有的东西。在这种情况下,中心机构将授予访问选择服务的权限。这通常被称为 “通道”。
  • 与公有链相比,这种系统具有更大的吞吐量能力,也展示了更快的交易速度,因为区块只需要由少数几个人验证。

私有链通常在其协议中没有任何特征。这使得该系统仅与目前使用的大多数基于云的数据库系统一样安全。

智者的观点

需要注意的一点是,它们被命名为公有或私有(或开源、闭源)的事实与底层代码库无关。在这两种情况下,平台所基于的代码或文字基础可能是公开的,也可能不是公开的。R3 是一家 DLT( 分布式分类账本 D istributed L edger T echnology )公司,领导着由 200 多家跨国机构组成的公有财团。他们的目标是在金融和商业领域进一步发展区块链和相关分布式账本技术。corda 是这一共同努力的产物。R3 将 corda 定义为专门为企业构建的区块链平台。其代码库同样是开源的,鼓励世界各地的开发人员为这个项目做出贡献。然而,考虑到 corda 面临的业务性质和旨在满足的需求,corda 被归类为许可的封闭区块链平台。这意味着企业可以在部署后选择网络的参与者,并通过使用原生可用的智能合约工具选择这些参与者可以访问的信息类型。

虽然像比特币和以太坊这样的公有链负责该领域的广泛认知和发展,但仍然可以认为,为企业或商业环境中的特定用例设计的私有链将在短期内引领货币投资。这些都是我们大多数人在不久的将来会看到以实际方式运用起来的平台。

请继续阅读本系列中下一篇有关 Hyperledger 项目的文章。

我们正在研究更多有趣的区块链技术话题。敬请期待!


via: https://www.ostechnix.com/blockchain-2-0-public-vs-private-blockchain-comparison/

作者:ostechnix 选题:lujun9972 译者:zionfuo 校对:wxy

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

库注入 Library injections 在 Linux 上不如 Windows 上常见,但它仍然是一个问题。下来看看它们如何工作的,以及如何鉴别它们。

尽管在 Linux 系统上几乎见不到,但库(Linux 上的共享目标文件)注入仍是一个严峻的威胁。在采访了来自 AT&T 公司 Alien 实验室的 Jaime Blasco 后,我更加意识到了其中一些攻击是多么的易实施。

在这篇文章中,我会介绍一种攻击方法和它的几种检测手段。我也会提供一些展示攻击细节的链接和一些检测工具。首先,引入一个小小的背景信息。

共享库漏洞

DLL 和 .so 文件都是允许代码(有时候是数据)被不同的进程共享的共享库文件。公用的代码可以放进一个文件中使得每个需要它的进程可以重新使用而不是多次被重写。这也促进了对公用代码的管理。

Linux 进程经常使用这些共享库。(显示共享对象依赖的)ldd 命令可以对任何程序文件显示其共享库。这里有一些例子:

$ ldd /bin/date
        linux-vdso.so.1 (0x00007ffc5f179000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f02bea15000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f02bec3a000)
$ ldd /bin/netstat
        linux-vdso.so.1 (0x00007ffcb67cd000)
        libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f45e5d7b000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f45e5b90000)
        libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f45e5b1c000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f45e5b16000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f45e5dec000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f45e5af5000)

linux-vdso.so.1 (在一些系统上也许会有不同的名字)是内核自动映射到每个进程地址空间的文件。它的工作是找到并定位进程所需的其他共享库。

对库加载机制加以利用的一种方法是通过使用 LD_PRELOAD 环境变量。正如 Jaime Blasco 在他的研究中所解释的那样,“LD_PRELOAD 是在进程启动时加载共享库的最简单且最受欢迎的方法。可以将此环境变量配置到共享库的路径,以便在加载其他共享对象之前加载该共享库。”

为了展示有多简单,我创建了一个极其简单的共享库并且赋值给我的(之前不存在) LD_PRELOAD 环境变量。之后我使用 ldd 命令查看它对于常用 Linux 命令的影响。

$ export LD_PRELOAD=/home/shs/shownum.so
$ ldd /bin/date
        linux-vdso.so.1 (0x00007ffe005ce000)
        /home/shs/shownum.so (0x00007f1e6b65f000)     <== 它在这里
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1e6b458000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f1e6b682000)

注意,仅仅将新的库赋给 LD_PRELOAD 就影响到了运行的任何程序。

通过设置 LD_PRELOAD 指定的共享库首先被加载(紧随 linux-vdso.so.1),这些库可以极大程度上改变一个进程。例如,它们可以重定向系统调用到它们自己的资源,或对程序运行的行为方式进行意想不到的更改。

osquery 工具可以检测库注入

osquery 工具(可以在 osquery.io下载)提供了一个非常独特的查看 Linux 系统的方式。它基本上将操作系统视作一个高性能的关系数据库。然后,也许你会猜到,这就意味着它可以用来查询并且生成 SQL 表,该表提供了诸如以下的详细信息:

  • 运行中的进程
  • 加载的内核模块
  • 打开的网络链接

一个提供了进程信息的内核表叫做 process_envs。它提供了各种进程使用环境变量的详细信息。Jaime Blasco 提供了一个相当复杂的查询,可以使用 osquery 识别出使用 LD_PRELOAD 的进程。

注意,这个查询是从 process_envs 表中获取数据。攻击 ID(T1055)参考 Mitre 对攻击方法的解释

SELECT process_envs.pid as source_process_id, process_envs.key as environment_variable_key, process_envs.value as environment_variable_value, processes.name as source_process, processes.path as file_path, processes.cmdline as source_process_commandline, processes.cwd as current_working_directory, 'T1055' as event_attack_id, 'Process Injection' as event_attack_technique, 'Defense Evasion, Privilege Escalation' as event_attack_tactic FROM process_envs join processes USING (pid) WHERE key = 'LD_PRELOAD';

注意 LD_PRELOAD 环境变量有时是合法使用的。例如,各种安全监控工具可能会使用到它,因为开发人员需要进行故障排除、调试或性能分析。然而,它的使用仍然很少见,应当加以防范。

同样值得注意的是 osquery 可以交互使用或是作为定期查询的守护进程去运行。了解更多请查阅文章末尾给出的参考。

你也能够通过查看用户的环境设置来定位 LD_PRELOAD 的使用。如果在用户账户中使用了 LD_PRELOAD,你可以使用这样的命令来查看(假定以个人身份登录后):

$ env | grep PRELOAD
LD_PRELOAD=/home/username/userlib.so

如果你之前没有听说过 osquery,也别太在意。它正在成为一个更受欢迎的工具。事实上就在上周,Linux 基金会宣布打造了新的 osquery 基金会以支持 osquery 社区。

总结

尽管库注入是一个严重的威胁,但了解一些优秀的工具来帮助你检测它是否存在是很有帮助的。

扩展阅读

重要的参考和工具的链接:


via: https://www.networkworld.com/article/3404621/tracking-down-library-injections-on-linux.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:LuuMing 校对:wxy

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

简介:在生产环境中遇到打开文件数这类的挑战如今已是司空见惯的事情了。因为许多应用程序是基于 Java 和 Apache 的,安装和配置它们可能会导致打开过多的文件(文件描述符)。如果打开的文件描述符超过了默认设置的限制,就可能会面临访问控制问题,受阻于打开文件的挑战。许多生产环境因此而陷入停滞状态。

幸运的是,在基于 Linux 的服务器上,都有 ulimit 命令,通过它可以查看、设置、获取文件打开的状态和配置详情。此命令配备了许多选项,通过这些组合可以设置打开文件的数量。下面逐个命令用示例做了详细说明。

查看任何 Linux 系统中当前打开文件数的限制

要在 Linux 服务器上得到打开文件数的限制,请执行以下命令,

[root@ubuntu ~]# cat /proc/sys/fs/file-max
146013

上面的数字表明用户可以在每个用户登录会话中打开 ‘146013’ 个文件。

[root@centos ~]# cat /proc/sys/fs/file-max
149219
[root@debian ~]# cat /proc/sys/fs/file-max
73906

这清楚地表明,各个 Linux 操作系统具有不同的打开文件数限制。这基于各自系统中运行的依赖关系和应用程序。

ulimit 命令

顾名思义,ulimit(用户限制)用于显示和设置登录用户的资源限制。当我们使用 -a 选项运行 ulimit 命令时,它将打印登录用户的所有资源限制。现在让我们在 Ubuntu/Debian 和 CentOS 系统上运行 ulimit -a

Ubuntu / Debian 系统

shashi@Ubuntu ~}$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 5731
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024      
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 5731
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

CentOS 系统

shashi@centos ~}$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 5901
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 5901
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

正如我们可以在这里看到的,不同的操作系统具有不同的限制设置。所有这些限制都可以使用 ulimit 命令进行配置/更改。

要显示单个资源限制,可以在 ulimit 命令中传递特定的参数,下面列出了一些参数:

  • ulimit -n –> 显示打开文件数限制
  • ulimit -c –> 显示核心转储文件大小
  • umilit -u –> 显示登录用户的最大用户进程数限制
  • ulimit -f –> 显示用户可以拥有的最大文件大小
  • umilit -m –> 显示登录用户的最大内存大小
  • ulimit -v –> 显示最大内存大小限制

使用以下命令检查登录用户打开文件数量的硬限制和软限制:

shashi@Ubuntu ~}$ ulimit -Hn
1048576
shashi@Ubuntu ~}$ ulimit -Sn
1024

如何修复达到最大文件数限制的问题?

让我们假设我们的 Linux 服务器已经达到了打开文件的最大数量限制,并希望在系统范围扩展该限制,例如,我们希望将 100000 设置为打开文件数量的限制。

root@ubuntu~]# sysctl -w fs.file-max=100000
fs.file-max = 100000

上述更改将在下次重启之前有效,因此要使这些更改在重启后仍存在,请编辑文件 /etc/sysctl.conf 并添加相同的参数,

root@ubuntu~]# vi /etc/sysctl.conf
fs.file-max = 100000

保存文件并退出。

运行下面命令,使上述更改立即生效,而无需注销和重新启动。

root@ubuntu~]# sysctl -p

现在验证新的更改是否生效。

root@ubuntu~]# cat /proc/sys/fs/file-max
100000

使用以下命令找出当前正在使用的文件描述符数量:

[root@ansible ~]# more /proc/sys/fs/file-nr
1216    0       100000

注意:命令 sysctl -p 用于在不重新启动和注销的情况下提交更改。

通过 limit.conf 文件设置用户级资源限制

/etc/sysctl.conf 文件用于设置系统范围的资源限制,但如果要为 Oracle、MariaDB 和 Apache 等特定用户设置资源限制,则可以通过 /etc/security/limits.conf 文件去实现。

示例 limits.conf 如下所示,

root@ubuntu~]# cat /etc/security/limits.conf

Limits-conf-linux-part1

Limits-conf-linux-part2

假设我们要为 linuxtechi 用户设置打开文件数量的硬限制和软限制,而对于 oracle 用户设置打开进程数量的硬限制和软限制,编辑文件 /etc/security/limits.conf 并添加以下行:

# hard limit for max opened files for linuxtechi user
linuxtechi       hard    nofile          4096
# soft limit for max opened files for linuxtechi user
linuxtechi       soft    nofile          1024

# hard limit for max number of process for oracle user
oracle           hard    nproc          8096
# soft limit for max number of process for oracle user
oracle           soft    nproc          4096

保存文件并退出。

注意: 如果你想对一个组而不是用户进行资源限制,那么也可以通过 limits.conf 文件,输入 @<组名> 代替用户名,其余项都是相同的,示例如下,

# hard limit for max opened files for sysadmin group
@sysadmin        hard         nofile            4096 
# soft limit for max opened files for sysadmin group
@sysadmin        soft         nofile            1024

验证新的更改是否生效:

~]# su - linuxtechi
~]$ ulimit -n -H
4096
~]$ ulimit -n -S
1024

~]# su - oracle
~]$ ulimit -H -u
8096
~]$ ulimit -S -u
4096

注:其他主要使用的命令是 lsof,可用于找出“当前打开了多少个文件”,这命令对管理员非常有帮助。

结尾

正如在介绍部分提到的,ulimit 命令非常强大,可以帮助用户配置并确保应用程序安装更加流畅而没有任何瓶颈。此命令有助于修复基于 Linux 的服务器中的(打开)大量文件的限制。


via: https://www.linuxtechi.com/set-ulimit-file-descriptors-limit-linux-servers/

作者:Shashidhar Soppin 选题:lujun9972 译者:zgj1024 校对:wxy

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

lsmod 命令能够告诉你当前系统上加载了哪些内核模块,以及关于使用它们的一些有趣的细节。

Rob Oo (CC BY 2.0)

什么是 Linux 内核模块?

内核模块是可以根据需要加载到内核中或从内核中卸载的代码块,因此无需重启就可以扩展内核的功能。事实上,除非用户使用类似 lsmod 这样的命令来查询模块信息,否则用户不太可能知道内核发生的任何变化。

需要知道的重要一点是,在你的 Linux 系统上总会有很多可用的模块,并且如果你可以深入其中了解到很多细节。

lsmod 的主要用途之一是在系统不能正常工作时检查模块。然而,大多数情况下,模块会根据需要加载的,而且用户不需要知道它们如何运作。

显示内核模块

显示内核模块最简单的方法是使用 lsmod 命令。虽然这个命令包含了很多细节,但输出却是非常用户友好。

$ lsmod
Module                  Size  Used by
snd_hda_codec_realtek 114688  1
snd_hda_codec_generic  77824  1 snd_hda_codec_realtek
ledtrig_audio          16384  2 snd_hda_codec_generic,snd_hda_codec_realtek
snd_hda_codec_hdmi     53248  1
snd_hda_intel          40960  2
snd_hda_codec         131072  4 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel
                                ,snd_hda_codec_realtek
snd_hda_core           86016  5 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel
                                ,snd_hda_codec,snd_hda_codec_realtek
snd_hwdep              20480  1 snd_hda_codec
snd_pcm               102400  4 snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda
                                _core
snd_seq_midi           20480  0
snd_seq_midi_event     16384  1 snd_seq_midi
dcdbas                 20480  0
snd_rawmidi            36864  1 snd_seq_midi
snd_seq                69632  2 snd_seq_midi,snd_seq_midi_event
coretemp               20480  0
snd_seq_device         16384  3 snd_seq,snd_seq_midi,snd_rawmidi
snd_timer              36864  2 snd_seq,snd_pcm
kvm_intel             241664  0
kvm                   626688  1 kvm_intel
radeon               1454080  10
irqbypass              16384  1 kvm
joydev                 24576  0
input_leds             16384  0
ttm                   102400  1 radeon
drm_kms_helper        180224  1 radeon
drm                   475136  13 drm_kms_helper,radeon,ttm
snd                    81920  15 snd_hda_codec_generic,snd_seq,snd_seq_device,snd_hda
                                 _codec_hdmi,snd_hwdep,snd_hda_intel,snd_hda_codec,snd
                                 _hda_codec_realtek,snd_timer,snd_pcm,snd_rawmidi
i2c_algo_bit           16384  1 radeon
fb_sys_fops            16384  1 drm_kms_helper
syscopyarea            16384  1 drm_kms_helper
serio_raw              20480  0
sysfillrect            16384  1 drm_kms_helper
sysimgblt              16384  1 drm_kms_helper
soundcore              16384  1 snd
mac_hid                16384  0
sch_fq_codel           20480  2
parport_pc             40960  0
ppdev                  24576  0
lp                     20480  0
parport                53248  3 parport_pc,lp,ppdev
ip_tables              28672  0
x_tables               40960  1 ip_tables
autofs4                45056  2
raid10                 57344  0
raid456               155648  0
async_raid6_recov      24576  1 raid456
async_memcpy           20480  2 raid456,async_raid6_recov
async_pq               24576  2 raid456,async_raid6_recov
async_xor              20480  3 async_pq,raid456,async_raid6_recov
async_tx               20480  5 async_pq,async_memcpy,async_xor,raid456,async_raid6_re
                                cov
xor                    24576  1 async_xor
raid6_pq              114688  3 async_pq,raid456,async_raid6_recov
libcrc32c              16384  1 raid456
raid1                  45056  0
raid0                  24576  0
multipath              20480  0
linear                 20480  0
hid_generic            16384  0
psmouse               151552  0
i2c_i801               32768  0
pata_acpi              16384  0
lpc_ich                24576  0
usbhid                 53248  0
hid                   126976  2 usbhid,hid_generic
e1000e                245760  0
floppy                 81920  0

在上面的输出中:

  • Module 显示每个模块的名称
  • Size 显示每个模块的大小(并不是它们占的内存大小)
  • Used by 显示每个模块被使用的次数和使用它们的模块

显然,这里有很多模块。加载的模块数量取决于你的系统和版本以及正在运行的内容。我们可以这样计数:

$ lsmod | wc -l
67

要查看系统中可用的模块数(不止运行当中的),试试这个命令:

$ modprobe -c | wc -l
41272

与内核模块相关的其他命令

Linux 提供了几条用于罗列、加载及卸载、测试,以及检查模块状态的命令。

  • depmod —— 生成 modules.dep 和映射文件
  • insmod —— 一个往 Linux 内核插入模块的程序
  • lsmod —— 显示 Linux 内核中模块状态
  • modinfo —— 显示 Linux 内核模块信息
  • modprobe —— 添加或移除 Linux 内核模块
  • rmmod —— 一个从 Linux 内核移除模块的程序

显示内置的内核模块

正如前文所说,lsmod 命令是显示内核模块最方便的命令。然而,也有其他方式可以显示它们。modules.builtin 文件中列出了所有构建在内核中的模块,在 modprobe 命令尝试添加文件中的模块时会使用它。注意,以下命令中的 $(uname -r) 提供了内核版本的名称。

$ more /lib/modules/$(uname -r)/modules.builtin | head -10
kernel/arch/x86/crypto/crc32c-intel.ko
kernel/arch/x86/events/intel/intel-uncore.ko
kernel/arch/x86/platform/intel/iosf_mbi.ko
kernel/mm/zpool.ko
kernel/mm/zbud.ko
kernel/mm/zsmalloc.ko
kernel/fs/binfmt_script.ko
kernel/fs/mbcache.ko
kernel/fs/configfs/configfs.ko
kernel/fs/crypto/fscrypto.ko

你可以使用 modinfo 获得一个模块的更多细节,虽然没有对模块提供的服务的简单说明。下面输出内容中省略了冗长的签名。

$ modinfo floppy | head -16
filename:       /lib/modules/5.0.0-13-generic/kernel/drivers/block/floppy.ko
alias:          block-major-2-*
license:        GPL
author:         Alain L. Knaff
srcversion:     EBEAA26742DF61790588FD9
alias:          acpi*:PNP0700:*
alias:          pnp:dPNP0700*
depends:
retpoline:      Y
intree:         Y
name:           floppy
vermagic:       5.0.0-13-generic SMP mod_unload
sig_id:         PKCS#7
signer:
sig_key:
sig_hashalgo:   md4

你可以使用 modprobe 命令加载或卸载模块。使用下面这条命令,你可以找到特定模块关联的内核对象:

$ find /lib/modules/$(uname -r) -name floppy*
/lib/modules/5.0.0-13-generic/kernel/drivers/block/floppy.ko

如果你想要加载模块,你可以使用这个命令:

$ sudo modprobe floppy

总结

很明显,内核模块的加载和卸载非常重要。它使得 Linux 系统比使用通用内核运行时更加灵活和高效。这同样意味着你可以进行重大更改而无需重启,例如添加硬件。


via: https://www.networkworld.com/article/3391362/looking-into-linux-modules.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:LazyWolfLin 校对:wxy

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

在过去,神谕和魔法师被认为拥有发现奥秘的力量,国王和统治者们会借助他们预测未来,或者至少是听取一些建议。如今我们生活在一个痴迷于将一切事情量化的社会里,这份工作就交给数据科学家了。

数据科学家通过使用统计模型、数值分析,以及统计学之外的高级算法,结合数据库里已经存在的数据,去发掘、推断和预测尚不存在的数据(有时是关于未来的数据)。这就是为什么我们要做这么多的预测分析和规划分析。

下面是一些可以借助数据科学家回答的问题:

  1. 哪些学生有旷课倾向?每个人旷课的原因分别是什么?
  2. 哪栋房子的售价比合理价格要高或者低?一栋房子的合理价格是多少?
  3. 如何将我们的客户按照潜在的特质进行分组?
  4. 这个孩子的早熟可能会在未来引发什么问题?
  5. 我们的呼叫中心在明天早上 11 点 43 分会接收到多少次呼叫?
  6. 我们的银行是否应该向这位客户发放贷款?

请注意,这些问题的答案是在任何数据库里都查询不到的,因为它们尚不存在,需要被计算出来才行。这就是我们数据科学家从事的工作。

在这篇文章中你会学习如何将 Fedora 系统打造成数据科学家的开发环境和生产系统。其中大多数基本软件都有 RPM 软件包,但是最先进的组件目前只能通过 Python 的 pip 工具安装。

Jupyter IDE

大多数现代数据科学家使用 Python 工作。他们工作中很重要的一部分是 探索性数据分析 Exploratory Data Analysis (EDA)。EDA 是一种手动进行的、交互性的过程,包括提取数据、探索数据特征、寻找相关性、通过绘制图形进行数据可视化并理解数据的分布特征,以及实现原型预测模型。

Jupyter 是能够完美胜任该工作的一个 web 应用。Jupyter 使用的 Notebook 文件支持富文本,包括渲染精美的数学公式(得益于 mathjax)、代码块和代码输出(包括图形输出)。

Notebook 文件的后缀是 .ipynb,意思是“交互式 Python Notebook”。

搭建并运行 Jupyter

首先,使用 sudo 安装 Jupyter 核心软件包:

$ sudo dnf install python3-notebook mathjax sscg

你或许需要安装数据科学家常用的一些附加可选模块:

$ sudo dnf install python3-seaborn python3-lxml python3-basemap python3-scikit-image python3-scikit-learn python3-sympy python3-dask+dataframe python3-nltk

设置一个用来登录 Notebook 的 web 界面的密码,从而避免使用冗长的令牌。你可以在终端里任何一个位置运行下面的命令:

$ mkdir -p $HOME/.jupyter
$ jupyter notebook password

然后输入你的密码,这时会自动创建 $HOME/.jupyter/jupyter_notebook_config.json 这个文件,包含了你的密码的加密后版本。

接下来,通过使用 SSLby 为 Jupyter 的 web 服务器生成一个自签名的 HTTPS 证书:

$ cd $HOME/.jupyter; sscg

配置 Jupyter 的最后一步是编辑 $HOME/.jupyter/jupyter_notebook_config.json 这个文件。按照下面的模版编辑该文件:

{
   "NotebookApp": {
     "password": "sha1:abf58...87b",
     "ip": "*",
     "allow_origin": "*",
     "allow_remote_access": true,
     "open_browser": false,
     "websocket_compression_options": {},
     "certfile": "/home/aviram/.jupyter/service.pem",
     "keyfile": "/home/aviram/.jupyter/service-key.pem",
     "notebook_dir": "/home/aviram/Notebooks"
   }
}

/home/aviram/ 应该替换为你的文件夹。sha1:abf58...87b 这个部分在你创建完密码之后就已经自动生成了。service.pemservice-key.pemsscg 生成的和加密相关的文件。

接下来创建一个用来存放 Notebook 文件的文件夹,应该和上面配置里 notebook_dir 一致:

$ mkdir $HOME/Notebooks

你已经完成了配置。现在可以在系统里的任何一个地方通过以下命令启动 Jupyter Notebook:

$ jupyter notebook

或者是将下面这行代码添加到 $HOME/.bashrc 文件,创建一个叫做 jn 的快捷命令:

alias jn='jupyter notebook'

运行 jn 命令之后,你可以通过网络内部的任何一个浏览器访问 <https://your-fedora-host.com:8888> (LCTT 译注:请将域名替换为服务器的域名),就可以看到 Jupyter 的用户界面了,需要使用前面设置的密码登录。你可以尝试键入一些 Python 代码和标记文本,看起来会像下面这样:

Jupyter with a simple notebook

除了 IPython 环境,安装过程还会生成一个由 terminado 提供的基于 web 的 Unix 终端。有人觉得这很实用,也有人觉得这样不是很安全。你可以在配置文件里禁用这个功能。

JupyterLab:下一代 Jupyter

JupyterLab 是下一代的 Jupyter,拥有更好的用户界面和对工作空间更强的操控性。在写这篇文章的时候 JupyterLab 还没有可用的 RPM 软件包,但是你可以使用 pip 轻松完成安装:

$ pip3 install jupyterlab --user
$ jupyter serverextension enable --py jupyterlab

然后运行 jupiter notebook 命令或者 jn 快捷命令。访问 <http://your-linux-host.com:8888/lab> (LCTT 译注:将域名替换为服务器的域名)就可以使用 JupyterLab 了。

数据科学家使用的工具

在下面这一节里,你将会了解到数据科学家使用的一些工具及其安装方法。除非另作说明,这些工具应该已经有 Fedora 软件包版本,并且已经作为前面组件所需要的软件包而被安装了。

Numpy

Numpy 是一个针对 C 语言优化过的高级库,用来处理大型的内存数据集。它支持高级多维矩阵及其运算,并且包含了 log()exp()、三角函数等数学函数。

Pandas

在我看来,正是 Pandas 成就了 Python 作为数据科学首选平台的地位。Pandas 构建在 Numpy 之上,可以让数据准备和数据呈现工作变得简单很多。你可以把它想象成一个没有用户界面的电子表格程序,但是能够处理的数据集要大得多。Pandas 支持从 SQL 数据库或者 CSV 等格式的文件中提取数据、按列或者按行进行操作、数据筛选,以及通过 Matplotlib 实现数据可视化的一部分功能。

Matplotlib

Matplotlib 是一个用来绘制 2D 和 3D 数据图像的库,在图象注解、标签和叠加层方面都提供了相当不错的支持。

matplotlib pair of graphics showing a cost function searching its optimal value through a gradient descent algorithm

Seaborn

Seaborn 构建在 Matplotlib 之上,它的绘图功能经过了优化,更加适合数据的统计学研究,比如说可以自动显示所绘制数据的近似回归线或者正态分布曲线。

Linear regression visualised with SeaBorn

StatsModels

StatsModels 为统计学和经济计量学的数据分析问题(例如线形回归和逻辑回归)提供算法支持,同时提供经典的 时间序列算法 家族 ARIMA。

Normalized number of passengers across time (blue) and ARIMA-predicted number of passengers (red)

Scikit-learn

作为机器学习生态系统的核心部件,Scikit 为不同类型的问题提供预测算法,包括 回归问题(算法包括 Elasticnet、Gradient Boosting、随机森林等等)、分类问题 和聚类问题(算法包括 K-means 和 DBSCAN 等等),并且拥有设计精良的 API。Scikit 还定义了一些专门的 Python 类,用来支持数据操作的高级技巧,比如将数据集拆分为训练集和测试集、降维算法、数据准备管道流程等等。

XGBoost

XGBoost 是目前可以使用的最先进的回归器和分类器。它并不是 Scikit-learn 的一部分,但是却遵循了 Scikit 的 API。XGBoost 并没有针对 Fedora 的软件包,但可以使用 pip 安装。使用英伟达显卡可以提升 XGBoost 算法的性能,但是这并不能通过 pip 软件包来实现。如果你希望使用这个功能,可以针对 CUDA (LCTT 译注:英伟达开发的并行计算平台)自己进行编译。使用下面这个命令安装 XGBoost:

$ pip3 install xgboost --user

Imbalanced Learn

Imbalanced-learn 是一个解决数据欠采样和过采样问题的工具。比如在反欺诈问题中,欺诈数据相对于正常数据来说数量非常小,这个时候就需要对欺诈数据进行数据增强,从而让预测器能够更好地适应数据集。使用 pip 安装:

$ pip3 install imblearn --user

NLTK

Natural Language toolkit(简称 NLTK)是一个处理人类语言数据的工具,举例来说,它可以被用来开发一个聊天机器人。

SHAP

机器学习算法拥有强大的预测能力,但并不能够很好地解释为什么做出这样或那样的预测。SHAP 可以通过分析训练后的模型来解决这个问题。

Where SHAP fits into the data analysis process

使用 pip 安装:

$ pip3 install shap --user

Keras

Keras 是一个深度学习和神经网络模型的库,使用 pip 安装:

$ sudo dnf install python3-h5py
$ pip3 install keras --user

TensorFlow

TensorFlow 是一个非常流行的神经网络模型搭建工具,使用 pip 安装:

$ pip3 install tensorflow --user

Photo courtesy of FolsomNatural on Flickr (CC BY-SA 2.0).


via: https://fedoramagazine.org/jupyter-and-data-science-in-fedora/

作者:Avi Alkalay 选题:lujun9972 译者:chen-ni 校对:wxy

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

Tig 可不仅仅是 Git 的文本界面。以下是它如何增强你的日常工作流程。

如果你使用 Git 作为你的版本控制系统,你可能已经让自己接受了 Git 是一个复杂的野兽的事实。它是一个很棒的工具,但浏览 Git 仓库可能很麻烦。因此像 Tig 这样的工具出现了。

来自 Tig 手册页

Tig 是 git(1) 的基于 ncurses 的文本界面。它主要用作 Git 仓库浏览器,但也有助于在块级别暂存提交更改,并作为各种 Git 命令的输出分页器。

这基本上意味着 Tig 提供了一个可以在终端中运行的基于文本的用户界面。Tig 可以让你轻松浏览你的 Git 日志,但它可以做的远不止让你从最后的提交跳到前一个提交。

 title=

这篇快速入门的 Tig 中的许多例子都是直接从其出色的手册页中拿出来的。我强烈建议你阅读它以了解更多信息。

安装 Tig

  • Fedora 和 RHEL: sudo dnf install tig
  • Ubuntu 和 Debian: sudo apt install tig
  • MacOS: :brew install tig

有关更多方式,请参阅官方安装说明

浏览当前分支中的提交

如果要浏览分支中的最新提交,请输入:

tig

就是这样。这个三字符命令将启动一个浏览器,你可以在其中浏览当前分支中的提交。你可以将其视为 git log 的封装器。

要浏览这些输出,可以使用向上和向下箭头键从一个提交移动到另一个提交。按回车键将会垂直分割窗口,右侧包含所选提交的内容。你可以继续在左侧的提交历史记录中上下浏览,你的更改将显示在右侧。使用 kj 可以逐行上下浏览,- 和空格键可以在右侧上下翻页。使用 q 退出右侧窗格。

搜索 tig 输出也很简单。使用 / (向前)或 ? (向后)在左右窗格中搜索。

 title=

这些就足以让你浏览你的提交信息了。这里有很多的键绑定,但单击 h 将显示“帮助”菜单,你可以在其中发现其导航和命令选项。你还可以使用 /? 来搜索“帮助”菜单。使用 q 退出帮助。

 title=

浏览单个文件的修改

由于 Tig 是 git log 的封装器,它可以方便地接受可以传递给 git log 的相同参数。例如,要浏览单个文件的提交历史记录,请输入:

tig README.md

将其与被封装的 Git 命令的输出进行比较,以便更清楚地了解 Tig 如何增强输出。

git log README.md

要在原始 Git 输出中包含补丁,你可以添加 -p 选项:

git log -p README.md

如果要将提交范围缩小到特定日期范围,请尝试以下操作:

tig --after="2017-01-01" --before="2018-05-16" -- README.md

再一次,你可以将其与原始的 Git 版本进行比较:

git log --after="2017-01-01" --before="2018-05-16" -- README.md

浏览谁更改了文件

有时你想知道谁对文件进行了更改以及原因。命令:

tig blame README.md

器本质上是 git blame 的封装。正如你所期望的那样,它允许你查看谁是编辑指定行的最后一人,它还允许你查看到引入该行的提交。这有点像 vim 的 vim-fugitive 插件提供的 :Gblame 命令。

浏览你的暂存区

如果你像我一样,你可能会在你的暂存区做了许多修改。你很容易忘记它们。你可以通过以下方式查看暂存处中的最新项目:

git stash show -p stash@{0}

你可以通过以下方式找到第二个最新项目:

git stash show -p stash@{1}

以此类推。如果你在需要它们时调用这些命令,那么你会有比我更清晰的记忆。

与上面的 Git 命令一样,Tig 可以通过简单的调用轻松增强你的 Git 输出:

tig stash

尝试在有暂存的仓库中执行此命令。你将能够浏览并搜索你的暂存项,快速浏览你的那些修改。

浏览你的引用

Git ref 是指你提交的东西的哈希值。这包括文件和分支。使用 tig refs 命令可以浏览所有的 ref 并深入查看特定提交。

tig refs

完成后,使用 q 回到前面的菜单。

浏览 git 状态

如果要查看哪些文件已被暂存,哪些文件未被跟踪,请使用 tig status,它是 git status 的封装。

 title=

浏览 git grep

你可以使用 grep 命令在文本文件中搜索表达式。命令 tig grep 允许你浏览 git grep 的输出。例如:

tig grep -i foo lib/Bar

它会让你浏览 lib/Bar 目录中以大小写敏感的方式搜索 foo 的输出。

通过标准输入管道输出给 Tig

如果要将提交 ID 列表传递给 Tig,那么必须使用 --stdin 标志,以便 tig show 从标准输入读取。否则,tig show 会在没有输入的情况下启动(出现空白屏幕)。

git rev-list --author=olaf HEAD | tig show --stdin

添加自定义绑定

你可以使用 rc 文件自定义 Tig。以下是如何根据自己的喜好添加一些有用的自定义键绑定的示例。

在主目录中创建一个名为 .tigrc 的文件。在你喜欢的编辑器中打开 ~/.tigrc 并添加:

# 应用选定的暂存内容
bind stash a !?git stash apply %(stash)

# 丢弃选定的暂存内容
bind stash x !?git stash drop %(stash)

如上所述,运行 tig stash 以浏览你的暂存。但是,通过这些绑定,你可以按 a 将暂存中的项目应用到仓库,并按 x 从暂存中删除项目。请记住,你要在浏览暂存列表时,才能执行这些命令。如果你正在浏览暂存,请输入 q 退出该视图,然后按 ax 以获得所需效果。

有关更多信息,你可以阅读有关 Tig 键绑定

总结

我希望这有助于演示 Tig 如何增强你的日常工作流程。Tig 可以做更强大的事情(比如暂存代码行),但这超出了这篇介绍性文章的范围。这里有足够的让你置身于危险的信息,但还有更多值得探索的地方。


via: https://opensource.com/article/19/6/what-tig

作者:Olaf Alders 选题:lujun9972 译者:geekpi 校对:wxy

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