分类 技术 下的文章

Yum 是 RHEL/CentOS 的一个基于 rpm 的交互式高级包管理器,用户可以用它来安装新的软件包、卸载或清除旧的/不需要的软件包。它可以自动运行系统更新,并执行依赖分析,对已安装的或可用的软件包进行查询等等。

在本文中,我们将解释如何查看 Yum 事务的历史记录,以便于了解有关安装的软件包以及从系统中所卸载/清除软件包的信息。

推荐阅读: 20 条关于 Linux 软件包管理的 Yum 命令

以下是一些如何使用 Yum 历史命令的示例。

查看完整的 Yum 历史

要查看 Yum 事务完整的历史记录,我们可以运行以下命令,然后将显示:事务 ID、执行特定操作的用户、操作发生的日期和时间、实际操作以及任何错误的附加信息与操作:

# yum history 

查看 Yum 历史

使用 Yum 查找软件包信息

history 的子命令:info/list/summary 可以将事务 ID 或包名作为参数。此外,list 子命令可以加上特殊的参数,all 表示所有的事务。

运行以下命令查看先前的历史:

# yum history list all

并且,你可以使用下面的 info 命令查看涉及指定软件包的事务详情,例如 httpd

# yum history info httpd

Yum - 查找软件包信息

发出以下命令可以获得包含 httpd 软件包的事务的摘要:

# yum history summary httpd

Yum - 查找软件包的摘要

还可以使用事务的 ID 来查找,以下命令会显示 ID 为 15 的事务的详情。

# yum history info 15

Yum - 使用 ID 查找软件包信息

使用 yum history 查找软件包事务信息

有一些用于打印某个或多个软件包事务详情的子命令。我们可以使用 package-listpackage_info 查看关于 httpd 的更多信息,例如:

# yum history package-list httpd
或
# yum history package-info httpd

Yum - 查找软件包事务信息

要得到多个软件包的记录,我们可以运行:

# yum history package-list httpd epel-release
或
# yum history packages-list httpd epel-release

Yum - 查找多个软件包的信息

使用 Yum 回滚软件包

此外,还有一些 history 的子命令可以让我们撤销/重做/回滚事务。

  1. undo - 会撤销一个指定的事务。
  2. redo - 重复一次指定的事务。
  3. rollback - 撤销指定事务之后的所有事务。

它们采用单个事务 id 或关键字 last 和从最后一个事务开始的偏移量。

例如,假设我们已经做了 60 个事务,last 是指事务 60,last-4 指向事务 56。

推荐阅读: 怎样使用 yum-utils 来维护以及加速 Yum

以上子命令是如下工作的:如果我们有 5 个事务——V,W,X,Y 和 Z,其中分别是安装各个软件包的。

# yum history undo 2    #将删除软件包 W
# yum history redo 2    #将重新安装软件包 W
# yum history rollback 2    #将删除软件包 X、 Y 和 Z

在下面的示例中,事务 2 是一个更新操作,如下所示,以下 redo 命令将重复事务 2 直到所有软件包到更新到当前时间的最新版本:

# yum history | grep -w "2"

Yum - 查找软件包事务的 ID

# yum history redo 2

用 Yum 重新更新软件包

redo 子命令同样可以在我们指定事务之前加上一些可选的参数:

  1. force-reinstall - 重新安装所有在此事务中安装的软件包(通过 yum installupgradedowngrade)。
  2. force-remove - 移除所有已经更新或回滚的软件包。
# yum history redo force-reinstall 16

Yum - 强制安装软件包

查找 Yum 历史数据库和来源信息

这些子命令为我们提供有关历史记录数据库和其它信息来源的信息:

  1. addon-info - 提供更多的信息来源。
  2. stats - 显示当前历史数据库的统计信息。
  3. sync - 使我们能够更改为所有已安装软件包存储的 rpmdb/yumdb 数据。

看一下以下的命令的子命令实际上是怎样工作的:

# yum history addon-info
# yum history stats
# yum history sync

使用 new 子命令设置新的历史文件:

# yum history new

我们可以在 yum 手册页找到关于 Yum history 命令和其它几个命令的完整信息:

# man yum

推荐阅读: 4 个使用 Yum 禁用/锁定某些软件包更新的方法

就是这么多了。在本篇指南中,我们介绍了各种 Yum history 命令,以查看 Yum 事务的详细信息。


作者简介:

Aaron Kili 是 Linux 和 F.O.S.S 的爱好者,目前任 TecMint 的作者,志向是一名 Linux 系统管理员、web 开发者。他喜欢用电脑工作,并热衷于分享知识。


via: http://www.tecmint.com/view-yum-history-to-find-packages-info/

作者:Aaron Kili 译者:OneNewLife 校对:wxy

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

这是 LXD 2.0 系列介绍文章的第七篇。

  1. LXD 入门
  2. 安装与配置
  3. 你的第一个 LXD 容器
  4. 资源控制
  5. 镜像管理
  6. 远程主机及容器迁移
  7. LXD 中的 Docker
  8. LXD 中的 LXD
  9. 实时迁移
  10. LXD 和 Juju
  11. LXD 和 OpenStack
  12. 调试,及给 LXD 做贡献

为什么在 LXD 中运行 Docker

