分类 技术 下的文章

管理日志的一个最好做法是将你的日志集中或整合到一个地方,特别是在你有许多服务器或多层级架构时。我们将告诉你为什么这是一个好主意,然后给出如何更容易的做这件事的一些小技巧。

集中管理日志的好处

如果你有很多服务器,查看某个日志文件可能会很麻烦。现代的网站和服务经常包括许多服务器层级、分布式的负载均衡器,等等。找到正确的日志将花费很长时间,甚至要花更长时间在登录服务器的相关问题上。没什么比发现你找的信息没有被保存下来更沮丧的了,或者本该保留的日志文件正好在重启后丢失了。

集中你的日志使它们查找更快速,可以帮助你更快速的解决产品问题。你不用猜测那个服务器存在问题,因为所有的日志在同一个地方。此外,你可以使用更强大的工具去分析它们,包括日志管理解决方案。一些解决方案能转换纯文本日志为一些字段,更容易查找和分析。

集中你的日志也可以使它们更易于管理:

  • 它们更安全,当它们备份归档到一个单独区域时会有意无意地丢失。如果你的服务器宕机或者无响应,你可以使用集中的日志去调试问题。
  • 你不用担心ssh或者低效的grep命令在陷入困境的系统上需要更多的资源。
  • 你不用担心磁盘占满,这个能让你的服务器死机。
  • 你能保持你的产品服务器的安全性,只是为了查看日志无需给你所有团队登录权限。给你的团队从日志集中区域访问日志权限更安全。

随着集中日志管理,你仍需处理由于网络联通性不好或者耗尽大量网络带宽从而导致不能传输日志到中心区域的风险。在下面的章节我们将要讨论如何聪明的解决这些问题。

流行的日志归集工具

在 Linux 上最常见的日志归集是通过使用 syslog 守护进程或者日志代理。syslog 守护进程支持本地日志的采集,然后通过syslog 协议传输日志到中心服务器。你可以使用很多流行的守护进程来归集你的日志文件:

  • rsyslog 是一个轻量后台程序,在大多数 Linux 分支上已经安装。
  • syslog-ng 是第二流行的 Linux 系统日志后台程序。
  • logstash 是一个重量级的代理,它可以做更多高级加工和分析。
  • fluentd 是另一个具有高级处理能力的代理。

Rsyslog 是集中日志数据最流行的后台程序,因为它在大多数 Linux 分支上是被默认安装的。你不用下载或安装它,并且它是轻量的,所以不需要占用你太多的系统资源。

如果你需要更多先进的过滤或者自定义分析功能,如果你不在乎额外的系统负载,Logstash 是另一个最流行的选择。

配置 rsyslog.conf

既然 rsyslog 是最广泛使用的系统日志程序,我们将展示如何配置它为日志中心。它的全局配置文件位于 /etc/rsyslog.conf。它加载模块,设置全局指令,和包含位于目录 /etc/rsyslog.d 中的应用的特有的配置。目录中包含的 /etc/rsyslog.d/50-default.conf 指示 rsyslog 将系统日志写到文件。在 rsyslog 文档中你可以阅读更多相关配置。

rsyslog 配置语言是是RainerScript。你可以给日志指定输入,就像将它们输出到另外一个位置一样。rsyslog 已经配置标准输入默认是 syslog ,所以你通常只需增加一个输出到你的日志服务器。这里有一个 rsyslog 输出到一个外部服务器的配置例子。在本例中,BEBOP 是一个服务器的主机名,所以你应该替换为你的自己的服务器名。

action(type="omfwd" protocol="tcp" target="BEBOP" port="514")

你可以发送你的日志到一个有足够的存储容量的日志服务器来存储,提供查询,备份和分析。如果你存储日志到文件系统,那么你应该建立日志轮转来防止你的磁盘爆满。

作为一种选择,你可以发送这些日志到一个日志管理方案。如果你的解决方案是安装在本地你可以发送到系统文档中指定的本地主机和端口。如果你使用基于云提供商,你将发送它们到你的提供商特定的主机名和端口。

日志目录

你可以归集一个目录或者匹配一个通配符模式的所有文件。nxlog 和 syslog-ng 程序支持目录和通配符(*)。

常见的 rsyslog 不能直接监控目录。作为一种解决办法,你可以设置一个定时任务去监控这个目录的新文件,然后配置 rsyslog 来发送这些文件到目的地,比如你的日志管理系统。举个例子,日志管理提供商 Loggly 有一个开源版本的目录监控脚本

哪个协议: UDP、TCP 或 RELP?

当你使用网络传输数据时,有三个主流协议可以选择。UDP 在你自己的局域网是最常用的,TCP 用在互联网。如果你不能失去(任何)日志,就要使用更高级的 RELP 协议。

UDP 发送一个数据包,那只是一个单一的信息包。它是一个只外传的协议,所以它不会发送给你回执(ACK)。它只尝试发送包。当网络拥堵时,UDP 通常会巧妙的降级或者丢弃日志。它通常使用在类似局域网的可靠网络。

TCP 通过多个包和返回确认发送流式信息。TCP 会多次尝试发送数据包,但是受限于 TCP 缓存的大小。这是在互联网上发送送日志最常用的协议。

RELP 是这三个协议中最可靠的,但是它是为 rsyslog 创建的,而且很少有行业采用。它在应用层接收数据,如果有错误就会重发。请确认你的日志接受位置也支持这个协议。

用磁盘辅助队列可靠的传送

如果 rsyslog 在存储日志时遭遇错误,例如一个不可用网络连接,它能将日志排队直到连接还原。队列日志默认被存储在内存里。无论如何,内存是有限的并且如果问题仍然存在,日志会超出内存容量。

警告:如果你只存储日志到内存,你可能会失去数据。

rsyslog 能在内存被占满时将日志队列放到磁盘。磁盘辅助队列使日志的传输更可靠。这里有一个例子如何配置rsyslog 的磁盘辅助队列:

$WorkDirectory /var/spool/rsyslog # 暂存文件(spool)放置位置
$ActionQueueFileName fwdRule1     # 暂存文件的唯一名字前缀
$ActionQueueMaxDiskSpace 1g       # 1gb 空间限制(尽可能大)
$ActionQueueSaveOnShutdown on     # 关机时保存日志到磁盘
$ActionQueueType LinkedList       # 异步运行
$ActionResumeRetryCount -1        # 如果主机宕机,不断重试

使用 TLS 加密日志

如果你担心你的数据的安全性和隐私性,你应该考虑加密你的日志。如果你使用纯文本在互联网传输日志,嗅探器和中间人可以读到你的日志。如果日志包含私人信息、敏感的身份数据或者政府管制数据,你应该加密你的日志。rsyslog 程序能使用 TLS 协议加密你的日志保证你的数据更安全。

建立 TLS 加密,你应该做如下任务:

  1. 生成一个证书授权(CA)。在 /contrib/gnutls 有一些证书例子,可以用来测试,但是你需要为产品环境创建自己的证书。如果你正在使用一个日志管理服务,它会给你一个证书。
  2. 为你的服务器生成一个数字证书使它能启用 SSL 操作,或者使用你自己的日志管理服务提供商的一个数字证书。
  3. 配置你的 rsyslog 程序来发送 TLS 加密数据到你的日志管理系统。

这有一个 rsyslog 配置 TLS 加密的例子。替换 CERT 和 DOMAIN\_NAME 为你自己的服务器配置。

$DefaultNetstreamDriverCAFile /etc/rsyslog.d/keys/ca.d/CERT.crt
$ActionSendStreamDriver gtls
$ActionSendStreamDriverMode 1
$ActionSendStreamDriverAuthMode x509/name
$ActionSendStreamDriverPermittedPeer *.DOMAIN_NAME.com

应用日志的最佳管理方法

除 Linux 默认创建的日志之外,归集重要的应用日志也是一个好主意。几乎所有基于 Linux 的服务器应用都把它们的状态信息写入到独立、专门的日志文件中。这包括数据库产品,像 PostgreSQL 或者 MySQL,网站服务器,像 Nginx 或者 Apache,防火墙,打印和文件共享服务,目录和 DNS 服务等等。

管理员安装一个应用后要做的第一件事是配置它。Linux 应用程序典型的有一个放在 /etc 目录里 .conf 文件。它也可能在其它地方,但是那是大家找配置文件首先会看的地方。

根据应用程序有多复杂多庞大,可配置参数的数量可能会很少或者上百行。如前所述,大多数应用程序可能会在某种日志文件写它们的状态:配置文件是定义日志设置和其它东西的地方。

如果你不确定它在哪,你可以使用locate命令去找到它:

[root@localhost ~]# locate postgresql.conf
/usr/pgsql-9.4/share/postgresql.conf.sample
/var/lib/pgsql/9.4/data/postgresql.conf

设置一个日志文件的标准位置

Linux 系统一般保存它们的日志文件在 /var/log 目录下。一般是这样,但是需要检查一下应用是否保存它们在 /var/log 下的特定目录。如果是,很好,如果不是,你也许想在 /var/log 下创建一个专用目录?为什么?因为其它程序也在 /var/log 下保存它们的日志文件,如果你的应用保存超过一个日志文件 - 也许每天一个或者每次重启一个 - 在这么大的目录也许有点难于搜索找到你想要的文件。

如果在你网络里你有运行多于一个的应用实例,这个方法依然便利。想想这样的情景,你也许有一打 web 服务器在你的网络运行。当排查任何一个机器的问题时,你就很容易知道确切的位置。

使用一个标准的文件名

给你的应用最新的日志使用一个标准的文件名。这使一些事变得容易,因为你可以监控和追踪一个单独的文件。很多应用程序在它们的日志文件上追加一种时间戳。它让 rsyslog 更难于找到最新的文件和设置文件监控。一个更好的方法是使用日志轮转给老的日志文件增加时间。这样更易去归档和历史查询。

追加日志文件

日志文件会在每个应用程序重启后被覆盖吗?如果这样,我们建议关掉它。每次重启 app 后应该去追加日志文件。这样,你就可以追溯重启前最后的日志。

日志文件追加 vs. 轮转

要是应用程序每次重启后写一个新日志文件,如何保存当前日志?追加到一个单独的、巨大的文件?Linux 系统并不以频繁重启或者崩溃而出名:应用程序可以运行很长时间甚至不间歇,但是也会使日志文件非常大。如果你查询分析上周发生连接错误的原因,你可能无疑的要在成千上万行里搜索。

我们建议你配置应用每天半晚轮转(rotate)它的日志文件。

为什么?首先它将变得可管理。找一个带有特定日期的文件名比遍历一个文件中指定日期的条目更容易。文件也小的多:你不用考虑当你打开一个日志文件时 vi 僵住。第二,如果你正发送日志到另一个位置 - 也许每晚备份任务拷贝到归集日志服务器 - 这样不会消耗你的网络带宽。最后第三点,这样帮助你做日志保留。如果你想剔除旧的日志记录,这样删除超过指定日期的文件比用一个应用解析一个大文件更容易。

日志文件的保留

你保留你的日志文件多长时间?这绝对可以归结为业务需求。你可能被要求保持一个星期的日志信息,或者管理要求保持一年的数据。无论如何,日志需要在一个时刻或其它情况下从服务器删除。

在我们看来,除非必要,只在线保持最近一个月的日志文件,并拷贝它们到第二个地方如日志服务器。任何比这更旧的日志可以被转到一个单独的介质上。例如,如果你在 AWS 上,你的旧日志可以被拷贝到 Glacier。

给日志单独的磁盘分区

更好的,Linux 通常建议挂载到 /var 目录到一个单独的文件系统。这是因为这个目录的高 I/O。我们推荐挂载 /var/log 目录到一个单独的磁盘系统下。这样可以节省与主要的应用数据的 I/O 竞争。另外,如果一些日志文件变的太多,或者一个文件变的太大,不会占满整个磁盘。

日志条目

每个日志条目中应该捕获什么信息?

这依赖于你想用日志来做什么。你只想用它来排除故障,或者你想捕获所有发生的事?这是一个捕获每个用户在运行什么或查看什么的规则条件吗?

如果你正用日志做错误排查的目的,那么只保存错误,报警或者致命信息。没有理由去捕获调试信息,例如,应用也许默认记录了调试信息或者另一个管理员也许为了故障排查而打开了调试信息,但是你应该关闭它,因为它肯定会很快的填满空间。在最低限度上,捕获日期、时间、客户端应用名、来源 ip 或者客户端主机名、执行的动作和信息本身。

一个 PostgreSQL 的实例

作为一个例子,让我们看看 vanilla PostgreSQL 9.4 安装的主配置文件。它叫做 postgresql.conf,与其它Linux 系统中的配置文件不同,它不保存在 /etc 目录下。下列的代码段,我们可以在我们的 Centos 7 服务器的 /var/lib/pgsql 目录下找到它:

root@localhost ~]# vi /var/lib/pgsql/9.4/data/postgresql.conf
... 
#------------------------------------------------------------------------------
# ERROR REPORTING AND LOGGING
#------------------------------------------------------------------------------
# - Where to Log -
log_destination = 'stderr'      
      # Valid values are combinations of
      # stderr, csvlog, syslog, and eventlog,
      # depending on platform. csvlog
      # requires logging_collector to be on.
# This is used when logging to stderr:
logging_collector = on          
      # Enable capturing of stderr and csvlog
      # into log files. Required to be on for
      # csvlogs.
      # (change requires restart)
# These are only used if logging_collector is on:
log_directory = 'pg_log'       
      # directory where log files are written,
      # can be absolute or relative to PGDATA
log_filename = 'postgresql-%a.log'    # log file name pattern,
     # can include strftime() escapes
# log_file_mode = 0600           .
     # creation mode for log files,
     # begin with 0 to use octal notation
log_truncate_on_rotation = on   # If on, an existing log file with the
     # same name as the new log file will be
     # truncated rather than appended to.
     # But such truncation only occurs on
     # time-driven rotation, not on restarts
     # or size-driven rotation. Default is
     # off, meaning append to existing files
     # in all cases.
log_rotation_age = 1d           
     # Automatic rotation of logfiles will happen after that time. 0 disables.