正如我在系列的第一篇中简要介绍的,LXD 的重点是系统容器,也就是我们在容器中运行一个完全未经修改的 Linux 发行版。LXD 的所有意图和目的并不在乎容器中的负载是什么。它只是设置容器命名空间和安全策略,然后运行 /sbin/init 来生成容器,接着等待容器停止。

应用程序容器,例如由 Docker 或 Rkt 所实现的应用程序容器是非常不同的,因为它们用于分发应用程序,通常在它们内部运行单个主进程,并且比 LXD 容器生命期更短暂。

这两种容器类型不是相互排斥的,我们的确看到使用 Docker 容器来分发应用程序的价值。这就是为什么我们在过去一年中努力工作以便让 LXD 中运行 Docker 成为可能。

这意味着,使用 Ubuntu 16.04 和 LXD 2.0,您可以为用户创建容器,然后可以像正常的 Ubuntu 系统一样连接到这些容器,然后运行 Docker 来安装他们想要的服务和应用程序。

要求

要让它正常工作要做很多事情,Ubuntu 16.04 上已经包含了这些:

  • 支持 CGroup 命名空间的内核(4.4 Ubuntu 或 4.6 主线内核)
  • 使用 LXC 2.0 和 LXCFS 2.0 的 LXD 2.0
  • 一个自定义版本的 Docker(或一个用我们提交的所有补丁构建的)
  • Docker 镜像,其受限于用户命名空间限制,或者使父 LXD 容器成为特权容器(security.privileged = true

运行一个基础的 Docker 载荷

说完这些,让我们开始运行 Docker 容器!

首先你可以用下面的命令得到一个 Ubuntu 16.04 的容器:

lxc launch ubuntu-daily:16.04 docker -p default -p docker

-p default -p docker 表示 LXD 将 defaultdocker 配置文件应用于容器。default 配置文件包含基本网络配置,而 docker 配置文件告诉 LXD 加载几个必需的内核模块并为容器设置一些挂载。 docker 配置文件还支持容器嵌套。

现在让我们确保容器是最新的并安装 docker:

lxc exec docker -- apt update
lxc exec docker -- apt dist-upgrade -y
lxc exec docker -- apt install docker.io -y

就是这样!你已经安装并运行了一个 Docker 容器。

现在让我们用两个 Docker 容器开启一个基础的 web 服务:

stgraber@dakara:~$ lxc exec docker -- docker run --detach --name app carinamarina/hello-world-app
Unable to find image 'carinamarina/hello-world-app:latest' locally
latest: Pulling from carinamarina/hello-world-app
efd26ecc9548: Pull complete 
a3ed95caeb02: Pull complete 
d1784d73276e: Pull complete 
72e581645fc3: Pull complete 
9709ddcc4d24: Pull complete 
2d600f0ec235: Pull complete 
c4cf94f61cbd: Pull complete 
c40f2ab60404: Pull complete 
e87185df6de7: Pull complete 
62a11c66eb65: Pull complete 
4c5eea9f676d: Pull complete 
498df6a0d074: Pull complete 
Digest: sha256:6a159db50cb9c0fbe127fb038ed5a33bb5a443fcdd925ec74bf578142718f516
Status: Downloaded newer image for carinamarina/hello-world-app:latest
c8318f0401fb1e119e6c5bb23d1e706e8ca080f8e44b42613856ccd0bf8bfb0d

stgraber@dakara:~$ lxc exec docker -- docker run --detach --name web --link app:helloapp -p 80:5000 carinamarina/hello-world-web
Unable to find image 'carinamarina/hello-world-web:latest' locally
latest: Pulling from carinamarina/hello-world-web
efd26ecc9548: Already exists 
a3ed95caeb02: Already exists 
d1784d73276e: Already exists 
72e581645fc3: Already exists 
9709ddcc4d24: Already exists 
2d600f0ec235: Already exists 
c4cf94f61cbd: Already exists 
c40f2ab60404: Already exists 
e87185df6de7: Already exists 
f2d249ff479b: Pull complete 
97cb83fe7a9a: Pull complete 
d7ce7c58a919: Pull complete 
Digest: sha256:c31cf04b1ab6a0dac40d0c5e3e64864f4f2e0527a8ba602971dab5a977a74f20
Status: Downloaded newer image for carinamarina/hello-world-web:latest
d7b8963401482337329faf487d5274465536eebe76f5b33c89622b92477a670f

现在这两个 Docker 容器已经运行了,我们可以得到 LXD 容器的 IP 地址,并且访问它的服务了!

stgraber@dakara:~$ lxc list
+--------+---------+----------------------+----------------------------------------------+------------+-----------+
|  NAME  |  STATE  |         IPV4         |                      IPV6                    |    TYPE    | SNAPSHOTS |
+--------+---------+----------------------+----------------------------------------------+------------+-----------+
| docker | RUNNING | 172.17.0.1 (docker0) | 2001:470:b368:4242:216:3eff:fe55:45f4 (eth0) | PERSISTENT | 0         |
|        |         | 10.178.150.73 (eth0) |                                              |            |           |
+--------+---------+----------------------+----------------------------------------------+------------+-----------+

stgraber@dakara:~$ curl http://10.178.150.73
The linked container said... "Hello World!"

总结

就是这样了!在 LXD 容器中运行 Docker 容器真的很简单。

现在正如我前面提到的,并不是所有的 Docker 镜像都会像我的示例一样,这通常是因为 LXD 带来了额外的限制,特别是用户命名空间。

在这种模式下只有 Docker 的 overlayfs 存储驱动可以工作。该存储驱动有一组自己的限制,这进一步限制了在该环境中可以有多少镜像工作。

如果您的负载无法正常工作,并且您信任该 LXD 容器中的用户,你可以试下:

lxc config set docker security.privileged true
lxc restart docker

这将取消激活用户命名空间,并以特权模式运行容器。

但是请注意,在这种模式下,容器内的 root 与主机上的 root 是相同的 uid。现在有许多已知的方法让用户脱离容器,并获得主机上的 root 权限,所以你应该只有在信任你的 LXD 容器中的用户可以具有主机上的 root 权限才这样做。

额外信息

LXD 的主站在: https://linuxcontainers.org/lxd

LXD 的 GitHub 仓库: https://github.com/lxc/lxd

LXD 的邮件列表: https://lists.linuxcontainers.org

LXD 的 IRC 频道: #lxcontainers on irc.freenode.net


作者简介:我是 Stéphane Graber。我是 LXC 和 LXD 项目的领导者,目前在加拿大魁北克蒙特利尔的家所在的Canonical 有限公司担任 LXD 的技术主管。


via: https://www.stgraber.org/2016/04/13/lxd-2-0-docker-in-lxd-712/

作者:Stéphane Graber 译者:geekpi 校对:wxy

本文由 LCTT 组织翻译,Linux中国 荣誉推出

MySQL Cluster.me 开始提供基于 Galera Replication 技术的 MySQLMariaDB 集群服务。

在本文中我们将会讨论 MySQLMariaDB 集群服务的主要特性。

MySQL集群服务

MySQL 集群服务

什么是 MySQL 集群

如果你曾经疑惑过如何提升 MySQL 数据库的可靠性和可扩展性,或许你会发现其中一个解决办法就是通过基于 Galera Cluster 技术的 MySQL 集群解决方案。

这项技术使得你可以在一个或者多个数据中心的多个服务器上获得经过同步的完整 MySQL 数据副本。这可以实现数据库的高可用性 - 当你的一个或者多个数据库服务器崩溃后,仍然能够从其它剩余服务器上获得完整的服务。

需要注意的是在 MySQL 集群中需要至少 3 台服务器,因为当其中一台服务器从崩溃中恢复的时候需要从仍然存活的两台服务器中选择一个捐赠者拷贝一份数据,所以为了能够从崩溃中顺利恢复数据,必须要保证两台在线服务器以便从中恢复数据。(LCTT 译注:在捐赠者提供复制数据时,另外一台可以不停顿地提供服务)

同样,MariaDB 集群和 MySQL 集群在本质上是相同的,因为 MariaDB 是基于 MySQL 开发的一个更新、更优化的版本。

MySQL集群与Galera复制技术

MySQL 集群与 Galera 复制技术

什么是 MySQL 和 MariaDB 集群服务?

MySQL 集群服务提供了能够同时解决可靠性和可扩展性的方案。

首先,集群服务使你能够忽略任何数据中心引起的问题,并能获得高达 100% 正常运行时间的数据库高可用性。

其次,将乏味无趣的 MySQL 集群相关管理工作外包出去,能够使你更加专注于业务工作。

事实上,独立管理一个集群需要你能够完成以下所有工作:

  1. 安装和设置集群 – 这可能需要一个有经验的数据库管理员花费数小时来设置一个可用的集群。
  2. 集群监控 – 必须使用一种方案 24 * 7 监控集群运作,因为很多问题都可能发生-集群不同步、服务器崩溃、硬盘空间满等。
  3. 优化及调整集群大小 – 当你管理了很大的数据库时,调整集群大小将会是一个巨大的挑战。处理这个任务时需要格外小心。
  4. 备份管理 – 为了防止集群失败带来的危险,你需要备份集群数据。
  5. 解决问题 – 你需要一个经验丰富的工程师来对集群进行优化及解决相关问题。

但是现在你只需要通过使用 MySQLcluster.me 团队提供的 MySQL 集群服务就可以节省大量的时间和金钱。

MySQLcluster.me 提供的 MySQL 集群服务包括了哪些内容?

除了很多高可用性数据服务提供的 100% 可用性外,你还将获得如下保证:

  1. 任何时候都可以调整 MySQL 集群大小 – 你可以增加或者减少集群资源(包括 RAM、CPU、DISK)以便满足业务尖峰需求。
  2. 优化硬盘和数据库的性能 – 硬盘能够达到10000 IOPS,这对数据库操作十分重要。
  3. 数据中心选择 – 你可以选择将集群布置在哪个数据中心。当前支持的数据中心有:Digital Ocean、 Amazon AWS、 RackSpace、 Google Compute Engine。
  4. 24×7 集群服务支持 – 我们的团队能够为你集群上发生的任何问题提供支持,甚至包括对你的集群架构提供建议。
  5. 集群备份 – 我们团队会为你设置备份,这样你的集群数据能够每天备份到安全的地方。
  6. 集群监控 – 我们团队设置了自动监控以便能够及时发现你的集群出现的问题,并提供支持,哪怕你并没有在值班。

拥有自己的 MySQL 集群会有很多优势,但是需要你足够耐心和有经验才行。

MySQL Cluster 团队联系以便找到适合你的工具包.


作者简介:

我是 Ravi Saive,开发了 TecMint。电脑极客和 Linux 专家,喜欢分享关于互联网的建议和点子。我的大部分服务都运行在开源平台 Linux 上。关注我的 Twitter、Facebook 和 Google+。


via: http://www.tecmint.com/getting-started-with-mysql-clusters-as-a-service/

作者:Ravi Saive 译者:beyondworld 校对:wxy

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

设置 Linux RAID 1

配置 LINUX RAID 1 非常重要,因为它提供了冗余性。

RAID 分区拥有高级功能,如冗余和更好的性能。所以让我们来说下如何实现 RAID,以及让我们来看看不同类型的 RAID:

  • RAID 0(条带):磁盘组合在一起,形成一个更大的驱动器。这以可用性为代价提供了更好的性能。如果 RAID 中的任何一块磁盘出现故障,则整个磁盘集将无法使用。最少需要两块磁盘。
  • RAID 1(镜像):磁盘从一个复制到另一个,提供了冗余。如果一块磁盘发生故障,则另一块磁盘接管,它有另外一份原始磁盘的数据的完整副本。其缺点是写入时间慢。最少需要两块磁盘。
  • RAID 5(带奇偶校验的条带):磁盘类似于 RAID 0,并且连接在一起以形成一个大型驱动器。这里的区别是,一块磁盘用于奇偶校验位,这允许在单个磁盘发生故障时可以恢复磁盘。最少需要三块盘。

让我们继续进行 Linux RAID 1 配置。

安装 Linux RAID 1 的要求:

1、系统中应该安装了 mdam,请用下面的命令确认。

[root@rhel1 ~]# rpm -qa | grep -i mdadm
mdadm-3.2.2-9.el6.x86_64
[root@rhel1 ~]#

2、 系统应该连接了 2 块磁盘。

创建两个分区,一个磁盘一个分区(sdc、sdd),每个分区占据整块磁盘。

Disk /dev/sdc: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x67cc8cfb

Device Boot Start End Blocks Id System
/dev/sdc1 1 130 1044193+ 83 Linux

Disk /dev/sdd: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0294382b

Device Boot Start End Blocks Id System
/dev/sdd1 1 130 1044193+ 83 Linux

现在你可以用你已经创建好的两个分区来设置 RAID 1 了。你可以使用 mdadm 命令来创建 RAID 阵列。

Syntax: mdadm [options] 
Options: -a, xx Adds a disk into a current array 
-C, —create Creates a new RAID array 
-D, —detail Prints the details of an array 
-G, —grow Changes the size or shape of an active array
-f, xx Fails a disk in the array
-l, —level Specifies level (type) of RAID array to create 
-n, —raid-devices Specifies the devices in the RAID array 
-q, —quiet Species not to show output 
-S, —stop Stops an array 
-v, —verbose Provides verbose output

创建 Linux RAID 1 设备:

[root@rhel1 ~]# mdadm -Cv /dev/md0 --level=1 -n2 /dev/sdc1 /dev/sdd1
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
mdadm: size set to 1044181K
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@rhel1 ~]#