log_rotation_size = 0           # Automatic rotation of logfiles will happen after that much log output. 0 disables.
# These are relevant when logging to syslog:
#syslog_facility = 'LOCAL0'
#syslog_ident = 'postgres'
# This is only relevant when logging to eventlog (win32):
#event_source = 'PostgreSQL'
# - When to Log -
#client_min_messages = notice   # values in order of decreasing detail:
# debug5
# debug4
# debug3
# debug2
# debug1
# log
# notice
# warning
# error
#log_min_messages = warning     # values in order of decreasing detail:
# debug5
# debug4
# debug3
# debug2
# debug1
# info
# notice
# warning
# error
# log
# fatal
# panic
#log_min_error_statement = error    # values in order of decreasing detail:
# debug5
# debug4
# debug3
# debug2
# debug1
# info
# notice
# warning
# error
# log
# fatal
# panic (effectively off)
#log_min_duration_statement = -1     # -1 is disabled, 0 logs all statements
# and their durations, > 0 logs only
# statements running at least this number
# of milliseconds
# - What to Log 
#debug_print_parse = off
#debug_print_rewritten = off
#debug_print_plan = off
#debug_pretty_print = on
#log_checkpoints = off
#log_connections = off
#log_disconnections = off
#log_duration = off
#log_error_verbosity = default    
# terse, default, or verbose messages
#log_hostname = off
log_line_prefix = '< %m >'          # special values:
# %a = application name
# %u = user name
# %d = database name
# %r = remote host and port
# %h = remote host
# %p = process ID
# %t = timestamp without milliseconds
# %m = timestamp with milliseconds
# %i = command tag
# %e = SQL state
# %c = session ID
# %l = session line number
# %s = session start timestamp
# %v = virtual transaction ID
# %x = transaction ID (0 if none)
# %q = stop here in non-session
# processes
# %% = '%'
# e.g. '<%u%%%d> '
#log_lock_waits = off               # log lock waits >= deadlock_timeout
#log_statement = 'none'             # none, ddl, mod, all
#log_temp_files = -1                # log temporary files equal or larger
# than the specified size in kilobytes;5# -1 disables, 0 logs all temp files5
log_timezone = 'Australia/ACT'

虽然大多数参数被加上了注释,它们使用了默认值。我们可以看见日志文件目录是 pglog(logdirectory 参数,在 /var/lib/pgsql/9.4/data/ 下的子目录),文件名应该以 postgresql 开头(logfilename参数),文件每天轮转一次(logrotationage 参数)然后每行日志记录以时间戳开头(loglineprefix参数)。特别值得说明的是 logline\_prefix 参数:全部的信息你都可以包含在这。

看 /var/lib/pgsql/9.4/data/pg\_log 目录下展现给我们这些文件:

[root@localhost ~]# ls -l /var/lib/pgsql/9.4/data/pg_log
total 20
-rw-------. 1 postgres postgres 1212 May 1 20:11 postgresql-Fri.log
-rw-------. 1 postgres postgres 243 Feb 9 21:49 postgresql-Mon.log
-rw-------. 1 postgres postgres 1138 Feb 7 11:08 postgresql-Sat.log
-rw-------. 1 postgres postgres 1203 Feb 26 21:32 postgresql-Thu.log
-rw-------. 1 postgres postgres 326 Feb 10 01:20 postgresql-Tue.log

所以日志文件名只有星期命名的标签。我们可以改变它。如何做?在 postgresql.conf 配置 log\_filename 参数。

查看一个日志内容,它的条目仅以日期时间开头:

[root@localhost ~]# cat /var/lib/pgsql/9.4/data/pg_log/postgresql-Fri.log
...
< 2015-02-27 01:21:27.020 EST >LOG: received fast shutdown request
< 2015-02-27 01:21:27.025 EST >LOG: aborting any active transactions
< 2015-02-27 01:21:27.026 EST >LOG: autovacuum launcher shutting down
< 2015-02-27 01:21:27.036 EST >LOG: shutting down
< 2015-02-27 01:21:27.211 EST >LOG: database system is shut down

归集应用的日志

使用 imfile 监控日志

习惯上,应用通常记录它们数据在文件里。文件容易在一个机器上寻找,但是多台服务器上就不是很恰当了。你可以设置日志文件监控,然后当新的日志被添加到文件尾部后就发送事件到一个集中服务器。在 /etc/rsyslog.d/ 里创建一个新的配置文件然后增加一个配置文件,然后输入如下:

$ModLoad imfile
$InputFilePollInterval 10
$PrivDropToGroup adm
# Input for FILE1
$InputFileName /FILE1
$InputFileTag APPNAME1
$InputFileStateFile stat-APPNAME1 #this must be unique for each file being polled
$InputFileSeverity info
$InputFilePersistStateInterval 20000
$InputRunFileMonitor

替换 FILE1 和 APPNAME1 为你自己的文件名和应用名称。rsyslog 将发送它到你配置的输出目标中。

本地套接字日志与 imuxsock

套接字类似 UNIX 文件句柄,所不同的是套接字内容是由 syslog 守护进程读取到内存中,然后发送到目的地。不需要写入文件。作为一个例子,logger 命令发送它的日志到这个 UNIX 套接字。

如果你的服务器 I/O 有限或者你不需要本地文件日志,这个方法可以使系统资源有效利用。这个方法缺点是套接字有队列大小的限制。如果你的 syslog 守护进程宕掉或者不能保持运行,然后你可能会丢失日志数据。

rsyslog 程序将默认从 /dev/log 套接字中读取,但是你需要使用如下命令来让 imuxsock 输入模块 启用它:

$ModLoad imuxsock

UDP 日志与 imupd

一些应用程序使用 UDP 格式输出日志数据,这是在网络上或者本地传输日志文件的标准 syslog 协议。你的 syslog 守护进程接受这些日志,然后处理它们或者用不同的格式传输它们。备选的,你可以发送日志到你的日志服务器或者到一个日志管理方案中。

使用如下命令配置 rsyslog 通过 UDP 来接收标准端口 514 的 syslog 数据:

$ModLoad imudp
$UDPServerRun 514

用 logrotate 管理日志

日志轮转是当日志到达指定的时期时自动归档日志文件的方法。如果不介入,日志文件一直增长,会用尽磁盘空间。最后它们将破坏你的机器。

logrotate 工具能随着日志的日期截取你的日志,腾出空间。你的新日志文件保持该文件名。你的旧日志文件被重命名加上后缀数字。每次 logrotate 工具运行,就会创建一个新文件,然后现存的文件被逐一重命名。你来决定何时旧文件被删除或归档的阈值。

当 logrotate 拷贝一个文件,新的文件会有一个新的 inode,这会妨碍 rsyslog 监控新文件。你可以通过增加copytruncate 参数到你的 logrotate 定时任务来缓解这个问题。这个参数会拷贝现有的日志文件内容到新文件然后从现有文件截短这些内容。因为日志文件还是同一个,所以 inode 不会改变;但它的内容是一个新文件。

logrotate 工具使用的主配置文件是 /etc/logrotate.conf,应用特有设置在 /etc/logrotate.d/ 目录下。DigitalOcean 有一个详细的 logrotate 教程

管理很多服务器的配置

当你只有很少的服务器,你可以登录上去手动配置。一旦你有几打或者更多服务器,你可以利用工具的优势使这变得更容易和更可扩展。基本上,所有的事情就是拷贝你的 rsyslog 配置到每个服务器,然后重启 rsyslog 使更改生效。

pssh

这个工具可以让你在很多服务器上并行的运行一个 ssh 命令。使用 pssh 部署仅用于少量服务器。如果你其中一个服务器失败,然后你必须 ssh 到失败的服务器,然后手动部署。如果你有很多服务器失败,那么手动部署它们会话费很长时间。

Puppet/Chef

Puppet 和 Chef 是两个不同的工具,它们能在你的网络按你规定的标准自动的配置所有服务器。它们的报表工具可以使你了解错误情况,然后定期重新同步。Puppet 和 Chef 都有一些狂热的支持者。如果你不确定那个更适合你的部署配置管理,你可以拜读一下 InfoWorld 上这两个工具的对比

一些厂商也提供一些配置 rsyslog 的模块或者方法。这有一个 Loggly 上 Puppet 模块的例子。它提供给 rsyslog 一个类,你可以添加一个标识令牌:

node 'my_server_node.example.net' {
  # Send syslog events to Loggly
  class { 'loggly::rsyslog':
    customer_token => 'de7b5ccd-04de-4dc4-fbc9-501393600000',
  }
}

Docker

Docker 使用容器去运行应用,不依赖于底层服务。所有东西都运行在内部的容器,你可以把它想象为一个功能单元。ZDNet 有一篇关于在你的数据中心使用 Docker 的深入文章。

这里有很多方式从 Docker 容器记录日志,包括链接到一个日志容器,记录到一个共享卷,或者直接在容器里添加一个 sysllog 代理。其中最流行的日志容器叫做 logspout

供应商的脚本或代理

大多数日志管理方案提供一些脚本或者代理,可以从一个或更多服务器相对容易地发送数据。重量级代理会耗尽额外的系统资源。一些供应商像 Loggly 提供配置脚本,来使用现存的 syslog 守护进程更轻松。这有一个 Loggly 上的例子脚本,它能运行在任意数量的服务器上。


via: http://www.loggly.com/ultimate-guide/logging/managing-linux-logs/

作者:Jason Skowronski 作者:Amy Echeverri 作者:Sadequl Hussain 译者:wyangsun 校对:wxy

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

Linux 内核 4.2已经发布了。Linus Torvalds 在 lkml.org 上写到:

通过这周这么小的变动,看来在最后一周 发布 4.2 版本应该不会有问题,当然还有几个修正,但是看起来也并不需要延迟一周。 所以这就到了,而且 4.3 的合并窗口现已打开。我已经有了几个等待处理的合并请求,明天我开始处理它们,然后在适当的时候放出来。 从 rc8 以来的简短日志很小,已经附加。这个补丁也很小...

新内核 4.2 有哪些改进?:

  • 重写英特尔的x86汇编代码
  • 支持新的 ARM 板和 SoC
  • 对 F2FS 的 per-file 加密
  • AMDGPU 的内核 DRM 驱动程序
  • 对 Radeon DRM 驱动的 VCE1 视频编码支持
  • 初步支持英特尔的 Broxton Atom SoC
  • 支持 ARCv2 和 HS38 CPU 内核
  • 增加了队列自旋锁的支持
  • 许多其他的改进和驱动更新。

在 Ubuntu 中如何下载4.2内核 :

此内核版本的二进制包可供下载链接如下:

首先检查你的操作系统类型,32位(i386)的或64位(amd64)的,然后使用下面的方式依次下载并安装软件包:

  1. linux-headers-4.2.0-xxx\_all.deb
  2. linux-headers-4.2.0-xxx-generic\_xxx\_i386/amd64.deb
  3. linux-image-4.2.0-xxx-generic\_xxx\_i386/amd64.deb

安装内核后,在终端((Ctrl+Alt+T))运行sudo update-grub命令来更新 grub boot-loader。

如果你需要一个低延迟系统(例如用于录制音频),请下载并安装下面的包:

  1. linux-headers-4.2.0\_xxx\_all.deb
  2. linux-headers-4.2.0-xxx-lowlatency\_xxx\_i386/amd64.deb
  3. linux-image-4.2.0-xxx-lowlatency\_xxx\_i386/amd64.deb

对于没有图形用户界面的 Ubuntu 服务器,你可以运行下面的命令通过 wget 来逐一抓下载,并通过 dpkg 来安装:

对于64位的系统请运行:

cd /tmp/

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.2-unstable/linux-headers-4.2.0-040200_4.2.0-040200.201508301530_all.deb

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.2-unstable/linux-headers-4.2.0-040200-generic_4.2.0-040200.201508301530_amd64.deb

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.2-unstable/linux-image-4.2.0-040200-generic_4.2.0-040200.201508301530_amd64.deb

sudo dpkg -i linux-headers-4.2.0-*.deb linux-image-4.2.0-*.deb

对于32位的系统,请运行:

cd /tmp/

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.2-unstable/linux-headers-4.2.0-040200_4.2.0-040200.201508301530_all.deb

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.2-unstable/linux-headers-4.2.0-040200-generic_4.2.0-040200.201508301530_i386.deb

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.2-unstable/linux-image-4.2.0-040200-generic_4.2.0-040200.201508301530_i386.deb

sudo dpkg -i linux-headers-4.2.0-*.deb linux-image-4.2.0-*.deb

最后,重新启动计算机才能生效。

要恢复或删除旧的内核,请参阅通过脚本安装内核


via: http://ubuntuhandbook.org/index.php/2015/08/upgrade-kernel-4-2-ubuntu/

作者:Ji m 译者:strugglingyouth 校对:wxy

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

问题 我试着为我的Open vSwitch部署排障,鉴于此,我想要检查它的由内建日志机制生成的调试信息。我怎样才能启用Open vSwitch的日志功能,并且修改它的日志等级(如,修改成INFO/DEBUG级别)以便于检查更多详细的调试信息呢?

Open vSwitch(OVS)是Linux平台上最流行的开源的虚拟交换机。由于当今的数据中心日益依赖于软件定义网络(SDN)架构,OVS被作为数据中心的SDN部署中的事实标准上的网络元素而得到飞速应用。

Open vSwitch具有一个内建的日志机制,它称之为VLOG。VLOG工具允许你在各种网络交换组件中启用并自定义日志,由VLOG生成的日志信息可以被发送到一个控制台、syslog以及一个便于查看的单独日志文件。你可以通过一个名为ovs-appctl的命令行工具在运行时动态配置OVS日志。

这里为你演示如何使用ovs-appctl启用Open vSwitch中的日志功能,并进行自定义。

下面是ovs-appctl自定义VLOG的语法。

$ sudo ovs-appctl vlog/set module[:facility[:level]] 
  • Module:OVS中的任何合法组件的名称(如netdev,ofproto,dpif,vswitchd等等)
  • Facility:日志信息的目的地(必须是:console,syslog,或者file)
  • Level:日志的详细程度(必须是:emer,err,warn,info,或者dbg)

在OVS源代码中,模块名称在源文件中是以以下格式定义的:

VLOG_DEFINE_THIS_MODULE(<module-name>);

例如,在lib/netdev.c中,你可以看到:

VLOG_DEFINE_THIS_MODULE(netdev);

这个表明,lib/netdev.c是netdev模块的一部分,任何在lib/netdev.c中生成的日志信息将属于netdev模块。

在OVS源代码中,有多个严重度等级用于定义几个不同类型的日志信息:VLOGINFO()用于报告,VLOGWARN()用于警告,VLOGERR()用于错误提示,VLOGDBG()用于调试信息,VLOG\_EMERG用于紧急情况。日志等级和工具确定哪个日志信息发送到哪里。