使用下列命令查看新创建的 RAID 1 设备:

[root@rhel1 ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdd1[1] sdc1[0]
1044181 blocks super 1.2 [2/2] [UU]
 
unused devices: <none>
[root@rhel1 ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdd1[1] sdc1[0]
1044181 blocks super 1.2 [2/2] [UU]
 
unused devices: <none>

使用 mdadm 命令再次确认,RAID 1 已经创建好了。

[root@rhel1 ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Dec 7 15:50:06 2016
Raid Level : raid1
Array Size : 1044181 (1019.88 MiB 1069.24 MB)
Used Dev Size : 1044181 (1019.88 MiB 1069.24 MB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
 
Update Time : Wed Dec 7 15:50:12 2016
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
 
Name : rhel1.lab.com:0 (local to host rhel1.lab.com)
UUID : d5c0f82e:4e0753e6:0b28c178:e6f75af4
Events : 17
 
Number Major Minor RaidDevice State
0 8 33 0 active sync /dev/sdc1
1 8 49 1 active sync /dev/sdd1
[root@rhel1 ~]#

使用下列命令格式化新创建的 Linux RAID 1 设备:

[root@rhel1 ~]# mkfs.ext4 /dev/md0
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65280 inodes, 261045 blocks
13052 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8160 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
 
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
 
This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

挂载 Linux RAID 1 设备:

[root@rhel1 ~]# mkdir /RAID1
[root@rhel1 ~]# mount /dev/md0 /RAID1
[root@rhel1 ~]# df -h /RAID1
Filesystem Size Used Avail Use% Mounted on
/dev/md0 1004M 18M 936M 2% /RAID1
[root@rhel1 ~]#

作者简介:

大家好!我是 Manmohan Mirkar。我很高兴见到你们!我在 10 多年前开始使用 Linux,我从来没有想过我会到今天这个地步。我的激情是帮助你们获取 Linux 知识。谢谢阅读!


via: http://www.linuxroutes.com/linux-raid-1/

作者:Manmohan Mirkar 译者:geekpi 校对:wxy

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

多数桌面版 Linux 都支持主题。GUI(LCTT 译注:图形用户界面)独有的外观或者“风格”叫做主题。用户可以改变主题让桌面看起来与众不同。通常,用户也会更改图标,然而,主题和图标包是两个独立的实体。很多人想制作他们自己的主题,因此这是一篇关于 GTK 主题的制作以及各种制作时所必需的信息的文章。

注意: 这篇文章着重讨论 GTK3,但会稍微谈一下 GTK2、Metacity 等。本文不会讨论光标和图标。

基本概念

GIMP 工具包(简称 GTK)是一个用来在多种系统上(因此造就了 GTK 的跨平台)创建图形用户界面的构件工具包。GTK(http://www.gtk.org/)通常被误认为代表“GNOME 工具包”,但实际上它代表“GIMP 工具包”,因为最初创造它是为了给 GIMP 设计用户界面。GTK 是一个用 C 语言编写的面向对象工具包(GTK 本身不是一种语言)。GTK 遵循 LGPL 协议完全开源。GTK 是一个广泛使用的图形用户界面工具包,它含有很多用于 GTK 的工具。

为 GTK 制作的主题无法用在基于 Qt 的应用上。QT 应用需要使用 Qt 主题。

主题使用层叠样式表(CSS)来生成主题样式。这里的 CSS 和网站开发者在网页上使用的相同。然而不是引用 HTML 标签,而是引用 GTK 构件的专用标签。学习 CSS 对主题开发者来说很重要。

主题存放位置

主题可能会存储在 ~/.themes 或者 /usr/share/themes 文件夹中。存放在 ~/.themes 文件夹下的主题只有此 home 文件夹的所有者可以使用。而存放在 /usr/share/themes 文件夹下的全局主题可供所有用户使用。当执行 GTK 程序时,它会按照某种确定的顺序检查可用主题文件的列表。如果没有找到主题文件,它会尝试检查列表中的下一个文件。下述文字是 GTK3 程序检查时的顺序列表。

  1. $XDG_CONFIG_HOME/gtk-3.0/gtk.css (另一写法 ~/.config/gtk-3.0/gtk.css
  2. ~/.themes/NAME/gtk-3.0/gtk.css
  3. $datadir/share/themes/NAME/gtk-3.0/gtk.css (另一写法 /usr/share/themes/name/gtk-3.0/gtk.css

注意: “NAME”代表当前主题名称。

如果有两个主题名字相同,那么存放在用户 home 文件夹(~/.themes)里的主题会被优先使用。开发者可以利用这个 GTK 主题查找算法的优势来测试存放在本地 home 文件夹的主题。

主题引擎

主题引擎是软件的一部分,用来改变图形用户界面构件的外观。引擎通过解析主题文件来了解应当绘制多少种构件。有些引擎随着主题被开发出来。每种引擎都有优点和缺点,还有些引擎添加了某些特性和特色。

从默认软件源中可以获取很多主题引擎。Debian 系的 Linux 发行版可以执行 apt-get install gtk2-engines-murrine gtk2-engines-pixbuf gtk3-engines-unico 命令来安装三种不同的引擎。很多引擎同时支持 GTK2 和 GTK3。以下述列表为例:

  • gtk2-engines-aurora - Aurora GTK2 引擎
  • gtk2-engines-pixbuf - Pixbuf GTK2 引擎
  • gtk3-engines-oxygen - 将 Oxygen 组件风格移植 GTK 的引擎
  • gtk3-engines-unico - Unico GTK3 引擎
  • gtk3-engines-xfce - 用于 Xfce 的 GTK3 引擎

创作 GTK3 主题

开发者创作 GTK3 主题时,或者从空文件着手,或者将已有的主题作为模板。从现存主题着手可能会对新手有帮助。比如,开发者可以把主题复制到用户的 home 文件夹,然后编辑这些文件。

GTK3 主题的通用格式是新建一个以主题名字命名的文件夹。然后新建一个名为 gtk-3.0 的子目录,在子目录里新建一个名为 gtk.css 的文件。在文件 gtk.css 里,使用 CSS 代码写出主题的外观。为了测试可以将主题移动到 ~/.theme 里。使用新主题并在必要时进行改进。如果有需求,开发者可以添加额外的组件,使主题支持 GTK2、Openbox、Metacity、Unity 等桌面环境。

为了阐明如何创造主题,我们会学习 Ambiance 主题,通常可以在 /usr/share/themes/Ambiance 找到它。此目录包含下面列出的子目录以及一个名为 index.theme 的文件。

  • gtk-2.0
  • gtk-3.0
  • metacity-1
  • unity

index.theme 含有元数据(比如主题的名字)和一些重要的配置(比如按钮的布局)。下面是 Ambiance 主题的 index.theme 文件内容。

[Desktop Entry]
Type=X-GNOME-Metatheme
Name=Ambiance
Comment=Ubuntu Ambiance theme
Encoding=UTF-8

[X-GNOME-Metatheme]
GtkTheme=Ambiance
MetacityTheme=Ambiance
IconTheme=ubuntu-mono-dark
CursorTheme=DMZ-White
ButtonLayout=close,minimize,maximize:
X-Ubuntu-UseOverlayScrollbars=true

gtk-2.0 目录包括支持 GTK2 的文件,比如文件 gtkrc 和文件夹 apps。文件夹 apps 包括具体程序的 GTK 配置。文件 gtkrc 是 GTK2 部分的主要 CSS 文件。下面是 /usr/share/themes/Ambiance/gtk-2.0/apps/nautilus.rc 文件的内容。

# ==============================================================================
# NAUTILUS SPECIFIC SETTINGS
# ==============================================================================

style "nautilus_info_pane" {
   bg[NORMAL] = @bg_color
}

widget_class "*Nautilus*<GtkNotebook>*<GtkEventBox>" style "nautilus_info_pane"
widget_class "*Nautilus*<GtkButton>" style "notebook_button"
widget_class "*Nautilus*<GtkButton>*<GtkLabel>" style "notebook_button"

gtk-3.0 目录里是 GTK3 的文件。GTK3 使用 gtk.css 取代了 gtkrc 作为主文件。对于 Ambiance 主题,此文件有一行 @import url("gtk-main.css");settings.ini 包含重要的主题级配置。GTK3 主题的 apps 目录和 GTK2 有同样的作用。assets 目录里有单选按钮、多选框等的图像文件。下面是 /usr/share/themes/Ambiance/gtk-3.0/gtk-main.css 的内容。

/*default color scheme */
@define-color bg_color #f2f1f0;
@define-color fg_color #4c4c4c;
@define-color base_color #ffffff;
@define-color text_color #3C3C3C;
@define-color selected_bg_color #f07746;
@define-color selected_fg_color #ffffff;
@define-color tooltip_bg_color #000000;
@define-color tooltip_fg_color #ffffff;

/* misc colors used by gtk+
 *
 * Gtk doesn't currently expand color variables for style properties. Thus,
 * gtk-widgets.css uses literal color names, but includes a comment containing
 * the name of the variable. Please remember to change values there as well
 * when changing one of the variables below.
 */
@define-color info_fg_color rgb (181, 171, 156);
@define-color info_bg_color rgb (252, 252, 189);
@define-color warning_fg_color rgb (173, 120, 41);
@define-color warning_bg_color rgb (250, 173, 61);
@define-color question_fg_color rgb (97, 122, 214);
@define-color question_bg_color rgb (138, 173, 212);
@define-color error_fg_color rgb (235, 235, 235);
@define-color error_bg_color rgb (223, 56, 44);
@define-color link_color @selected_bg_color;
@define-color success_color #4e9a06;
@define-color error_color #df382c;

/* theme common colors */
@define-color button_bg_color shade (@bg_color, 1.02); /*shade (#cdcdcd, 1.08);*/
@define-color notebook_button_bg_color shade (@bg_color, 1.02);
@define-color button_insensitive_bg_color mix (@button_bg_color, @bg_color, 0.6);
@define-color dark_bg_color #3c3b37;
@define-color dark_fg_color #dfdbd2;

@define-color backdrop_fg_color mix (@bg_color, @fg_color, 0.8);
@define-color backdrop_text_color mix (@base_color, @text_color, 0.8);
@define-color backdrop_dark_fg_color mix (@dark_bg_color, @dark_fg_color, 0.75);
/*@define-color backdrop_dark_bg_color mix (@dark_bg_color, @dark_fg_color, 0.75);*/
@define-color backdrop_selected_bg_color shade (@bg_color, 0.92);
@define-color backdrop_selected_fg_color @fg_color;

@define-color focus_color alpha (@selected_bg_color, 0.5);
@define-color focus_bg_color alpha (@selected_bg_color, 0.1);

@define-color shadow_color alpha(black, 0.5);

@define-color osd_fg_color #eeeeec;
@define-color osd_bg_color alpha(#202526, 0.7);
@define-color osd_border_color alpha(black, 0.7);

@import url("gtk-widgets-borders.css");
@import url("gtk-widgets-assets.css");
@import url("gtk-widgets.css");
@import url("apps/geary.css");
@import url("apps/unity.css");
@import url("apps/baobab.css");
@import url("apps/gedit.css");
@import url("apps/nautilus.css");
@import url("apps/gnome-panel.css");
@import url("apps/gnome-terminal.css");
@import url("apps/gnome-system-log.css");
@import url("apps/unity-greeter.css");
@import url("apps/glade.css");
@import url("apps/california.css");
@import url("apps/software-center.css");
@import url("public-colors.css");

metacity-1 文件夹含有 Metacity 窗口管理器按钮(比如“关闭窗口”按钮)的图像文件。此目录还有一个名为 metacity-theme-1.xml 的文件,包括了主题的元数据(像开发者的名字)和主题设计。然而,主题的 Metacity 部分使用 XML 文件而不是 CSS 文件。

unity 文件夹含有 Unity 按钮使用的 SVG 文件。除了 SVG 文件,这里没有其他的文件。

一些主题可能也会包含其他的目录。比如, Clearlooks-Phenix 主题有名为 openbox-3xfwm4 的文件夹。openbox-3 文件夹仅有一个 themerc 文件,声明了主题配置和外观(下面有文件示例)。xfwm4 目录含有几个 xpm 文件、几个 png 图像文件(在 png 文件夹里)、一个 README 文件,还有个包含了主题配置的 themerc 文件(就像下面看到的那样)。

/usr/share/themes/Clearlooks-Phenix/xfwm4/themerc

# Clearlooks XFWM4 by Casey Kirsle

show_app_icon=true
active_text_color=#FFFFFF
inactive_text_color=#939393
title_shadow_active=frame
title_shadow_inactive=false
button_layout=O|HMC
button_offset=2
button_spacing=2
full_width_title=true
maximized_offset=0
title_vertical_offset_active=1
title_vertical_offset_inactive=1

/usr/share/themes/Clearlooks-Phenix/openbox-3/themerc

!# Clearlooks-Evolving
!# Clearlooks as it evolves in gnome-git...
!# Last updated 09/03/10

# Fonts
# these are really halos, but who cares?

*.font: shadow=n
window.active.label.text.font:shadow=y:shadowtint=30:shadowoffset=1
window.inactive.label.text.font:shadow=y:shadowtint=00:shadowoffset=0
menu.items.font:shadow=y:shadowtint=0:shadowoffset=1

!# general stuff

border.width: 1
padding.width: 3
padding.height: 2
window.handle.width: 3
window.client.padding.width: 0
menu.overlap: 2
*.justify: center

!# lets set our damn shadows here, eh?

*.bg.highlight: 50
*.bg.shadow:  05

window.active.title.bg.highlight: 35
window.active.title.bg.shadow:  05

window.inactive.title.bg.highlight: 30
window.inactive.title.bg.shadow:  05

window.*.grip.bg.highlight: 50
window.*.grip.bg.shadow:  30

window.*.handle.bg.highlight: 50
window.*.handle.bg.shadow:  30

!# Menu settings

menu.border.color: #aaaaaa
menu.border.width: 1

menu.title.bg: solid flat
menu.title.bg.color: #E6E7E6
menu.title.text.color: #111111

menu.items.bg: Flat Solid
menu.items.bg.color: #ffffff
menu.items.text.color: #111111
menu.items.disabled.text.color: #aaaaaa

menu.items.active.bg: Flat Gradient splitvertical border

menu.items.active.bg.color: #97b8e2
menu.items.active.bg.color.splitTo: #a8c5e9

menu.items.active.bg.colorTo: #91b3de
menu.items.active.bg.colorTo.splitTo: #80a7d6
menu.items.active.bg.border.color: #4b6e99
menu.items.active.text.color: #ffffff

menu.separator.width: 1
menu.separator.padding.width: 0
menu.separator.padding.height: 3
menu.separator.color: #aaaaaa

!# set handles here and only the once?

window.*.handle.bg: Raised solid
window.*.handle.bg.color: #eaebec

window.*.grip.bg: Raised solid
window.*.grip.bg.color: #eaebec

!# Active

window.*.border.color: #585a5d

window.active.title.separator.color: #4e76a8

*.title.bg: Raised Gradient splitvertical
*.title.bg.color: #8CB0DC
*.title.bg.color.splitTo: #99BAE3
*.title.bg.colorTo: #86ABD9
*.title.bg.colorTo.splitTo: #7AA1D1

window.active.label.bg: Parentrelative
window.active.label.text.color: #ffffff

window.active.button.*.bg: Flat Gradient splitvertical Border

window.active.button.*.bg.color: #92B4DF
window.active.button.*.bg.color.splitTo: #B0CAEB
window.active.button.*.bg.colorTo: #86ABD9
window.active.button.*.bg.colorTo.splitTo: #769FD0

window.active.button.*.bg.border.color: #49678B
window.active.button.*.image.color: #F4F5F6

window.active.button.hover.bg.color: #b5d3ef
window.active.button.hover.bg.color.splitTo: #b5d3ef
window.active.button.hover.bg.colorTo: #9cbae7
window.active.button.hover.bg.colorTo.splitTo: #8caede
window.active.button.hover.bg.border.color: #4A658C
window.active.button.hover.image.color: #ffffff

window.active.button.pressed.bg: Flat solid Border
window.active.button.pressed.bg.color: #7aa1d2

window.active.button.hover.bg.border.color: #4A658C

!# inactive

!#window.inactive.border.color: #7e8285
window.inactive.title.separator.color: #96999d

window.inactive.title.bg: Raised Gradient splitvertical
window.inactive.title.bg.color: #E3E2E0
window.inactive.title.bg.color.splitTo: #EBEAE9
window.inactive.title.bg.colorTo: #DEDCDA
window.inactive.title.bg.colorTo.splitTo: #D5D3D1

window.inactive.label.bg: Parentrelative
window.inactive.label.text.color: #70747d

window.inactive.button.*.bg: Flat Gradient splitVertical Border
window.inactive.button.*.bg.color: #ffffff
window.inactive.button.*.bg.color.splitto: #ffffff
window.inactive.button.*.bg.colorTo: #F9F8F8
window.inactive.button.*.bg.colorTo.splitto: #E9E7E6
window.inactive.button.*.bg.border.color: #928F8B
window.inactive.button.*.image.color: #6D6C6C

!# osd (pop ups and what not, dock?)

osd.border.width: 1
osd.border.color:  #aaaaaa

osd.bg: flat border gradient splitvertical
osd.bg.color: #F0EFEE
osd.bg.color.splitto: #f5f5f4
osd.bg.colorTo: #EAEBEC
osd.bg.colorTo.splitto: #E7E5E4

osd.bg.border.color: #ffffff

osd.active.label.bg: parentrelative
osd.active.label.bg.color: #efefef
osd.active.label.bg.border.color: #9c9e9c
osd.active.label.text.color: #444

osd.inactive.label.bg: parentrelative
osd.inactive.label.text.color: #70747d

!# yeah whatever, this is fine anyhoo?
osd.hilight.bg: flat vertical gradient
osd.hilight.bg.color: #9ebde5
osd.hilight.bg.colorTo: #749dcf
osd.unhilight.bg: flat vertical gradient
osd.unhilight.bg.color: #BABDB6
osd.unhilight.bg.colorTo: #efefef

测试主题

在创作主题时,测试主题并且微调代码对得到想要的样子是很有帮助的。有相当的开发者想要用到“主题预览器”这样的工具。幸运的是,已经有了。

  • GTK+ Change Theme - 这个程序可以更改 GTK 主题,开发者可以用它预览主题。这个程序由一个含有很多构件的窗口组成,因此可以为主题提供一个完整的预览。要安装它,只需输入命令 apt-get install gtk-chtheme
  • GTK Theme Switch - 用户可以使用它轻松地更换用户主题。测试主题时确保打开了一些应用,方便预览效果。要安装它,只需输入命令 apt-get install gtk-theme-switch,然后在终端敲出 gtk-theme-switch2 即可运行。
  • LXappearance - 它可以更换主题,图标以及字体。
  • PyWF - 这是基于 Python 开发的一个 The Widget Factory 的替代品。可以在 http://gtk-apps.org/content/show.php/PyTWF?content=102024 获取 PyWF。
  • The Widget Factory - 这是一个古老的 GTK 预览器。要安装它,只需输入命令 apt-get install thewidgetfactory,然后在终端敲出 twf 即可运行。

主题下载

延伸阅读


via: http://www.linux.org/threads/installing-obtaining-and-making-gtk-themes.8463/

作者:DevynCJohnson 译者:fuowang 校对:wxy

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

一般来说,日志是任何故障排除过程中非常重要的一部分,但这些日志会随着时间增长。在这种情况下,我们需要手动执行日志清理以回收空间,这是一件繁琐的管理任务。为了解决这个问题,我们可以在 Linux 中配置 logrotate 程序,它可以自动执行日志文件的轮换、压缩、删除和用邮件发出。

我们可以配置 logrotate 程序,以便每个日志文件可以在每天、每周、每月或当它变得太大时处理。

logrotate 是如何工作的

默认情况下,logrotate 命令作为放在 /etc/cron.daily 中的 cron 任务,每天运行一次,它会帮助你设置一个策略,其中超过某个时间或大小的日志文件被轮换。

命令: /usr/sbin/logrotate

配置文件: /etc/logrotate.conf

这是 logrotate 的主配置文件。logrotate 还在 /etc/logrotate.d/ 中存储了特定服务的配置。确保下面的那行包含在 /etc/logrotate.conf 中,以读取特定服务日志配置。

include  /etc/logrotate.d`

logrotate 历史: /var/lib/logrotate.status

重要的 logrotate 选项:

compress             --> 压缩日志文件的所有非当前版本
daily,weekly,monthly --> 按指定计划轮换日志文件
delaycompress        --> 压缩所有版本,除了当前和下一个最近的
endscript            --> 标记 prerotate 或 postrotate 脚本的结束
errors "emailid"     --> 给指定邮箱发送错误通知
missingok            --> 如果日志文件丢失,不要显示错误
notifempty           --> 如果日志文件为空,则不轮换日志文件
olddir "dir"         --> 指定日志文件的旧版本放在 “dir” 中
postrotate           --> 引入一个在日志被轮换后执行的脚本
prerotate            --> 引入一个在日志被轮换前执行的脚本
rotate 'n'           --> 在轮换方案中包含日志的 n 个版本
sharedscripts        --> 对于整个日志组只运行一次脚本
size='logsize'       --> 在日志大小大于 logsize(例如 100K,4M)时轮换

配置

让我们为我们自己的示例日志文件 /tmp/sample_output.log 配置 logrotate。

第一步:在 /etc/logrotate.conf 中添加以下行。

/tmp/sample_output.log {
  size 1k
  create 700 root root
  rotate 4
  compress
}

在上面的配置文件中:

  • size 1k - logrotate 仅在文件大小等于(或大于)此大小时运行。
  • create - 轮换原始文件并创建具有指定权限、用户和组的新文件。
  • rotate - 限制日志文件轮转的数量。因此,这将只保留最近的 4 个轮转的日志文件。
  • compress - 这将压缩文件。

第二步:通常,你需要等待一天才能等到 logrotate 由 /etc/cron.daily 执行。除此之外,你可以用下面的命令在命令行中运行:

/usr/sbin/logrotate  /etc/logrotate.conf

在执行 logrotate 命令之前的输出:

[root@rhel1 tmp]# ls -l /tmp/
total 28
-rw-------. 1 root root 20000 Jan 1 05:23 sample_output.log

在执行 logrotate 之后的输出:

[root@rhel1 tmp]# ls -l /tmp
total 12
-rwx------. 1 root root 0 Jan 1 05:24 sample_output.log
-rw-------. 1 root root 599 Jan 1 05:24 sample_output.log-20170101.gz
[root@rhel1 tmp]#

这样就能确认 logrotate 成功实现了。


作者简介:

大家好!我是 Manmohan Mirkar。我很高兴见到你们!我在 10 多年前开始使用 Linux,我从来没有想过我会到今天这个地步。我的激情是帮助你们获取 Linux 知识。谢谢你们在这!


via: http://www.linuxroutes.com/configure-logrotate/

作者:Manmohan Mirkar 译者:geekpi 校对:wxy

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