要查看可用模块、工具和各自日志级别的完整列表,请运行以下命令。该命令必须在你启动OVS后调用。

$ sudo ovs-appctl vlog/list 

输出结果显示了用于三个场合(facility:console,syslog,file)的各个模块的调试级别。默认情况下,所有模块的日志等级都被设置为INFO。

指定任何一个OVS模块,你可以选择性地修改任何特定场合的调试级别。例如,如果你想要在控制台屏幕中查看dpif更为详细的调试信息,可以运行以下命令。

$ sudo ovs-appctl vlog/set dpif:console:dbg 

你将看到dpif模块的console工具已经将其日志等级修改为DBG,而其它两个场合syslog和file的日志级别仍然没有改变。

如果你想要修改所有模块的日志等级,你可以指定“ANY”作为模块名。例如,下面命令将修改每个模块的console的日志级别为DBG。

$ sudo ovs-appctl vlog/set ANY:console:dbg 

同时,如果你想要一次性修改所有三个场合的日志级别,你可以指定“ANY”作为场合名。例如,下面的命令将修改每个模块的所有场合的日志级别为DBG。

$ sudo ovs-appctl vlog/set ANY:ANY:dbg 

via: http://ask.xmodulo.com/enable-logging-open-vswitch.html

作者:Dan Nanni 译者:GOLinux 校对:wxy

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

RHCSA (红帽认证系统工程师) 是由 RedHat 公司举行的认证考试,这家公司给商业公司提供开源操作系统和软件,除此之外,还为这些企业和机构提供支持、训练以及咨询服务等。

RHCSA Exam Guide

RHCSA 考试准备指南

RHCSA 考试(考试编号 EX200)通过后可以获取由 RedHat 公司颁发的证书. RHCSA 考试是 RHCT(红帽认证技师)的升级版,而且 RHCSA 必须在新的 Red Hat Enterprise Linux(红帽企业版)下完成。RHCT 和 RHCSA 的主要变化就是 RHCT 基于 RHEL5,而 RHCSA 基于 RHEL6 或者7,这两个认证的等级也有所不同。

红帽认证管理员最起码可以在红帽企业版的环境下执行如下系统管理任务:

  • 理解并会使用命令管理文件、目录、命令行以及系统/软件包的文档
  • 在不同的启动等级操作运行中的系统,识别和控制进程,启动或停止虚拟机
  • 使用分区和逻辑卷管理本地存储
  • 创建并且配置本地文件系统和网络文件系统,设置他们的属性(权限、加密、访问控制表)
  • 部署、配置、并且控制系统,包括安装、升级和卸载软件
  • 管理系统用户和组,以及使用集中制的 LDAP 目录进行用户验证
  • 确保系统安全,包括基础的防火墙规则和 SELinux 配置

关于你所在国家的考试注册和费用请参考 RHCSA 认证页面

在这个有15章的 RHCSA(红帽认证管理员)备考系列中,我们将覆盖以下的关于红帽企业 Linux 第七版的最新的信息:

在第一章,我们讲解如何在终端或者 Shell 窗口输入和运行正确的命令,并且讲解如何找到、查阅,以及使用系统文档。

RHCSA: Reviewing Essential Linux Commands – Part 1

RHCSA:回顾必会的 Linux 命令 - 第一部分

前提:

至少你要熟悉如下命令

在这篇文章中你将会找到更多的关于如何更好的使用他们的正确用法和特殊用法.

虽然没有严格的要求,但是作为讨论常用的 Linux 命令和在 Linux 中搜索信息方法,你应该安装 RHEL7 来尝试使用文章中提到的命令。这将会使你学习起来更省力。

使用 Shell 进行交互

如果我们使用文本模式登录 Linux,我们就会直接进入到我们的默认 shell 中。另一方面,如果我们使用图形化界面登录,我们必须通过启动一个终端来开启 shell。无论那种方式,我们都会看到用户提示符,并且我们可以在这里输入并且执行命令(当按下回车时,命令就会被执行)。

命令是由两个部分组成的:

  • 命令本身
  • 参数

某些参数,称为选项(通常使用一个连字符开头),会改变命令的行为方式,而另外一些则指定了命令所操作的对象。

type 命令可以帮助我们识别某一个特定的命令是由 shell 内置的还是由一个单独的包提供的。这样的区别在于我们能够在哪里找到更多关于该命令的更多信息。对 shell 内置的命令,我们需要看 shell 的手册页;如果是其他的,我们需要看软件包自己的手册页。

Check Shell built in Commands

检查Shell的内置命令

在上面的例子中, cdtype 是 shell 内置的命令,topless 是由 shell 之外的其他的二进制文件提供的(在这种情况下,type将返回命令的位置)。

其他的内置命令:

More Built in Shell Commands

其它内置命令

exec 命令

它用来运行我们指定的外部程序。请注意在多数情况下,只需要输入我们想要运行的程序的名字就行,不过exec 命令有一个特殊的特性:不是在 shell 之外创建新的进程运行,而是这个新的进程会替代原来的 shell,可以通过下列命令来验证。

# ps -ef | grep [shell 进程的PID]

当新的进程终止时,Shell 也随之终止。运行 exec top ,然后按下 q 键来退出 top,你会注意到 shell 会话也同时终止,如下面的屏幕录像展示的那样:

export 命令

给之后执行的命令的输出环境变量。

history 命令

展示数行之前的历史命令。命令编号前面前缀上感叹号可以再次执行这个命令。如果我们需要编辑历史列表中的命令,我们可以按下 Ctrl + r 并输入与命令相关的第一个字符。我们可以看到的命令会自动补全,可以根据我们目前的需要来编辑它:

命令列表会保存在一个叫 .bash_history 的文件里。history 命令是一个非常有用的用于减少输入次数的工具,特别是进行命令行编辑的时候。默认情况下,bash 保留最后输入的500个命令,不过可以通过修改 HISTSIZE 环境变量来增加:

Linux history Command

Linux history 命令

但上述变化,在我们的下一次启动不会保留。为了保持 HISTSIZE 变量的变化,我们需要通过手工修改文件编辑:

# 要设置 history 长度,请看 bash(1)文档中的 HISTSIZE 和 HISTFILESIZE
HISTSIZE=1000

重要: 我们的更改不会立刻生效,除非我们重启了 shell 。

alias 命令

没有参数或使用 -p 选项时将会以“名称=值”的标准形式输出别名列表。当提供了参数时,就会按照给定的名字和值定义一个别名。

使用 alias ,我们可以创建我们自己的命令,或使用所需的参数修改现有的命令。举个例子,假设我们将 ls 定义别名为 ls –color=auto ,这样就可以使用不同颜色输出文件、目录、链接等等。

# alias ls='ls --color=auto'

Linux alias Command

Linux 别名命令

注意: 你可以给你的“新命令”起任何的名字,并且使用单引号包括很多命令,但是你要用分号区分开它们。如下:

# alias myNewCommand='cd /usr/bin; ls; cd; clear'

exit 命令

exitlogout 命令都可以退出 shell 。exit 命令可以退出所有的 shell,logout 命令只注销登录的 shell(即你用文本模式登录时自动启动的那个)。

man 和 info 命令

如果你对某个程序有疑问,可以参考它的手册页,可以使用 man 命令调出它。此外,还有一些关于重要文件(inittab、fstab、hosts 等等)、库函数、shell、设备及其他功能的手册页。

举例:

  • man uname (输出系统信息,如内核名称、处理器、操作系统类型、架构等)
  • man inittab (初始化守护进程的设置)

另外一个重要的信息的来源是由 info 命令提供的,info 命令常常被用来读取 info 文件。这些文件往往比手册页 提供了更多信息。可以通过 info keyword 调用某个命令的信息:

# info ls
# info cut

另外,在 /usr/share/doc 文件夹包含了大量的子目录,里面可以找到大量的文档。它们是文本文件或其他可读格式。

你要习惯于使用这三种方法去查找命令的信息。重点关注每个命令文档中介绍的详细的语法。

使用 expand 命令把制表符转换为空格

有时候文本文档包含了制表符,但是程序无法很好的处理。或者我们只是简单的希望将制表符转换成空格。这就是用到 expand 地方(由GNU核心组件包提供) 。

举个例子,我们有个文件 NumberList.txt,让我们使用 expand 处理它,将制表符转换为一个空格,并且显示在标准输出上。

# expand --tabs=1 NumbersList.txt

Linux expand Command

Linux expand 命令

unexpand命令可以实现相反的功能(将空格转为制表符)

使用 head 输出文件首行及使用 tail 输出文件尾行

通常情况下,head 命令后跟着文件名时,将会输出该文件的前十行,我们可以通过 -n 参数来自定义具体的行数。

# head -n3 /etc/passwd
# tail -n3 /etc/passwd

Linux head and tail Command

Linux 的 head 和 tail 命令

tail 最有意思的一个特性就是能够显示增长的输入文件(tail -f my.log,my.log 是我们需要监视的文件。)这在我们监控一个持续增加的日志文件时非常有用。

使用 paste 按行合并文本文件

paste 命令一行一行的合并文件,默认会以制表符来区分每个文件的行,或者你可以自定义的其它分隔符。(下面的例子就是输出中的字段使用等号分隔)。

# paste -d= file1 file2

Merge Files in Linux

Linux 中的 merge 命令

使用 split 命令将文件分块

split 命令常常用于把一个文件切割成两个或多个由我们自定义的前缀命名的文件。可以根据大小、区块、行数等进行切割,生成的文件会有一个数字或字母的后缀。在下面的例子中,我们将切割 bash.pdf ,每个文件 50KB (-b 50KB),使用数字后缀 (-d):

# split -b 50KB -d bash.pdf bash_

Split Files in Linux

在 Linux 下切割文件

你可以使用如下命令来合并这些文件,生成原来的文件:

# cat bash_00 bash_01 bash_02 bash_03 bash_04 bash_05 > bash.pdf

使用 tr 命令替换字符

tr 命令多用于一对一的替换(改变)字符,或者使用字符范围。和之前一样,下面的实例我们将使用之前的同样文件file2,我们将做:

  • 小写字母 o 变成大写
  • 所有的小写字母都变成大写字母
cat file2 | tr o O
cat file2 | tr [a-z] [A-Z]

Translate Characters in Linux

在 Linux 中替换字符

使用 uniq 和 sort 检查或删除重复的文字

uniq 命令可以帮我们查出或删除文件中的重复的行,默认会输出到标准输出,我们应当注意,uniq只能查出相邻的相同行,所以,uniq 往往和 sort 一起使用(sort 一般用于对文本文件的内容进行排序)

默认情况下,sort 以第一个字段(使用空格分隔)为关键字段。想要指定不同关键字段,我们需要使用 -k 参数,请注意如何使用 sortuniq 输出我们想要的字段,具体可以看下面的例子:

# cat file3
# sort file3 | uniq
# sort -k2 file3 | uniq
# sort -k3 file3 | uniq

删除文件中重复的行

删除文件中重复的行

从文件中提取文本的命令

cut 命令基于字节(-b)、字符(-c)、或者字段(-f)的数量,从输入文件(标准输入或文件)中提取到的部分将会以标准输出上。

当我们使用字段 cut 时,默认的分隔符是一个制表符,不过你可以通过 -d 参数来自定义分隔符。

# cut -d: -f1,3 /etc/passwd # 这个例子提取了第一和第三字段的文本
# cut -d: -f2-4 /etc/passwd # 这个例子提取了第二到第四字段的文本

从文件中提取文本

从文件中提取文本

注意,简洁起见,上方的两个输出的结果是截断的。

使用 fmt 命令重新格式化文件

fmt 被用于去“清理”有大量内容或行的文件,或者有多级缩进的文件。新的段落格式每行不会超过75个字符宽,你能通过 -w (width 宽度)参数改变这个设定,它可以设置行宽为一个特定的数值。

举个例子,让我们看看当我们用 fmt 显示定宽为100个字符的时候的文件 /etc/passwd 时会发生什么。再次,输出截断了。

# fmt -w100 /etc/passwd

File Reformatting in Linux

Linux 文件重新格式化

使用 pr 命令格式化打印内容

pr 分页并且在按列或多列的方式显示一个或多个文件。 换句话说,使用 pr 格式化一个文件使它打印出来时看起来更好。举个例子,下面这个命令:

# ls -a /etc | pr -n --columns=3 -h "Files in /etc"

以一个友好的排版方式(3列)输出/etc下的文件,自定义了页眉(通过 -h 选项实现)、行号(-n)。

File Formatting in Linux

Linux的文件格式化

总结

在这篇文章中,我们已经讨论了如何在 Shell 或终端以正确的语法输入和执行命令,并解释如何找到,查阅和使用系统文档。正如你看到的一样简单,这就是你成为 RHCSA 的第一大步。

如果你希望添加一些其他的你经常使用的能够有效帮你完成你的日常工作的基础命令,并愿意分享它们,请在下方留言。也欢迎提出问题。我们期待您的回复。


via: http://www.tecmint.com/rhcsa-exam-reviewing-essential-commands-system-documentation/

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

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

Linux中的文件是什么?它的文件系统又是什么?那些配置文件又在哪里?我下载好的程序保存在哪里了?在 Linux 中文件系统是标准结构的吗?好了,上图简明地阐释了Linux的文件系统的层次关系。当你苦于寻找配置文件或者二进制文件的时候,这便显得十分有用了。我在下方添加了一些解释以及例子,不过“篇幅较长,可以有空再看”。

另外一种情况便是当你在系统中获取配置以及二进制文件时,出现了不一致性问题,如果你是在一个大型组织中,或者只是一个终端用户,这也有可能会破坏你的系统(比如,二进制文件运行在旧的库文件上了)。若然你在你的Linux系统上做安全审计的话,你将会发现它很容易遭到各种攻击。所以,保持一个清洁的操作系统(无论是Windows还是Linux)都显得十分重要。

Linux的文件是什么?

对于UNIX系统来说(同样适用于Linux),以下便是对文件简单的描述:

在UNIX系统中,一切皆为文件;若非文件,则为进程

这种定义是比较正确的,因为有些特殊的文件不仅仅是普通文件(比如命名管道和套接字),不过为了让事情变的简单,“一切皆为文件”也是一个可以让人接受的说法。Linux系统也像UNIX系统一样,将文件和目录视如同物,因为目录只是一个包含了其他文件名的文件而已。程序、服务、文本、图片等等,都是文件。对于系统来说,输入和输出设备,基本上所有的设备,都被当做是文件。

题图版本历史:

  • Version 2.0 – 17-06-2015

    • – Improved: 添加标题以及版本历史
    • – Improved: 添加/srv,/meida和/proc
    • – Improved: 更新了反映当前的Linux文件系统的描述
    • – Fixed: 多处的打印错误
    • – Fixed: 外观和颜色
  • Version 1.0 – 14-02-2015

    • – Created: 基本的图表
    • – Note: 摒弃更低的版本

下载链接

以下是大图的下载地址。如果你需要其他格式,请跟原作者联系,他会尝试制作并且上传到某个地方以供下载

注意: PDF格式文件是打印的最好选择,因为它画质很高。

Linux 文件系统描述

为了有序地管理那些文件,人们习惯把这些文件当做是硬盘上的有序的树状结构,正如我们熟悉的'MS-DOS'(磁盘操作系统)就是一个例子。大的分枝包括更多的分枝,分枝的末梢是树的叶子或者普通的文件。现在我们将会以这树形图为例,但晚点我们会发现为什么这不是一个完全准确的一幅图。

目录描述
/主层次 的根,也是整个文件系统层次结构的根目录
/bin存放在单用户模式可用的必要命令二进制文件,所有用户都可用,如 cat、ls、cp等等
/boot存放引导加载程序文件,例如kernels、initrd等
/dev存放必要的设备文件,例如/dev/null
/etc存放主机特定的系统级配置文件。其实这里有个关于它名字本身意义上的的争议。在贝尔实验室的UNIX实施文档的早期版本中,/etc表示是“其他(etcetera)目录”,因为从历史上看,这个目录是存放各种不属于其他目录的文件(然而,文件系统目录标准 FSH 限定 /etc 用于存放静态配置文件,这里不该存有二进制文件)。早期文档出版后,这个目录名又重新定义成不同的形式。近期的解释中包含着诸如“可编辑文本配置”或者“额外的工具箱”这样的重定义
/etc/opt存储着新增包的配置文件 /opt/.
/etc/sgml存放配置文件,比如 catalogs,用于那些处理SGML(译者注:标准通用标记语言)的软件的配置文件
/etc/X11X Window 系统11版本的的配置文件
/etc/xml配置文件,比如catalogs,用于那些处理XML(译者注:可扩展标记语言)的软件的配置文件
/home用户的主目录,包括保存的文件,个人配置,等等
/lib/bin//sbin/中的二进制文件的必需的库文件
/lib<架构位数>备用格式的必要的库文件。 这样的目录是可选的,但如果他们存在的话肯定是有需要用到它们的程序
/media可移动的多媒体(如CD-ROMs)的挂载点。(出现于 FHS-2.3)
/mnt临时挂载的文件系统
/opt可选的应用程序软件包
/proc以文件形式提供进程以及内核信息的虚拟文件系统,在Linux中,对应进程文件系统(procfs )的挂载点
/root根用户的主目录
/sbin必要的系统级二进制文件,比如, init, ip, mount
/srv系统提供的站点特定数据
/tmp临时文件 (另见 /var/tmp). 通常在系统重启后删除
/usr二级层级存储用户的只读数据; 包含(多)用户主要的公共文件以及应用程序
/usr/bin非必要的命令二进制文件 (在单用户模式中不需要用到的);用于所有用户
/usr/include标准的包含文件
/usr/lib库文件,用于/usr/bin//usr/sbin/中的二进制文件
/usr/lib<架构位数>备用格式库(可选的)
/usr/local三级层次 用于本地数据,具体到该主机上的。通常会有下一个子目录, 比如, bin/, lib/, share/.
/usr/local/sbin非必要系统的二进制文件,比如用于不同网络服务的守护进程
/usr/share架构无关的 (共享) 数据.
/usr/src源代码,比如内核源文件以及与它相关的头文件
/usr/X11R6X Window系统,版本号:11,发行版本:6
/var各式各样的(Variable)文件,一些随着系统常规操作而持续改变的文件就放在这里,比如日志文件,脱机文件,还有临时的电子邮件文件
/var/cache应用程序缓存数据. 这些数据是由耗时的I/O(输入/输出)的或者是运算本地生成的结果。这些应用程序是可以重新生成或者恢复数据的。当没有数据丢失的时候,可以删除缓存文件
/var/lib状态信息。这些信息随着程序的运行而不停地改变,比如,数据库,软件包系统的元数据等等
/var/lock锁文件。这些文件用于跟踪正在使用的资源
/var/log日志文件。包含各种日志。
/var/mail内含用户邮箱的相关文件
/var/opt来自附加包的各种数据都会存储在 /var/opt/.
/var/run存放当前系统上次启动以来的相关信息,例如当前登入的用户以及当前运行的daemons(守护进程).
/var/spool该spool主要用于存放将要被处理的任务,比如打印队列以及邮件外发队列
/var/mail过时的位置,用于放置用户邮箱文件
/var/tmp存放重启后保留的临时文件

Linux的文件类型

大多数文件仅仅是普通文件,他们被称为regular文件;他们包含普通数据,比如,文本、可执行文件、或者程序、程序的输入或输出等等

虽然你可以认为“在Linux中,一切你看到的皆为文件”这个观点相当保险,但这里仍有着一些例外。

  • 目录:由其他文件组成的文件
  • 特殊文件:用于输入和输出的途径。大多数特殊文件都储存在/dev中,我们将会在后面讨论这个问题。
  • 链接文件:让文件或者目录出现在系统文件树结构上多个地方的机制。我们将详细地讨论这个链接文件。
  • (域)套接字:特殊的文件类型,和TCP/IP协议中的套接字有点像,提供进程间网络通讯,并受文件系统的访问控制机制保护。
  • 命名管道 : 或多或少有点像sockets(套接字),提供一个进程间的通信机制,而不用网络套接字协议。

现实中的文件系统

对于大多数用户和常规系统管理任务而言,“文件和目录是一个有序的类树结构”是可以接受的。然而,对于电脑而言,它是不会理解什么是树,或者什么是树结构。

每个分区都有它自己的文件系统。想象一下,如果把那些文件系统想成一个整体,我们可以构思一个关于整个系统的树结构,不过这并没有这么简单。在文件系统中,一个文件代表着一个inode(索引节点),这是一种包含着构建文件的实际数据信息的序列号:这些数据表示文件是属于谁的,还有它在硬盘中的位置。

每个分区都有一套属于他们自己的inode,在一个系统的不同分区中,可以存在有相同inode的文件。

每个inode都表示着一种在硬盘上的数据结构,保存着文件的属性,包括文件数据的物理地址。当硬盘被格式化并用来存储数据时(通常发生在初始系统安装过程,或者是在一个已经存在的系统中添加额外的硬盘),每个分区都会创建固定数量的inode。这个值表示这个分区能够同时存储各类文件的最大数量。我们通常用一个inode去映射2-8k的数据块。当一个新的文件生成后,它就会获得一个空闲的inode。在这个inode里面存储着以下信息:

  • 文件属主和组属主
  • 文件类型(常规文件,目录文件......)
  • 文件权限
  • 创建、最近一次读文件和修改文件的时间
  • inode里该信息被修改的时间
  • 文件的链接数(详见下一章)
  • 文件大小
  • 文件数据的实际地址

唯一不在inode的信息是文件名和目录。它们存储在特殊的目录文件。通过比较文件名和inode的数目,系统能够构造出一个便于用户理解的树结构。用户可以通过ls -i查看inode的数目。在硬盘上,inodes有他们独立的空间。


via: http://www.blackmoreops.com/2015/06/18/linux-file-system-hierarchy-v2-0/

译者:tnuoccalanosrep 校对:wxy

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

每个新手都会对阵列(array)这个词所代表的意思产生疑惑。阵列只是磁盘的一个集合。换句话说,我们可以称阵列为一个集合(set)或一组(group)。就像一组鸡蛋中包含6个一样。同样 RAID 阵列中包含着多个磁盘,可能是2,4,6,8,12,16等,希望你现在知道了什么是阵列。

在这里,我们将看到如何扩展现有的阵列或 RAID 组。例如,如果我们在阵列中使用2个磁盘形成一个 raid 1 集合,在某些情况,如果该组中需要更多的空间,就可以使用 mdadm -grow 命令来扩展阵列大小,只需要将一个磁盘加入到现有的阵列中即可。在说完扩展(添加磁盘到现有的阵列中)后,我们将看看如何从阵列中删除故障的磁盘。

Grow Raid Array in Linux

扩展 RAID 阵列和删除故障的磁盘

假设磁盘中的一个有问题了需要删除该磁盘,但我们需要在删除磁盘前添加一个备用磁盘来扩展该镜像,因为我们需要保存我们的数据。当磁盘发生故障时我们需要从阵列中删除它,这是这个主题中我们将要学习到的。

扩展 RAID 的特性

  • 我们可以增加(扩展)任意 RAID 集合的大小。
  • 我们可以在使用新磁盘扩展 RAID 阵列后删除故障的磁盘。
  • 我们可以扩展 RAID 阵列而无需停机。

要求

  • 为了扩展一个RAID阵列,我们需要一个已有的 RAID 组(阵列)。
  • 我们需要额外的磁盘来扩展阵列。
  • 在这里,我们使用一块磁盘来扩展现有的阵列。

在我们了解扩展和恢复阵列前,我们必须了解有关 RAID 级别和设置的基本知识。点击下面的链接了解这些。

我的服务器设置

操作系统    :   CentOS 6.5 Final
IP地址      :   192.168.0.230
主机名     :   grow.tecmintlocal.com
2 块现有磁盘   :   1 GB
1 块额外磁盘   :   1 GB

在这里,我们已有一个 RAID ,有2块磁盘,每个大小为1GB,我们现在再增加一个磁盘到我们现有的 RAID 阵列中,其大小为1GB。

扩展现有的 RAID 阵列

1、 在扩展阵列前,首先使用下面的命令列出现有的 RAID 阵列。

# mdadm --detail /dev/md0

Check Existing Raid Array

检查现有的 RAID 阵列

注意: 以上输出显示,已经有了两个磁盘在 RAID 阵列中,级别为 RAID 1。现在我们增加一个磁盘到现有的阵列里。

2、 现在让我们添加新的磁盘“sdd”,并使用fdisk命令来创建分区。

# fdisk /dev/sdd

请使用以下步骤为 /dev/sdd 创建一个新的分区。

  • n 创建新的分区。
  • 然后按 P 选择主分区。
  • 接下来选择分区号为1。
  • 只需按两次回车键选择默认值即可。
  • 然后,按 P 来打印创建好的分区。
  • L,列出所有可用的类型。
  • t 去修改分区。
  • 键入 fd 设置为 Linux 的 RAID 类型,然后按回车确认。
  • 然后再次使用p查看我们所做的更改。
  • 使用w保存更改。

Create New Partition in Linux

为 sdd 创建新的分区

3、 一旦新的 sdd 分区创建完成后,你可以使用下面的命令验证它。

# ls -l /dev/ | grep sd

Confirm sdd Partition

确认 sdd 分区

4、 接下来,在添加到阵列前先检查磁盘是否有 RAID 分区。

# mdadm --examine /dev/sdd1

Check Raid on sdd Partition

在 sdd 分区中检查 RAID

注意:以上输出显示,该盘有没有发现 super-blocks,意味着我们可以将新的磁盘添加到现有阵列。

5、 要添加新的分区 /dev/sdd1 到现有的阵列 md0,请使用以下命令。

# mdadm --manage /dev/md0 --add /dev/sdd1

Add Disk To Raid-Array

添加磁盘到 RAID 阵列

6、 一旦新的磁盘被添加后,在我们的阵列中检查新添加的磁盘。

# mdadm --detail /dev/md0

Confirm Disk Added to Raid

确认将新磁盘添加到 RAID 中

注意: 在上面的输出,你可以看到磁盘已经被添加作为备用的。在这里,我们的阵列中已经有了2个磁盘,但我们期待阵列中有3个磁盘,因此我们需要扩展阵列。

7、 要扩展阵列,我们需要使用下面的命令。

# mdadm --grow --raid-devices=3 /dev/md0

Grow Raid Array

扩展 Raid 阵列

现在我们可以看到第三块磁盘(sdd1)已被添加到阵列中,在第三块磁盘被添加后,它将从另外两块磁盘上同步数据。

# mdadm --detail /dev/md0

Confirm Raid Array

确认 Raid 阵列

注意: 对于大容量磁盘会需要几个小时来同步数据。在这里,我们使用的是1GB的虚拟磁盘,所以它非常快在几秒钟内便会完成。

从阵列中删除磁盘

8、 在数据被从其他两个磁盘同步到新磁盘sdd1后,现在三个磁盘中的数据已经相同了(镜像)。

正如我前面所说的,假定一个磁盘出问题了需要被删除。所以,现在假设磁盘sdc1出问题了,需要从现有阵列中删除。

在删除磁盘前我们要将其标记为失效,然后我们才可以将其删除。

# mdadm --fail /dev/md0 /dev/sdc1
# mdadm --detail /dev/md0

Disk Fail in Raid Array

在 RAID 阵列中模拟磁盘故障

从上面的输出中,我们清楚地看到,磁盘在下面被标记为 faulty。即使它是 faulty 的,我们仍然可以看到 raid 设备有3个,1个损坏了,状态是 degraded。

现在我们要从阵列中删除 faulty 的磁盘,raid 设备将像之前一样继续有2个设备。

# mdadm --remove /dev/md0 /dev/sdc1

Remove Disk in Raid Array

在 Raid 阵列中删除磁盘

9、 一旦故障的磁盘被删除,然后我们只能使用2个磁盘来扩展 raid 阵列了。

# mdadm --grow --raid-devices=2 /dev/md0
# mdadm --detail /dev/md0

Grow Disks in Raid Array

在 RAID 阵列扩展磁盘

从上面的输出中可以看到,我们的阵列中仅有2台设备。如果你需要再次扩展阵列,按照如上所述的同样步骤进行。如果你需要添加一个磁盘作为备用,将其标记为 spare,因此,如果磁盘出现故障时,它会自动顶上去并重建数据。

结论

在这篇文章中,我们已经看到了如何扩展现有的 RAID 集合,以及如何在重新同步已有磁盘的数据后从一个阵列中删除故障磁盘。所有这些步骤都可以不用停机来完成。在数据同步期间,系统用户,文件和应用程序不会受到任何影响。

在接下来的文章我将告诉你如何管理 RAID,敬请关注更新,不要忘了写评论。


via: http://www.tecmint.com/grow-raid-array-in-linux/

作者:Babin Lonston 译者:strugglingyouth 校对:wxy

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