Skip to content Skip to main navigation Skip to footer

Linux

Linux:用Grub启动ISO镜像

如果你想要使用多个Linux发行版,你没有那么多的选择。你要么安装到你的物理机或虚拟机中,要么以live模式从ISO文件启动。第二个选择,对硬盘空间需求较小,只是有点麻烦,因为你需要将ISO文件写入到U盘或CD/DVD中来启动。不过,这里还有另外一个可选的折中方案:把ISO镜像放在硬盘中,然后以live模式来启动。该方案比完全安装更省空间,而且功能也完备,这对于缓慢的虚拟机而言是个不错的替代方案。下面我将介绍怎样使用流行的Grub启动加载器来实现该方案。

Linux:用Grub启动ISO镜像
Linux:用Grub启动ISO镜像

很明显,你将需要使用到Grub,这是几乎所有现代Linux发行版都使用的。你也需要你所想用的Linux版本的ISO文件,将它下载到本地磁盘。最后,你需要知道启动分区在哪里,并怎样在Grub中描述。对于此,请使用以下命令:

# fdisk -l

带有‘*’的就是启动分区。对于我,就是/dev/sda1,用Grub语言描述就是(hd0,1)。

作为参考,sda2就是(hd0,2),sdb1就是(hd1,1),以此类推。(你明白了吧。)

我们需要编辑什么?

首先,打开/etc/default/grub并检查以下行:

#GRUB_HIDDEN_TIMEOUT=0

需要在此行前添加‘#’进行注释。

保存,然后打开/etc/grub.d/40_custom。

在该文件中,你将添加启动到ISO的参数。结构如下:

menuentry "[Entry's title in the grub screen]" {
set isofile="[path to ISO file]"
loopback loop [boot partition in Grub language]$isofile
[some specific] arguments
}

例如,如果你想要从ISO文件启动Ubuntu,那么你就是想要添加如下行到40_custom文件:

menuentry "Ubuntu 14.04 (LTS) Live Desktop amd64" {
set isofile="/boot/ubuntu-14.04-desktop-amd64.iso"
loopback loop (hd0,1)$isofile
linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=${isofile} quiet splash
initrd (loop)/casper/initrd.lz
}
Linux:用Grub启动ISO镜像
Linux:用Grub启动ISO镜像

如果你想要启动Gparted:

menuentry "GParted Live amd64" {
set isofile="/boot/gparted-live-0.18.0-2-amd64.iso"
loopback loop (hd0,1)$isofile
loopback loop $isofile
linux (loop)/live/vmlinuz boot=live config union=aufs noswap noprompt ip=frommedia toram=filesystem.squashfs findiso=${isofile}
initrd (loop)/live/initrd.img
}

或者甚至是Fedora:

menuentry "Fedora 20 Live Desktop x86_64" {
set isofile="/boot/Fedora-Live-Desktop-x86_64-20-1.iso"
loopback loop (hd0,1)$isofile
loopback loop $isofile
linux (loop)/isolinux/vmlinuz0 root=live:CDLABEL=Fedora-Live-Desktop-x86_64-20-1 rootfstype=auto ro rd.live.image quiet rhgb rd.luks=0 rd.md=0 rd.dm=0 iso-scan/filename=${isofile}
initrd (loop)/isolinux/initrd0.img
}

注意,参数可根据发行版进行修改。幸运的是,有许多地方你可以查阅到。我喜欢这个发行版,但是还有很多其它的发行版你可以启动。同时,请注意你放置ISO文件的地方。如果你的家目录被加密或者无法被访问到,你可能更喜欢将这些文件放到像例子中的启动分区。但是,请首先确保启动分区有足够的空间。

最后,不要忘了保存40_custom文件并使用以下命令来更新grub:

# sudo update-grub

以便在下次启动时看到修改。

Linux:用Grub启动ISO镜像
Linux:用Grub启动ISO镜像

接下来做什么?

想要更多东西?好吧,那就修改下参数来玩玩。你可以启动一个ISO文件,并让它持续做一些事情。例如,如果你是个彻头彻尾的妄想症患者,想要有个可以快速清除硬盘的选项,那么可以使用DBAN来进行一些设置。现在,真的要当心啊,因为此设置会清除你的硬盘,而且在启动时也没有恢复选项:

menuentry "Darik's Boot and Nuke" {
set isofile="/boot/dban.iso"
loopback loop (hd0,1)$isofile
linux (loop)/dban.bzi nuke="dwipe" silent
}

另外一个选择

menuentry "Darik's Boot and Nuke" {
set isofile="/boot/dban.iso"
loopback loop (hd0,1)$isofile
linux (loop)/dban.bzi
}

可以显示DBAN选项,让你选择清除驱动器。当心,因为它仍然十分危险

小结一下,对于ISO文件和Grub有很多事情可做:从快速live会话到一键毁灭,都可以满足你。之后,你也可以试试启动一些针对隐私方面的发行版,如Tails

你认为从Grub启动一个ISO这个主意怎样?这是不是你想要做的呢?为什么呢?请在下面留言。


via: http://xmodulo.com/boot-iso-image-from-grub.html

作者:Adrien Brochard 译者:GOLinux 校对:wxy

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

来源:https://linux.cn/article-4674-1.html

Linux:Linux有问必答:Linux 中如何安装 7zip

问题: 我需要要从 ISO 映像中获取某些文件,为此我想要使用 7zip 程序。那么我应该如何安装 7zip 软件呢,[在 Linux 发布版本上完全安装]?

7zip 是一款开源的归档应用程序,开始是为 Windows 系统而开发的。它能对多种格式的档案文件进行打包或解包处理,除了支持其原生的 7z 格式的文档外,还支持包括 XZ、GZIP、TAR、ZIP 和 BZIP2 等这些格式。 通常,7zip 也用来解压 RAR、DEB、RPM 和 ISO 等格式的文件。除了简单的归档功能,7zip 还具有支持 AES-256 算法加密以及自解压和建立多卷存档功能。在支持 POSIX 标准的系统上(Linux、Unix、BSD),原生的 7zip 程序被移植过来并被命名为 p7zip(“POSIX 7zip” 的简称)。

Linux:Linux有问必答:Linux 中如何安装 7zip
Linux:Linux有问必答:Linux 中如何安装 7zip

下面介绍如何在 Linux 中安装 7zip (或 p7zip)。

在 Debian、Ubuntu 或 Linux Mint 系统中安装 7zip

在基于的 Debian 的发布系统中存在有三种 7zip 的软件包。

  • p7zip: 包含 7zr(最小的 7zip 归档工具),仅仅只能处理原生的 7z 格式。
  • p7zip-full: 包含 7z ,支持 7z、LZMA2、XZ、ZIP、CAB、GZIP、BZIP2、ARJ、TAR、CPIO、RPM、ISO 和 DEB 格式。
  • p7zip-rar: 包含一个能解压 RAR 文件的插件。

建议安装 p7zip-full 包(不是 p7zip),因为这是最完全的 7zip 程序包,它支持很多归档格式。此外,如果您想处理 RAR 文件话,还需要安装 p7zip-rar 包,做成一个独立的插件包的原因是因为 RAR 是一种专有格式。

$ sudo apt-get install p7zip-full p7zip-rar

在 Fedora 或 CentOS/RHEL 系统中安装 7zip

基于红帽的发布系统上提供了两个 7zip 的软件包。

  • p7zip: 包含 7za 命令,支持 7z、ZIP、GZIP、CAB、ARJ、BZIP2、TAR、CPIO、RPM 和 DEB 格式。
  • p7zip-plugins: 包含 7z 命令,额外的插件,它扩展了 7za 命令(例如支持 ISO 格式的抽取)。

在 CentOS/RHEL 系统中,在运行下面命令前您需要确保 EPEL 资源库 可用,但在 Fedora 系统中就不需要额外的资源库了。

$ sudo yum install p7zip p7zip-plugins

注意,跟基于 Debian 的发布系统不同的是,基于红帽的发布系统没有提供 RAR 插件,所以您不能使用 7z 命令来抽取解压 RAR 文件。

使用 7z 创建或提取归档文件

一旦安装好 7zip 软件后,就可以使用 7z 命令来打包解包各式各样的归档文件了。7z 命令会使用不同的插件来辅助处理对应格式的归档文件。

Linux:Linux有问必答:Linux 中如何安装 7zip
Linux:Linux有问必答:Linux 中如何安装 7zip

使用 “a” 选项就可以创建一个归档文件,它可以创建 7z、XZ、GZIP、TAR、 ZIP 和 BZIP2 这几种格式的文件。如果指定的归档文件已经存在的话,它会把文件“附加”到存在的归档中,而不是覆盖原有归档文件。

$ 7z a  

使用 “e” 选项可以抽取一个归档文件,抽取出的文件会放在当前目录。抽取支持的格式比创建时支持的格式要多的多,包括 7z、XZ、GZIP、TAR、ZIP、BZIP2、LZMA2、CAB、ARJ、CPIO、RPM、ISO 和 DEB 这些格式。

$ 7z e 

解包的另外一种方式是使用 “x” 选项。和 “e” 选项不同的是,它使用的是全路径来抽取归档的内容。

$ 7z x 

要查看归档的文件列表,使用 “l” 选项。

$ 7z l 

要更新或删除归档文件,分别使用 “u” 和 “d” 选项。

$ 7z u  
$ 7z d  

要测试归档的完整性,使用:

$ 7z t 

via:http://ask.xmodulo.com/install-7zip-linux.html

译者:runningwater 校对:wxy

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

来源:https://linux.cn/article-4676-1.html

Linux:systemd-nspawn 快速指南

我目前已从 chroot(译者注:chroot可以构建类似沙盒的环境,建议各位同学先了解chroot) 迁移到 systemd-nspawn,同时我写了一篇快速指南。简单的说,我强烈建议正在使用 systemd 的用户从 chroot 转为 systemd-nspawn,因为只要你的内核配置正确的话,它几乎没有什么缺点。

想必在各大发行版中的用户对 chroot 都不陌生,而且我猜想 Gentoo 用户要时不时的使用它。

Linux:systemd-nspawn 快速指南
Linux:systemd-nspawn 快速指南

chroot 面临的挑战

大多数交互环境下,仅运行chroot还不够。通常还要挂载 /proc, /sys,另外为了确保不会出现类似“丢失 ptys”之类的错误,我们还得 bind(译者注:bind 是 mount 的一个选项) 挂载 /dev。如果你使用 tmpfs,你可能想要以 tmpfs 类型挂载新的 tmp、 var/tmp。接下来你可能还想将其他的挂载点 bind 到 chroot 中。这些都不是特别难,但是一般情况下要写一个脚本来管理它。

现在我按照日常计划执行备份操作,当然有一些不必备份的数据如 tmp 目录,或任何 bind 挂载的内容。当我配置了一个新的 chroot 后就意味着我要更新我的备份配置了,但我经常忘记这点,因为大多数时间里 chroot 挂载点并没有运行。当这些挂载点仍然存在的情况下执行备份的话,那么备份中会多出很多不需要的内容。

当 bind 挂载点包含其他挂载点时(比如挂载时使用 -rbind 选项),这种情况下 systemd 的默认处理方式略有不同。在 bind 挂载中卸载一些东西时,systemd 会将处于 bind 另一边的目录也卸载掉。想像一下,如果我卸载了 chroot 中以 bind 挂载 /dev 的某个目录后,发现主机上的 /dev/pts 与 /dev/shm 也不见了,我肯定会很吃惊。不过好像有其他方法可以避免,但是这不是我们此次讨论的重点。

Systemd-nspawn 优点

Systemd-nspawn 用于启动一个容器,并且它的最简模式就可以像 chroot 那样运行。默认情况下,它自动配置容器所需的开销如 /dev, /tmp 等等。通过配合一些选项它也可配置其他的 bind 挂载点。当容器退出后,所有的挂载点都会被清除。

容器运行时,从外部看上去没什么变化。事实上,可以从同一个 chroot 产生5个不同的 systemd-nspawn 容器实例,并且除了文件系统(不包括 /dev, /tmp等,只有 /usr,/etc 的改变会传递)外它们之间没有任何联系。你的备份将会忽略 bind 挂载点、tmpfs 及任何挂载在容器中的内容。

它同时具有其它优秀容器的优点,比如 containment – 可以杀死容器内的所有活动但不影响外部,等等。它的安全性并不是无懈可击的-它的作用仅仅是防止意外的错误。

如果你使用的是兼容的 sysvinit(它包含了 systemd,openrc),你可以启动容器。这意味着,你可以在容器中使用 fstab 添加挂载点,运行守护进程等。只需要一个 chroot 的开销,几乎就可以获得虚拟化的所有好处(不需要构建内核等)。在一个看起来像 chroot 的容器中运行systemctl poweroff 看起来很奇怪,但这条命令能够起作用。

注意,如果不做额外配置的话那么容器就会共享主机的网络,所以主机上的容器不要运行 sshd。运行一个分离的网络 namespace 不是太难,为了新的实例可以使用DHCP,分离之后记得绑定接口。

操作步骤

让它工作起来是此次讨论中最简短的部分了。

首先系统内核要支持 namespaces 与 devpts:

CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y
CONFIG_DEVPTS_MULTIPLE_INSTANCES=y

像 chroot 那样启动 namespace 是非常简单的:

systemd-nspawn -D .

也可以像 chroot 那样退出。在内部可以运行 mount 并且可以看到默认它已将 /dev 与 /tmp 准备好了。 ”.“就是 chroot 的路径,也就是当前路径。在它内部运行的是 bash。

如果要添加一些 bind 挂载点也非常简便:

systemd-nspawn -D . --bind /usr/portage

现在,容器中的 /usr/portage 就与主机的对应目录绑定起来了,我们无需 sync /etc。如果想要绑定到指定的路径,只要在原路径后添加 ”:dest“,相当于 chroot 的 root(–bind foo 与 –bind foo:foo是一样的)。

如果容器具有 init 功能并且可以在内部运行,可以通过添加 -b 选项启动它:

systemd-nspawn -D . --bind /usr/portage -b

可以观察到 init 的运作。关闭容器会自动退出。

如果容器内运行了 systemd ,你可以使用 -h 选项将它的日志重定向到主机的systemd日志:

systemd-nspawn -D . --bind /usr/portage -j -b

使用 nspawn 注册容器以便它能够在 machinectl 中显示。如此可以方便的在主机上对它进行操作,如启动新的 getty, ssh 连接,关机等。

如果你正在使用 systemd 那么甩开 chroot 拥抱 nspawn 吧。


via: http://rich0gentoo.wordpress.com/2014/07/14/quick-systemd-nspawn-guide/

作者:rich0 译者:SPccman 校对:wxy

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

来源:https://linux.cn/article-4678-1.html

Linux:如何在Ubuntu / CentOS 6.x上安装Bugzilla 4.4

这里,我们将展示如何在一台Ubuntu 14.04或CentOS 6.5/7上安装Bugzilla。Bugzilla是一款基于web,用来记录跟踪缺陷数据库的bug跟踪软件,它同时是一款免费及开源软件(FOSS),它的bug跟踪系统允许个人和开发团体有效地记录下他们产品的一些突出问题。尽管是”免费”的,Bugzilla依然有很多其它同类产品所没有的“珍贵”特性。因此,Bugzilla很快就变成了全球范围内数以千计的组织最喜欢的bug管理工具。

Bugzilla对于不同使用场景的适应能力非常强。如今它们应用在各个不同的IT领域,如系统管理中的部署管理、芯片设计及部署的问题跟踪(制造前期和后期),还有为那些诸如Redhat,NASA,Linux-Mandrake和VA Systems这些著名公司提供软硬件bug跟踪。

Linux:如何在Ubuntu / CentOS 6.x上安装Bugzilla 4.4
Linux:如何在Ubuntu / CentOS 6.x上安装Bugzilla 4.4

1. 安装依赖程序

安装Bugzilla相当简单。这篇文章特别针对Ubuntu 14.04和CentOS 6.5两个版本(不过也适用于更老的版本)。

为了获取并能在Ubuntu或CentOS系统中运行Bugzilla,我们要安装Apache网络服务器(启用SSL),MySQL数据库服务器和一些需要来安装并配置Bugzilla的工具。

要在你的服务器上安装使用Bugzilla,你需要安装好以下程序:

  • Perl(5.8.1 或以上)
  • MySQL
  • Apache2
  • Bugzilla
  • Perl模块
  • 使用apache的Bugzilla

正如我们所提到的本文会阐述Ubuntu 14.04和CentOS 6.5/7两种发行版的安装过程,为此我们会分成两部分来表示。

以下就是在你的Ubuntu 14.04 LTS和CentOS 7机器安装Bugzilla的步骤:

准备所需的依赖包:

你需要运行以下命令来安装些必要的包:

Ubuntu版本:

$ sudo apt-get install apache2 mysql-server libapache2-mod-perl2 libapache2-mod-perl2-dev libapache2-mod-perl2-doc perl postfix make gcc g++

CentOS版本:

$ sudo yum install httpd mod_ssl mysql-server mysql php-mysql gcc perl* mod_perl-devel

注意:请在shell或者终端下运行所有的命令并且确保你用root用户(sudo)操作机器。

2. 启动Apache服务

你已经按照以上步骤安装好了apache服务,那么我们现在需要配置apache服务并运行它。我们需要用sodo或root来敲命令去完成它,我们先切换到root连接。

$ sudo -s

我们需要在防火墙中打开80端口并保存改动。

# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
# service iptables save

现在,我们需要启动服务:

CentOS版本:

# service httpd start

我们来确保Apache会在每次你重启机器的时候一并启动起来:

# /sbin/chkconfig httpd on

Ubuntu版本:

# service apache2 start

现在,由于我们已经启动了我们apache的http服务,我们就能在默认的127.0.0.1地址下打开apache服务了。

3. 配置MySQL服务器

现在我们需要启动我们的MySQL服务:

CentOS版本:

# chkconfig mysqld on
# service start mysqld

Ubuntu版本:

# service mysql-server start

mysql

用root用户登录连接MySQL并给Bugzilla创建一个数据库,把你的mysql密码更改成你想要的,稍后配置Bugzilla的时候会用到它。

CentOS 6.5和Ubuntu 14.04 Trusty两个版本:

# mysql -u root -p
# password: (You'll need to enter your password)
# mysql > create database bugs;
# mysql > grant all on bugs.* to root@localhost identified by "mypassword";
#mysql > quit

注意:请记住数据库名和mysql的密码,我们稍后会用到它们。

4. 安装并配置Bugzilla

现在,我们所有需要的包已经设置完毕并运行起来了,我们就要配置我们的Bugzilla。

那么,首先我们要下载最新版的Bugzilla包,这里我下载的是4.5.2版本。

使用wget工具在shell或终端上下载:

wget http://ftp.mozilla.org/pub/mozilla.org/webtools/bugzilla-4.5.2.tar.gz

你也可以从官方网站进行下载。http://www.bugzilla.org/download/

从下载下来的bugzilla压缩包中提取文件并重命名:

# tar zxvf bugzilla-4.5.2.tar.gz -C /var/www/html/
# cd /var/www/html/
# mv -v bugzilla-4.5.2 bugzilla

注意:这里,/var/www/html/bugzilla/就是Bugzilla主目录.

现在,我们来配置buzilla:

# cd /var/www/html/bugzilla/

./checksetup.pl –check-modules

bugzilla-check-module

检查完成之后,我们会发现缺少了一些组件,我们需要安装它们,用以下命令即可实现:

# cd /var/www/html/bugzilla
# perl install-module.pl --all

这一步会花掉一点时间去下载安装所有依赖程序,然后再次运行checksetup.pl –check-modules命令来验证有没有漏装什么。

现在我们需要运行以下这条命令,它会在/var/www/html/bugzilla路径下自动生成一个名为localconfig的文件。

# ./checksetup.pl

确认一下你刚才在localconfig文件中所输入的数据库名、用户和密码是否正确。

# nano ./localconfig
# checksetup.pl

bugzilla-success

如果一切正常,checksetup.pl现在应该就成功地配置Bugzilla了。

现在我们需要添加Bugzilla至我们的Apache配置文件中。那么,我们需要用文本编辑器打开 /etc/httpd/conf/httpd.conf 文件(CentOS版本)或者 /etc/apache2/apache2.conf 文件(Ubuntu版本):

CentOS版本:

# nano /etc/httpd/conf/httpd.conf

Ubuntu版本:

# nano etc/apache2/apache2.conf

现在,我们需要配置Apache服务器,我们要把以下配置添加到配置文件里:


     DocumentRoot /var/www/html/bugzilla/


     AddHandler cgi-script .cgi
     Options +Indexes +ExecCGI
     DirectoryIndex index.cgi
     AllowOverride Limit FileInfo Indexes

接着,我们需要编辑 .htaccess 文件并用“#”注释掉顶部“Options -Indexes”这一行。

让我们重启我们的apache服务并测试下我们的安装情况。

CentOS版本:

# service httpd restart

Ubuntu版本:

# service apache2 restart
Linux:如何在Ubuntu / CentOS 6.x上安装Bugzilla 4.4
Linux:如何在Ubuntu / CentOS 6.x上安装Bugzilla 4.4

这样,我们的Bugzilla就准备好在我们的Ubuntu 14.04 LTS和CentOS 6.5上获取bug报告了,你就可以通过本地回环地址或你网页浏览器上的IP地址来浏览bugzilla了。


via: http://linoxide.com/tools/install-bugzilla-ubuntu-centos/

作者:Arun Pyasi 译者:ZTinoZ 校对:wxy

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

来源:https://linux.cn/article-4677-1.html

Linux:硬盘监控和分析工具:Smartctl

Smartctl(S.M.A.R.T 自监控,分析和报告技术)是类Unix系统下实施SMART任务命令行套件或工具,它用于打印SMART自检错误日志,启用并禁用SMRAT自动检测,以及初始化设备自检。

Smartctl对于Linux物理服务器十分有用,在这些服务器上,可以对智能磁盘进行错误检查,并将与硬件RAID相关的磁盘信息摘录下来。

在本帖中,我们将讨论smartctl命令的一些实用样例。如果你的Linux上海没有安装smartctl,请按以下步骤来安装。

Linux:硬盘监控和分析工具:Smartctl
Linux:硬盘监控和分析工具:Smartctl

安装 Smartctl

对于 Ubuntu

$ sudo apt-get install smartmontools

对于 CentOS & RHEL

# yum install smartmontools

启动Smartctl服务

对于 Ubuntu

$ sudo /etc/init.d/smartmontools start

对于 CentOS & RHEL

# service smartd start ; chkconfig smartd on

样例

样例:1 检查磁盘的 Smart 功能是否启用

root@linuxtechi:~# smartctl -i /dev/sdb
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-32-generic] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Model Family:     Seagate Momentus 5400.6
Device Model:     ST9320325AS
Serial Number:    5VD2V59T
LU WWN Device Id: 5 000c50 020a37ec4
Firmware Version: 0002BSM1
User Capacity:    320,072,933,376 bytes [320 GB]
Sector Size:      512 bytes logical/physical
Rotation Rate:    5400 rpm
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ATA8-ACS T13/1699-D revision 4
SATA Version is:  SATA 2.6, 1.5 Gb/s
Local Time is:    Sun Nov 16 12:32:09 2014 IST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

这里‘/dev/sdb’是你的硬盘。上面输出中的最后两行显示了SMART功能已启用。

样例:2 启用磁盘的 Smart 功能

root@linuxtechi:~# smartctl -s on /dev/sdb
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-32-generic] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF ENABLE/DISABLE COMMANDS SECTION ===
SMART Enabled.

样例:3 禁用磁盘的 Smart 功能

root@linuxtechi:~# smartctl -s off  /dev/sdb
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-32-generic] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF ENABLE/DISABLE COMMANDS SECTION ===
SMART Disabled. Use option -s with argument 'on' to enable it.

样例:4 显示磁盘的详细 Smart 信息

root@linuxtechi:~# smartctl -a /dev/sdb              // For IDE drive
root@linuxtechi:~# smartctl -a -d ata /dev/sdb       // For SATA drive

样例:5 显示磁盘总体健康状况

root@linuxtechi:~# smartctl -H  /dev/sdb
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-32-generic] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
Warning: This result is based on an Attribute check.
Please note the following marginal Attributes:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
190 Airflow_Temperature_Cel 0x0022   067   045   045    Old_age   Always   In_the_past 33 (Min/Max 25/33)

样例:6 使用long和short选项测试硬盘

Long测试

root@linuxtechi:~# smartctl --test=long /dev/sdb
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-32-generic] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Extended self-test routine immediately in off-line mode".
Drive command "Execute SMART Extended self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 102 minutes for test to complete.
Test will complete after Sun Nov 16 14:29:43 2014
Use smartctl -X to abort test.

或者,我们可以重定向测试输出到日志文件,就像下面这样

root@linuxtechi:~# smartctl --test=long /dev/sdb > /var/log/long.text

Short测试

root@linuxtechi:~# smartctl --test=short /dev/sdb
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-32-generic] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Short self-test routine immediately in off-line mode".
Drive command "Execute SMART Short self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 1 minutes for test to complete.
Test will complete after Sun Nov 16 12:51:45 2014
Use smartctl -X to abort test.

root@linuxtechi:~# smartctl --test=short /dev/sdb > /var/log/short.text

注意:short测试将花费最多2分钟,而在long测试中没有时间限制,因为它会读取并验证磁盘的每个段。

样例:7 查看驱动器的自检结果

root@linuxtechi:~# smartctl -l selftest /dev/sdb
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-32-generic] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed: read failure       90%       492         210841222
# 2  Extended offline    Completed: read failure       90%       492         210841222

样例:8 计算测试时间估值

root@linuxtechi:~# smartctl -c  /dev/sdb
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-32-generic] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF READ SMART DATA SECTION ===
General SMART Values:
Offline data collection status:  (0x00)    Offline data collection activity
                    was never started.
                    Auto Offline Data Collection: Disabled.
Self-test execution status:      ( 121)    The previous self-test completed having
                    the read element of the test failed.
Total time to complete Offline
data collection:         (    0) seconds.
Offline data collection
capabilities:              (0x73) SMART execute Offline immediate.
                    Auto Offline data collection on/off support.
                    Suspend Offline collection upon new
                    command.
                    No Offline surface scan supported.
                    Self-test supported.
                    Conveyance Self-test supported.
                    Selective Self-test supported.
SMART capabilities:            (0x0003)    Saves SMART data before entering
                    power-saving mode.
                    Supports SMART auto save timer.
Error logging capability:        (0x01)    Error logging supported.
                    General Purpose Logging supported.
Short self-test routine
recommended polling time:      (   1) minutes.
Extended self-test routine
recommended polling time:      ( 102) minutes.
Conveyance self-test routine
recommended polling time:      (   2) minutes.
SCT capabilities:            (0x103b)    SCT Status supported.
                    SCT Error Recovery Control supported.
                    SCT Feature Control supported.
                    SCT Data Table supported.

样例:9 显示磁盘错误日志

root@linuxtechi:~# smartctl -l error  /dev/sdb
Sample Output
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-32-generic] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF READ SMART DATA SECTION ===
SMART Error Log Version: 1
ATA Error Count: 5
    CR = Command Register [HEX]
    FR = Features Register [HEX]
    SC = Sector Count Register [HEX]
    SN = Sector Number Register [HEX]
    CL = Cylinder Low Register [HEX]
    CH = Cylinder High Register [HEX]
    DH = Device/Head Register [HEX]
    DC = Device Command Register [HEX]
    ER = Error register [HEX]
    ST = Status register [HEX]
Powered_Up_Time is measured from power on, and printed as
DDd+hh:mm:SS.sss where DD=days, hh=hours, mm=minutes,
SS=sec, and sss=millisec. It "wraps" after 49.710 days.
Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  25 da 08 e7 e5 a5 4c 00      00:30:44.515  READ DMA EXT
  25 da 08 df e5 a5 4c 00      00:30:44.514  READ DMA EXT
  25 da 80 5f e5 a5 4c 00      00:30:44.502  READ DMA EXT
  25 da f0 5f e6 a5 4c 00      00:30:44.496  READ DMA EXT
  25 da 10 4f e6 a5 4c 00      00:30:44.383  READ DMA EXT

via: http://www.linuxtechi.com/smartctl-monitoring-analysis-tool-hard-drive/

作者:Pradeep Kumar 译者:GOLinux 校对:wxy

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

来源:https://linux.cn/article-4682-1.html

Linux:怎样在 Ubuntu 14.10 Server 上安装 Cacti

Cacti 是一个完善的网络监控的图形化解决方案,它被设计用来发挥 RRDTool (一个 Linux 数据存储和绘图工具)的数据存储和绘图的强大功能。Cacti 提供一个快速的轮询器,高级的绘图模版,多种数据获取方法和用户管理功能,并且可以开箱即用。所有的这些都被打包进一个直观,易用的界面,可用于监控简单的 LAN 网络,乃至包含成百上千设备的复杂网络。

Linux:怎样在 Ubuntu 14.10 Server 上安装 Cacti
Linux:怎样在 Ubuntu 14.10 Server 上安装 Cacti

功能

绘图

没有数量限制的监控图条目(graph item),每个图形可以视情况使用 Cacti 中的 CDEFs (Calculation Define,可以对图形输出结果进行计算)或者数据源。

自动将 GPRINT 条目分组至 AREA,STACK 和 LINE[1-3] 中,来对监控图条目进行快速重排序。

自动填充功能支持整齐排列图形内的说明项。

可以使用 RRDTool 中内置的 CDEF 数学函数对图形数据进行处理。这些 CDEF 函数可以定义在 Cacti 中,并且每一个图形都可以使用它们。

支持所有的 RRDTool 图形类型,包括 AREA,STACK,LINE[1-3],GPRINT,COMMENT,VRULE 和 HRULE。

数据源

数据源可以使用 RRDTool 的 “create” 和 “update” 功能创建。每一个数据源可以用来收集本地或者远程的数据,并将数据输出成图形。

支持包含多个数据源的 RRD 文件,并可以使用存储在本地文件系统中任何位置的 RRD 文件。

可以自定义轮询归档(RRA)设置,用户可以在存储数据时使用非标准的时间间隔(标准时间间隔是5分钟,30分钟,2小时和 1天)。

数据收集

Cacti 包含一个 “data input” 机制,可以让用户定义自定义的脚本用来收集数据。每个脚本可以包含调用参数,每次调用此脚本的创建数据源时必须输入相应的调用参数(如 IP 地址)。

支持 SNMP 功能,可以使用 php-snmp,ucd-snmp 或者 net-snmp。

可以基于索引来使用 SNMP 或者脚本收集数据。例如,可以列出一个服务器上所有网卡接口或者已挂载分区的索引列表。其集成的绘图模版可以用来为主机一键创建图形。

提供了一个基于 PHP 的轮询器执行脚本,可以收集 SNMP数据并更新数据至 RRD 文件中。

模版

绘图模版可以将相同图形分组到为一类。图形中的每一个条目都可以使用模版的默认值或者自定义。

数据源模版可以通过将相同数据源类型分组为一类。数据源中每一个条目都可以使用模版的默认值或者自定义。

主机模版是一组图形和数据源模版,可以用来定义某一类型的主机。创建主机时,它会自动使用相应模版的属性。

图形展示

图形树模式允许用户创建「图形层次结构」并将图形放至树中。这种方法可以方便的管理大量图形。

列表模式将所有图形的链接在一个大列表中展示出来,链接指向用户创建的图形。

预览模式将所有图形在一个大列表中展示出来。这有点类似于 RRDTool/MRTG 的默认视图。

用户管理

用户管理功能允许管理员创建用户并分配给用户访问 Cacti 接口的不同级别的权限。

权限可以为每个用户指定其对每个图形的权限,这适用于主机租用的场景。

每个用户可以保存他自己的图形显示模式。

来源:https://linux.cn/article-4683-1.html

Linux:Calife:一个轻量级的sudo替代品

Linux:Calife:一个轻量级的sudo替代品
Linux:Calife:一个轻量级的sudo替代品

Calife会在登录为另外一个用户前输入自己的密码(如果没有提供登录名,默认是登录为root),在验证具有正确的权限后,就会切换到该用户及其组身份,并就会执行一个shell。如果 calife 是由 root 执行的,不需要密码,会执行一个所需的用户ID的shell。

所用的shell是用户自身所用的,除非在calife.auth配置文件中指定了某个shell。如果在命令行指定了“-”选项,就会读取该用户的环境文件,该shell就像是一个登录shell。这和su的惯常用法不同。

只有在calife.auth中指定的用户才能使用此方法通过calife成为另外一个用户。calife.auth安装位置处于/etc/calife.auth。

Calife特性

这里给出了一个关于calife特性的扩展列表:

  • 你可以完整保留你的环境变量和shell别名
  • 它可以全程记录会话的开始到结束
  • 你可以列出每个许可使用calife的用户,那样,你就可以用户赋予主管权限而不必提供root密码
  • 你可以在配置文件中指定哪个组可以使用:只要使用@staff或者%staff,那么所有staff组中的成员都将具有访问calife的权限
  • 通过calife也可以登录成为那些没有家目录或甚至没有shell的用户。如果你想要成为uucp或者甚至是bin,那会很方便
  • 你可以让calife在会话结束时运行一个指定的系统级的脚本(例如,发送一封邮件告知以root身份做了哪些事)

ubuntu中安装calife

打开终端,然后运行以下命令

sudo apt-get install calife

使用Calife

语法

calife [-] [login]

详情请参与calife手册页


via: http://www.ubuntugeek.com/calife-a-lightweight-alternative-to-sudo.html

作者:ruchi 译者:GOLinux 校对:wxy

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

来源:https://linux.cn/article-4694-1.html

Linux:采用转发服务器增强 Postfix 邮件服务器的安全

Linux:采用转发服务器增强 Postfix 邮件服务器的安全
Linux:采用转发服务器增强 Postfix 邮件服务器的安全

当你启动并运行应用服务器后,你就需要一台好的邮件服务器来为你传递邮件。我为我所有的服务器开通了postfix邮件服务,下面就是我常用的配置。

CentOS 6上安装Postfix

yum install postfix

默认安装了Sendmail,所以最好将它停掉并移除。

service sendmail stop
yum remove sendmail

Postfix包含了两个配置文件main.cf和master.cf,对于基本的配置,你需要修改main.cf。同时,postfix可以像shell变量一样定义参数,并通过$来调用。这些参数不需要再使用前定义,Postfix只在运行中需要时才会查询某个参数。

配置postfix

vim /etc/postfix/main.cf

去掉以下行的注释

# 你的主机名
myhostname = yourhostname.com
# 你的发件域
myorigin = $myhostname
# 指定用于接收邮件的网络接口,这里指定 localhost 是因为我们只用来接受本地的程序投递
inet_interfaces = localhost
# 指定所使用的协议,可以使用“all”来增加 IPv6 支持
inet_protocols = ipv4
# 指定所接受的邮件域
mydestination = $myhostname, localhost.$mydomain, localhost
# 仅转发本地主机的邮件,而不是主机所在的网络
mynetworks_style = host

启动postfix

service postfix start

这些基本的postfix配置可以让你的机器发送邮件,你可以通过发送邮件并检查“maillog”日志文件来验证。

echo test mail | mail -s "test"  leo@techarena51.com && sudo tail -f /var/log/maillog
# 输出的日志类似如下
Aug 25 14:16:21 vps postfix/smtp[32622]: E6A372DC065D: to=, relay=smtp.mailserver.org[50.56.21.176], delay=0.8, delays=0.1/0/0.43/0.27, dsn=2.0.0, status=sent (250 Great success)
Aug 25 14:16:21 vps postfix/qmgr[5355]: E6A372DC065D: removed

但是,上述配置并不够,因为邮件服务大多数时候都会被垃圾邮件挤满,你需要添加SPF、PTR和DKIM记录。即便如此,你的邮件仍然可能被当作垃圾邮件来投递,因为你的IP地址被列入了黑名单,大多数时候是因为你的vps先前被入侵了。

还有另外一种选择,或者说是更好的方式是使用第三方邮件提供商提供的邮件服务,如Gmail,或者甚至是Mailgun。我使用Mailgun,因为它们提供了每个月10000封免费电子邮件,而Gmail则提供了每天100封左右的邮件。

在“/etc/postfix/main.cf”中,你需要添加“smtp.mailgun.com”作为你的“转发主机”,并启用“SASL”验证,这样postfix就可以连接并验证到远程Mailgun服务器。

添加或取消以下行的注释。

relayhost = [smtp.mailgun.org]
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps=static:your_username:your_password
smtp_sasl_security_options=noanonymous

Postfix本身不会实施“SASL”验证,因此你需要安装“cyrus-sasl-plain”。

sudo yum install cyrus-sasl-plain

如果你不安装此包,那么你就会收到这条错误信息“SASL authentication failed; cannot authenticate to server smtp.mailgun.org[50.56.21.176]: no mechanism available)”

重启postfix

sudo service postfix restart

使用TLS加固Postfix安全

Postfix支持TLS,它是SSL的后继者,允许你使用基于密钥的验证来加密数据。我推荐你阅读 http://www.postfix.org/TLS_README.html ,以了解TLS是怎么和postfix一起工作的。

为了使用TLS,你需要生成一个私钥和一个由证书授权机构颁发的证书。在本例中,我将使用自颁发的证书。

sudo yum install mod_ssl openssl
# 生成私钥
openssl genrsa -out smtp.key 2048
# 生成 CSR
openssl req -new -key smtp.key -out smtp.csr
# 生成自签名的钥匙
openssl x509 -req -days 365 -in smtp.csr -signkey smtp.key -out smtp.crt
# 将文件复制到正确的位置
cp smtp.crt /etc/pki/tls/certs
cp smtp.key /etc/pki/tls/private/smtp.key
cp smtp.csr /etc/pki/tls/private/smtp.csr

打开postfix配置文件,然后添加以下参数。

sudo vim /etc/postfix/main.cf
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/pki/tls/private/smtp.key
smtpd_tls_cert_file = /etc/pki/tls/certs
smtp_tls_CAfile = /etc/ssl/certs/ca.crt
smtp_tls_loglevel = 1

安全级别“may”意味着宣告对远程SMTP客户端上的STARTTLS的支持,但是客户端不需要使用加密。我在这里按照mailgun文档提示使用“may”,但是如果你想要强制使用TLS加密,可以使用“encrypt”。

service postfix restart
# 发送一封测试邮件
echo test mail | mail -s "test"  test@yourdomain.com && sudo tail -f /var/log/maillog

你应该会看到以下信息

Aug 21 00:00:06 vps postfix/smtp[4997]: setting up TLS connection to smtp.mailgun.org[50.56.21.176]:587
Aug 21 00:00:06 vps postfix/smtp[4997]: Trusted TLS connection established to smtp.mailgun.org[50.56.21.176]:587: TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)

如果一切正常,你可以注释掉以下参数。

“smtp_tls_loglevel = 1”

对于故障排除,我推荐你阅读Postfix小建议和排障命令


via: http://techarena51.com/index.php/configure-secure-postfix-email-server/

作者:Leo G 译者:GOLinux 校对:wxy

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

来源:https://linux.cn/article-4699-1.html

Linux:如何手动删除Oracle 11g数据库

下面的步骤会教你如何在Linux环境下手动删除Oracle 11g数据库。

Linux:如何手动删除Oracle 11g数据库
Linux:如何手动删除Oracle 11g数据库

我在Centos 6上安装了Oralce 11G数据库。

使用SQLPlus或者其他你喜欢的命令行工具登录数据库,登录用户是sysdba*

输入下面的命令的到不同文件的路径:

select name from v$datafile;
select member from v$logfile;
select name from v$controlfile;
select name from v$tempfile;

在SQLPlus中关闭数据库,接着退出SQLPlus

sqlplus  "/ as sysdba"

shutdown immediate;
quit;

在命令行中输入下面的命令停止监听服务:

在Oralce Linux账户中:

lsnrctl stop

回忆一下之前的文件路径;在删除这些文件的时候作为一个检查项。记住:你备份了数据库了么?当准备好之后,就删除你的数据文件吧,同样还有你的日志文件、控制文件和临时文件。

  • 进入 $ORACLE_HOME/network/admin 目录并删除 tnsnames.oralistener.ora 文件;
  • 进入 $ORACLE_HOME/dbs 目录并删除 init[db_name].oraorapw[db_name]spfile[db_name].ora 文件;
  • 进入 $ORACLEHOME/admin/[dbname]/pfile 目录并删除 init[db_name].ora 文件;
  • 进入 $ORACLEHOME/admin/[dbname]/adump 目录并删除所有文件;
  • 编辑/etc/oratab 并移除以你数据库名字开头的行.

这样就好了。


via: http://www.unixmen.com/manually-delete-oracle-11g-database/

作者:M.el Khamlichi 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-4696-1.html

Linux:在 Mac OS X 系统中创建用于 Mac 的 Ubuntu USB 启动盘

Linux:在 Mac OS X 系统中创建用于 Mac 的 Ubuntu USB 启动盘
Linux:在 Mac OS X 系统中创建用于 Mac 的 Ubuntu USB 启动盘

上个月,在戴尔的服务中心丢失我的笔记本后,我买了一台 Macbook Air 笔记本。买回来后我首先做的一些事就是给机器装上双系统,使 Ubuntu Linux 和 Mac OS X 都可用。随后的文章我会介绍如何在 Macbook 上安装 Linux ,刚开始我们需要学习 如何在 Mac OS X 系统中创建用于 Mac 的 Ubuntu USB 启动盘

在 Ubuntu 系统或 Windows 系统中创建可启动的 USB 是非常容易的,但在 Mac OS X 系统中就没这么简单了。这就是为什么 Ubuntu 的官方指南上,在 Mac 中安装 live Ubuntu 推荐使用光盘安装而不是 USB 的原因。考虑到我的 Macbook Air 既没有 CD 驱动也没有 DVD 驱动,所以我更愿意在 Mac OS X 下创建一个 live USB。

在 Mac OS X 下创建可启动 USB 驱动盘

如前所述,在 Mac OS X 上创建对于像 Ubuntu 或任何其它可引导的操作系统这样的可启动 USB 盘是个比较麻烦的过程。但请别担心,按照下面的步骤一步一步操作就行。让我们就开始创建一个可启动的 USB 盘的操作吧:

步骤 1: 格式化 USB 驱动盘

苹果是以它自定义的标准而闻名的,所以 Mac OS X 系统有自己的文件系统类型就毫不奇怪了,它的文件系统叫做 Mac OS 扩展或 HFS 插件。因此,您需要做的第一件事就是用 Mac OS 扩展文件系统来格式化您的 USB 驱动盘。

要格式化 USB 盘,请先插入 USB 盘。从 Launchpad(在底部面板上的一个火箭形状的图标)上前往磁盘工具应用程序。

  • 在磁盘工具中,从左手边的面板上选择你的 USB 盘来格式化。
  • 点击右边面板的分区标签。
  • 从下拉菜单中,选择 1 分区
  • 给这驱动盘起个您想要的名字。
  • 接下来,切换分区格式为格式化成 Mac OS 扩展 (日志型)

下面的截屏将会对您有所帮助。

Linux:在 Mac OS X 系统中创建用于 Mac 的 Ubuntu USB 启动盘
Linux:在 Mac OS X 系统中创建用于 Mac 的 Ubuntu USB 启动盘

在我们开始真正格式化 USB 盘之前这是唯一一件要做的操作。点击在右边面板的选项按纽,要确保分区的模式是 GUID 分区表形式的。

Linux:在 Mac OS X 系统中创建用于 Mac 的 Ubuntu USB 启动盘
Linux:在 Mac OS X 系统中创建用于 Mac 的 Ubuntu USB 启动盘

当所有都已经设置完了后,仅仅只需点击应用按纽。它会弹出一个要格式化 USB 驱动盘的警告消息,当然是要点击分区按纽来格式化 USB 驱动盘拉。

步骤 2: 下载 Ubuntu

当然,您需要下载 Ubuntu 桌面版本的 ISO 镜像文件。链接到 Ubuntu 官网去下载您喜欢的 Ubuntu 桌面版本系统。因为您使用的是 Macbook Air,我建议您下载 64 位版本中的一款。Ubuntu 14.04 是最新的 LTS 版本,我建议您们使用它。

步骤 3: 把 ISO 格式转成 IMG 格式

您下载的文件是 ISO 格式的,但我们需要它是 IMG 格式的,使用 hdiutil 命令工具就可以很容易的转换。打开终端,也可以从 Launchpad 或 Spotlight 中打开,然后使用如下的命令就可以把 ISO 格式的转换成 IMG 格式的了:

hdiutil convert -format UDRW -o ~/Path-to-IMG-file ~/Path-to-ISO-file

通常下载的文件会在 ~/Downloads 目录下。所以在我的系统来,输入的命令是:

hdiutil convert -format UDRW -o ~/Downloads/ubuntu-14.10-desktop-amd64 ~/Downloads/ubuntu-14.10-desktop-amd64.iso
Linux:在 Mac OS X 系统中创建用于 Mac 的 Ubuntu USB 启动盘
Linux:在 Mac OS X 系统中创建用于 Mac 的 Ubuntu USB 启动盘

您可能已经注意到我并没有新转换出的文件加上 IMG 后缀。这是没问题的,因为后缀只是个标志,重要的是文件类型并不是文件的扩展名。转换出来的文件可能会被 Mac OS X 系统自动加上个 .dmg 后缀。别担心,这是正常的。

来源:https://linux.cn/article-4697-1.html

Linux:Git 两分钟指南

受到Git五分钟指南的启发,我决定更进一步,写一篇更短时间内就能看完的Git教程。当然,这是指最简单的Git!但是对于新手个人开发者来说足够了,同时也给你提供一个可以继续深入的起点。

能够从本指南有所收获的例子也许是这样的,一个高中生正在进行他(或是她)的第一个项目,而且并不需要和别人分享代码。(具体讲其实是我儿子,他已经写了很多代码,但是没有时间去学习一个版本控制工具。这份指南是为他写的,当然我觉得别人也能用的到。)对他来说,使用Git是很有意义的。和Subversion不同,他不需要一个服务器,就可以很容易地使用Git(只要他对硬盘进行定期备份,当然,他确实也在这么做)。正好在一个两分钟的指南中,没有时间去涉及服务器的事情,所以这篇指南对类似我儿子这种情况特别合适。

再次强调,本文提及的Git使用方法,仅对那些会定期备份硬盘的个人开发者来讲是合适的。两分钟Git指南加上一个备份策略,你可以自信的提交文件并且知道如果自己需要的话,你可以查看改动或是恢复之前的版本。

为什么学习Git如此有必要?好吧,对于开发者来讲,最烦人、最耗费时间的事情就发现之前可以工作的程序现在无法工作了。在这种情况下,能够看到之前的改动并且回退到之前的版本会有很大的帮助。同样的,能够回退到之前的状态可以让你自由的测试新的方法–做实验完全没有问题因为你总是可以重来。

如果有机会的话,你绝对应该学一下暂存(staging)和分支(branching),还有向(从)远端仓库上传(pushing)和获取(pulling)。但是你下面要学到的东西同样很有用。 注意:下面提到的文件名,你都可以使用文件路径。

Linux:Git 两分钟指南
Linux:Git 两分钟指南

使用前的设置

如果你还没有安装git的话,请查看 Getting Started page上的安装指南。 第一次使用git,我们假定你正在一个文件夹内工作,该文件夹是你项目的主文件夹。你需要做的第一件事情是用下面这条命令来初始化文件夹供Git使用。

git init

告诉git你要处理的文件

现在你需要告诉git,需要考虑哪些文件。如果你有N个文件,你可以使用

git add  

来添加他们。或是你想要把目录下的文件全部添加,你可以使用

git add .  

句号是命令的一部分,表示当前目录。

提交改动

下一步,我们需要提交改动。任何时候,你想要提交一个文件或多个文件的改动,运行

git commit   -m “This is your commit message”

或者,提交全部有改动的文件:

git commit -a -m “This is your commit message for all changed files”

确保你的提交信息能够包含足够的描述信息,让你可以搞清楚你想要回退到哪个版本。

查看历史

现在你需要一个查看旧版本的方法。为了查看提交信息和该次提交的hash值(代表版本的一串数字)可以使用如下命令,使其以每行一个版本的方式输出

git log --pretty=oneline

它的输出看起来是下面这样的,每次提交的hash值和它的提交信息一起显示

dbe28a0a1eba45d823d309cc3659069fc16297e3 4th version I wanted to commit
13bbf385e6d1f94c7f11a4cdfa2a7688dfdd84f8 3rd
a1696f671fb90dc8ea34645a6f851d0ab0152fc2 2nd versio
179e59467039c7a7b81f676297415c8e018542a0 first version

注意,你同样可以使用

git log

来输出一个更冗长的信息,每个版本信息占用多行,而且你可以使用

git log --pretty=oneline -- 

来查看某个具体文件的改动。(注意第二个–后面的空格!)

恢复旧版本

恢复之前版本的文件,你只需要使用hash值的前几个数字(要保证足够的区分度):

git checkout  -- 

比如

git checkout 179e59467039 -- myfile

会把我的名为myfile的文件的内容回退到179e59467039c7a7b81f676297415c8e018542a0这个状态(这里是指本文件的第一次提交版本)

查看改动

通常你不会不先查看一下文件变化就回退到旧的版本!查看文件当前版本和历史版本的区别,你需要指明历史版本的hash值:

git diff  -- 

你同样可以比较两个历史版本的差别:

git diff    -- 

还有一件事——可选项——也许会让本文多一分钟

也许您仅仅使用以上功能就可以受益匪浅,你会发现还有一件事是很有用的。如果你现在不想看的话,就别看了——找机会下次再看。 有时候,你不清楚有哪些文件被改动了。你可以使用如下命令找到它们:

git status

这会生成一份文件列表以及他们的状态。比如,一个还没有被’git add’ 的文件会被显示为`untracked`;如果你想要追踪这个文件,就需要添加它。 在我的两分钟教程中,我把这个命令当做可选项的原因是,这个命令可能会有点笨拙。因为它可能会列出很多你并不关心的文件的状态。举例来说,如果你使用Python语言编程,它会列出Python生成的编译文件.pyc。你肯定想解决这一问题。

为了解决这个问题,你需要在目录下创建一个叫`.gitignore` 的文件。比如你在使用Python 2.x的项目,你会希望在这个文件中(至少)包含:

*.pyc

注意,.gitignore` 可以理解*通配符。如果你想要隐藏一个完整的目录,你要在文件夹名后面加一个斜杠。例如你使用Python 3.x编程,所有的便以文件都会进入一个叫__pycache__ 的文件夹,所以你需要在.gitignore中添加

__pycache__/

这就是本教程! 把这份教程放在手边就行啦

这些就是你开始使用git所需要知道的东西,只要你有定期备份硬盘的习惯。如果你不想要记忆除了提交命令以外的其他东西,仅需要把本教程保存进书签,你就可以无障碍的提交,对比版本,回退到旧版本! 记住,本教程准确来讲是最小化教程,让你可以用Git做一些有用的事情。对于分支,暂存和通过远程服务器和他人共享代码这些强大的功能,请务必去看五分钟Git教程,如果有机会甚至应该去看更长的教程

来源:http://blog.jobbole.com/78999/

Linux:Docker网络详解及pipework源码解读与实践

Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理。然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分。因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求。本文首先介绍了Docker自身的4种网络工作方式,然后通过3个样例 —— 将Docker容器配置到本地网络环境中、单主机Docker容器的VLAN划分、多主机Docker容器的VLAN划分,演示了如何使用pipework帮助我们进行复杂的网络设置,以及pipework是如何工作的。

Linux:Docker网络详解及pipework源码解读与实践
Linux:Docker网络详解及pipework源码解读与实践

1. Docker的4种网络模式

我们在使用docker run创建Docker容器时,可以用–net选项指定容器的网络模式,Docker有以下4种网络模式:

  • host模式,使用–net=host指定。
  • container模式,使用–net=container:NAME_or_ID指定。
  • none模式,使用–net=none指定。
  • bridge模式,使用–net=bridge指定,默认设置。

下面分别介绍一下Docker的各个网络模式。

1.1 host模式

众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

例如,我们在10.10.101.105/24的机器上用host模式启动一个含有web应用的Docker容器,监听tcp80端口。当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用10.10.101.105:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

1.2 container模式

在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

1.3 none模式

这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

1.4 bridge模式

bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。下面着重介绍一下此模式。

1.4.1 bridge模式的拓扑

当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.42.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为10.10.101.105/24。

Linux:Docker网络详解及pipework源码解读与实践
Linux:Docker网络详解及pipework源码解读与实践

Docker完成以上网络配置的过程大致是这样的:

  1. 在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
  2. Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth65f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看。

     

  3. 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。

网络拓扑介绍完后,接着介绍一下bridge模式下容器是如何通信的。

1.4.2 bridge模式下容器的通信

在bridge模式下,连在同一网桥上的容器可以相互通信(若出于安全考虑,也可以禁止它们之间通信,方法是在DOCKER_OPTS变量中设置–icc=false,这样只有使用–link才能使两个容器通信)。

容器也可以与外部通信,我们看一下主机上的Iptable规则,可以看到这么一条

-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

这条规则会将源地址为172.17.0.0/16的包(也就是从Docker容器产生的包),并且不是从docker0网卡发出的,进行源地址转换,转换成主机网卡的地址。这么说可能不太好理解,举一个例子说明一下。假设主机有一块网卡为eth0,IP地址为10.10.101.105/24,网关为10.10.101.254。从主机上一个IP为172.17.0.1/16的容器中ping百度(180.76.3.151)。IP包首先从容器发往自己的默认网关docker0,包到达docker0后,也就到达了主机上。然后会查询主机的路由表,发现包应该从主机的eth0发往主机的网关10.10.105.254/24。接着包会转发给eth0,并从eth0发出去(主机的ip_forward转发应该已经打开)。这时候,上面的Iptable规则就会起作用,对包做SNAT转换,将源地址换为eth0的地址。这样,在外界看来,这个包就是从10.10.101.105上发出来的,Docker容器对外是不可见的。

那么,外面的机器是如何访问Docker容器的服务呢?我们首先用下面命令创建一个含有web应用的容器,将容器的80端口映射到主机的80端口。

docker run -d --name web -p 80:80 fmzhen/simpleweb

然后查看Iptable规则的变化,发现多了这样一条规则:

-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.5:80

此条规则就是对主机eth0收到的目的端口为80的tcp流量进行DNAT转换,将流量发往172.17.0.5:80,也就是我们上面创建的Docker容器。所以,外界只需访问10.10.101.105:80就可以访问到容器中得服务。

除此之外,我们还可以自定义Docker使用的IP地址、DNS等信息,甚至使用自己定义的网桥,但是其工作方式还是一样的。

来源:http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-practice

Linux:亿级用户下的新浪微博平台架构

序言

新浪微博在2014年3月公布的月活跃用户(MAU)已经达到1.43亿,2014年新年第一分钟发送的微博达808298条,如此巨大的用户规模和业务量,需要高可用(HA)、高并发访问、低延时的强大后台系统支撑。

微博平台第一代架构为LAMP架构,数据库使用的是MyIsam,后台用的是php,缓存为Memcache。

随着应用规模的增长,衍生出的第二代架构对业务功能进行了模块化、服务化和组件化,后台系统从php替换为Java,逐渐形成SOA架构,在很长一段时间支撑了微博平台的业务发展。

在此基础上又经过长时间的重构、线上运行、思索与沉淀,平台形成了第三代架构体系。

我们先看一张微博的核心业务图(如下),是不是非常复杂?但这已经是一个简化的不能再简化的业务图了,第三代技术体系就是为了保障在微博核心业务上快速、高效、可靠地发布新产品新功能。

Linux:亿级用户下的新浪微博平台架构
Linux:亿级用户下的新浪微博平台架构

第三代技术体系

微博平台的第三代技术体系,使用正交分解法建立模型:在水平方向,采用典型的三级分层模型,即接口层、服务层与资源层;在垂直方向,进一步细分为业务架构、技术架构、监控平台与服务治理平台。下面是平台的整体架构图:

Linux:亿级用户下的新浪微博平台架构
Linux:亿级用户下的新浪微博平台架构

如上图所示,正交分解法将整个图分解为3*4=12个区域,每个区域代表一个水平维度与一个垂直维度的交点,相应的定义这个区域的核心功能点,比如区域5主要完成服务层的技术架构。

下面详细介绍水平方向与垂直方向的设计原则,尤其会重点介绍4、5、6中的技术组件及其在整个架构体系中的作用。

水平分层

水平维度的划分,在大中型互联网后台业务系统的设计中非常基础,在平台的每一代技术体系中都有体现。这里还是简单介绍一下,为后续垂直维度的延伸讲解做铺垫:

  1. 接口层主要实现与Web页面、移动客户端的接口交互,定义统一的接口规范,平台最核心的三个接口服务分别是内容(Feed)服务、用户关系服务及通讯服务(单发私信、群发、群聊)。
  2. 服务层主要把核心业务模块化、服务化,这里又分为两类服务,一类为原子服务,其定义是不依赖任何其他服务的服务模块,比如常用的短链服务、发号器服务都属于这一类。图中使用泳道隔离,表示它们的独立性。另外一类为组合服务,通过各种原子服务和业务逻辑的组合来完成服务,比如Feed服务、通讯服务,它们除了本身的业务逻辑,还依赖短链、用户及发号器服务。
  3. 资源层主要是数据模型的存储,包含通用的缓存资源Redis和Memcached,以及持久化数据库存储MySQL、HBase,或者分布式文件系统TFS以及Sina S3服务。

水平分层有一个特点,依赖关系都是从上往下,上层的服务依赖下层,下层的服务不会依赖上层,构建了一种简单直接的依赖关系。

与分层模型相对应,微博系统中的服务器主要包括三种类型:前端机(提供 API 接口服务)、队列机(处理上行业务逻辑,主要是数据写入)和存储(mc、mysql、mcq、redis 、HBase等)。

垂直延伸技术架构

随着业务架构的发展和优化,平台研发实现了许多卓越的中间件产品,用来支撑核心业务,这些中间件由业务驱动产生,随着技术组件越来越丰富,形成完备的平台技术框架,大大提升了平台的产品研发效率和业务运行稳定性。

区别于水平方向上层依赖下层的关系,垂直方向以技术框架为地基支撑点,向两侧驱动影响业务架构、监控平台、服务治理平台,下面介绍一下其中的核心组件。

接口层Web V4框架

接口框架简化和规范了业务接口开发工作,将通用的接口层功能打包到框架中,采用了Spring的面向切面(AOP)设计理念。接口框架基于Jersey 进行二次开发,基于annotation定义接口(url, 参数),内置Auth、频次控制、访问日志、降级功能,支撑接口层监控平台与服务治理,同时还有自动化的Bean-json/xml序列化。

服务层框架

服务层主要涉及RPC远程调用框架以及消息队列框架,这是微博平台在服务层使用最为广泛的两个框架。

MCQ消息队列

消息队列提供一种先入先出的通讯机制,在平台内部,最常见的场景是将数据的落地操作异步写入队列,队列处理程序批量读取并写入DB,消息队列提供的异步机制加快了前端机的响应时间,其次,批量的DB操作也间接提高了DB操作性能,另外一个应用场景,平台通过消息队列,向搜索、大数据、商业运营部门提供实时数据。

微博平台内部大量使用的MCQ(SimpleQueue Service Over Memcache)消息队列服务,基于MemCache协议,消息数据持久化写入BerkeleyDB,只有get/set两个命令,同时也非常容易做监控(stats queue),有丰富的client library,线上运行多年,性能比通用的MQ高很多倍。

Motan RPC框架

微博的Motan RPC服务,底层通讯引擎采用了Netty网络框架,序列化协议支持Hessian和Java序列化,通讯协议支持Motan、http、tcp、mc等,Motan框架在内部大量使用,在系统的健壮性和服务治理方面,有较为成熟的技术解决方案,健壮性上,基于Config配置管理服务实现了High Availability与Load Balance策略(支持灵活的FailOver和FailFast HA策略,以及Round Robin、LRU、Consistent Hash等Load Balance策略),服务治理方面,生成完整的服务调用链数据,服务请求性能数据,响应时间(Response Time)、QPS以及标准化Error、Exception日志信息。

资源层框架

资源层的框架非常多,有封装MySQL与HBase的Key-List DAL中间件、有定制化的计数组件,有支持分布式MC与Redis的Proxy,在这些方面业界有较多的经验分享,我在这里分享一下平台架构的对象库与SSD Cache组件。

对象库

对象库支持便捷的序列化与反序列化微博中的对象数据:序列化时,将JVM内存中的对象序列化写入在HBase中并生成唯一的ObjectID,当需要访问该对象时,通过ObjectID读取,对象库支持任意类型的对象,支持PB、JSON、二进制序列化协议,微博中最大的应用场景将微博中引用的视频、图片、文章统一定义为对象,一共定义了几十种对象类型,并抽象出标准的对象元数据Schema,对象的内容上传到对象存储系统(Sina S3)中,对象元数据中保存Sina S3的下载地址。

SSDCache

随着SSD硬盘的普及,优越的IO性能使其被越来越多地用于替换传统的SATA和SAS磁盘,常见的应用场景有三种:1)替换MySQL数据库的硬盘,目前社区还没有针对SSD优化的MySQL版本,即使这样,直接升级SSD硬盘也能带来8倍左右的IOPS提升;2)替换Redis的硬盘,提升其性能;3)用在CDN中,加快静态资源加载速度。

微博平台将SSD应用在分布式缓存场景中,将传统的Redis/MC + Mysql方式,扩展为 Redis/MC + SSD Cache + Mysql方式,SSD Cache作为L2缓存使用,第一降低了MC/Redis成本过高,容量小的问题,也解决了穿透DB带来的数据库访问压力。

垂直的监控与服务治理

随着服务规模和业务变得越来越复杂,即使业务架构师也很难准确地描述服务之间的依赖关系,服务的管理运维变得越来难,在这个背景下,参考google的dapper和twitter的zipkin,平台实现了自己的大型分布式追踪系统WatchMan。

WatchMan大型分布式追踪系统

如其他大中型互联网应用一样,微博平台由众多的分布式组件构成,用户通过浏览器或移动客户端的每一个HTTP请求到达应用服务器后,会经过很多个业务系统或系统组件,并留下足迹(footprint)。但是这些分散的数据对于问题排查,或是流程优化都帮助有限。对于这样一种典型的跨进程/跨线程的场景,汇总收集并分析这类日志就显得尤为重要。另一方面,收集每一处足迹的性能数据,并根据策略对各子系统做流控或降级,也是确保微博平台高可用的重要因素。要能做到追踪每个请求的完整调用链路;收集调用链路上每个服务的性能数据;能追踪系统中所有的Error和Exception;通过计算性能数据和比对性能指标(SLA)再回馈到控制流程(control flow)中,基于这些目标就诞生了微博的Watchman系统。

该系统设计的一个核心原则就是低侵入性(non-invasivenss):作为非业务组件,应当尽可能少侵入或者不侵入其他业务系统,保持对使用方的透明性,可以大大减少开发人员的负担和接入门槛。基于此考虑,所有的日志采集点都分布在技术框架中间件中,包括接口框架、RPC框架以及其他资源中间件。

WatchMan由技术团队搭建框架,应用在所有业务场景中,运维基于此系统完善监控平台,业务和运维共同使用此系统,完成分布式服务治理,包括服务扩容与缩容、服务降级、流量切换、服务发布与灰度。

结尾

现在,技术框架在平台发挥着越来越重要的作用,驱动着平台的技术升级、业务开发、系统运维服务,本文限于篇幅限制,没有展开介绍,后续会不断地介绍核心中间件的设计原则和系统架构。

本文首发于“微博平台架构”微信公众号,发布时有少量的文字润色和调整。

关于作者

卫向军(@卫向军_微博),毕业于北京邮电大学,现任微博平台架构师,先后在微软、金山云、新浪微博从事技术研发工作,专注于系统架构设计、音视频通讯系统、分布式文件系统和数据挖掘等领域。

来源:http://www.infoq.com/cn/articles/weibo-platform-archieture

Linux:从Docker Hub和docker-registry看优秀的后端服务设计实现

【编者的话】 本文通过研究Docker Hub和docker-registry的架构,介绍了在服务端Docker镜像的存储、管理、安全的架构设计,并给出了一次简单的Docker客户端服务端交互的过程。对于部署实现一个大规模、企业级的镜像库需要做的工作做了初步的探讨,汇总了需要准备的前期知识等。推荐想要搭建一个私有Docker镜像库的同学阅读。

需求

最近因为工作需要,我开始研究docker-registry的实现和服务搭建。docker-registry是Docker的镜像存储服务端。或者这么说,Docker干的事情就是把整个应用、操作系统、配置打包成一个静态的镜像,这个镜像可以快速的启动和停止。但这种能力对单个人是没有多大意义的,我们需要有个地方把镜像存下来,然后用一个url分享给其他人。

如果是你,你会怎么设计?开一个公共的FTP让大家存镜像然后分享?这是个好主意,不过……Docker的镜像有这么一个设定,就是一个镜像是由多层组成的,如果每次传输全量文件,对客户端、服务端、用户启动都造成时间和流量的浪费。

Linux:从Docker Hub和docker-registry看优秀的后端服务设计实现
Linux:从Docker Hub和docker-registry看优秀的后端服务设计实现

于是……

需求一:远程存储服务

上传和下载需要智能的识别对面有没有这层,如果两边的层的uuid一致,已经有的话,就不传了。

简单的根据名字上传下载,对日常使用来说还不够方便,我们还需要一个Web界面,以支持登录、搜索、区分公共的镜像和私有的镜像等需求,这是用户的需求,不是客户端程序的需求。

Linux:从Docker Hub和docker-registry看优秀的后端服务设计实现
Linux:从Docker Hub和docker-registry看优秀的后端服务设计实现

需求二:Web界面,支持搜索

每个镜像层一般都有几十兆到几百兆的大小,可以想象,当很多用户都往一个地方上传时,单个服务器的存储容量是绝对支撑不住的,需要可以水平扩展的集群,但Web界面不能分开,客户端程序也不应该很麻烦的自己找去哪里下载。

Linux:从Docker Hub和docker-registry看优秀的后端服务设计实现
Linux:从Docker Hub和docker-registry看优秀的后端服务设计实现

需求三:支持水平扩展的集群存储

Docker Hub和docker-registry的分工如下:

Docker Hub负责管理集中的信息访问,包括:

  • 用户账户
  • 镜像的效验码
  • 公共和私人镜像仓库的区分

Docker Hub有几个组件:

  • Web UI
  • Meta-data 元数据存储(附注、星级、公共库清单)
  • 访问认证
  • token管理

dokcer-registry有如下几个特性:

  • 存储镜像、以及镜像层的家族谱系
  • 没有用户账户数据
  • 不知道用户的账户和安全性
  • 把安全和认证委托给docker-hub来做,用token来保证传递安全
  • 不需要重新发明轮子,支持多种存储后端
  • 没有本地数据库

一次docker pull 或 push背后发生的事情

Linux:从Docker Hub和docker-registry看优秀的后端服务设计实现
Linux:从Docker Hub和docker-registry看优秀的后端服务设计实现
Linux:从Docker Hub和docker-registry看优秀的后端服务设计实现
Linux:从Docker Hub和docker-registry看优秀的后端服务设计实现
这两个图里面的index就是hub,可以看到每次客户端都要先访问index,决定镜像文件从哪个registry上传或下载,然后去相应的registry操作。从阅读源码中可以看出,在registry上,每个镜像的层都是以tar.gz格式存储的。

自己搭建Docker镜像服务的考虑

既然是私服,同样需要考虑用户、安全认证、搜索等问题,可以说,Docker的开发者在设计镜像服务时就考虑了这些问题,把Web这块留给每个私服的开发者自己去实现,并把后端存储抽象成接口来调用。docker-registry的源代码放在这里 。为了保证后续的正常开发使用,我决定先阅读一下这个源码,不过碰上了不少问题,具体如下:

  • docker-registry是用Python实现的,我对python的了解仅仅限于简单的脚本,对Python的包、模块、类都不大懂,所以我学习了Python 。
  • docker-registry使用了egg打包发布,Gunicorn作为应用服务器(类似Tomcat),Flask作为MVC框架(类似Spring),后面还有SQLAlchemy作为搜索后端。这些技术都需要做简单的了解,在需要的时候深入学习。
  • 后端存储,因为镜像最终是以tar.gz的方式静态存储在服务端,不需要实时读或者写,所以适用于对象存储而不是块存储,于是问题就转化成找一个或写一个私有的存储驱动,官方支持的驱动有亚马逊AWS S3、Ceph-s3、Google gcs、OpenStack swift、Glance等等,国内的七牛也写了自己的驱动 。
  • 搜索,这块我还没涉及,后续再看……
  • Web UI的实现,现在GitHub上已经有好几个项目了,例如docker-registry-web 、docker-registry-frontend,后续再看……

最近在研究用Docker实现PaaS,欢迎大家有想法找我交流:-)

最后分析一下这个架构的优点

  • 解耦合Docker Hub是web-UI、用户认证、镜像元数据的集合,在这个方面,不同的组织有不同的做法,所以需要独立出来。docker-registry是所有组织可以复用的部分,单纯用于镜像存储服务。
  • 不重复造轮子docker-registry自己去实现一套对象存储了吗?没有,因为在对象存储这个领域,已经有很多优秀的实现。所以docker-registry是一个HTTP接口的服务,仅仅是在对象存储上包了一层镜像的家族谱系,而且底层支持多种对象存储。
  • 水平扩展性在简单使用场景下,docker-registry也支持本地文件系统存储,可以说是all-in-one的设计,开箱即用。而当把这个场景扩展,用于大规模企业级的应用时,Docker Hub和docker-registry是1:n的关系,registry本身是一个无状态的服务,可以非常容易的水平扩展。这也是设计者的狡猾之处,他把有状态的部分都抽离了,把存储这个最大的状态机制做成可以放在其他的对象存储上,这样在大规模使用场景下就不会有性能的问题,也不会有单点问题。任何一个registry挂掉都是可以忍受的,可以被轻易的恢复而没有副作用。

来源:http://dockerone.com/article/142

Linux:如何在 Ubuntu 上转换图像、音频和视频格式

如果你的工作中需要接触到各种不同编码格式的图像、音频和视频,那么你很有可能正在使用多个工具来转换这些多种多样的媒体格式。如果存在一个能够处理所有图像/音频/视频格式的多合一转换工具,那就太好了。

Format Junkie 就是这样一个多合一的媒体转换工具,它有着极其友好的用户界面。更棒的是它是一个免费软件。你可以使用 Format Junkie 来转换几乎所有的流行格式的图像、音频、视频和归档文件(或称压缩文件),所有这些只需要简单地点击几下鼠标而已。

在Ubuntu 12.04, 12.10 和 13.04 上安装 Format Junkie

Format Junkie 可以通过 Ubuntu PPA format-junkie-team 进行安装。这个PPA支持Ubuntu 12.04, 12.10 和 13.04。在以上任意一种Ubuntu版本中安装Format Junkie的话,简单的执行以下命令即可:

$ sudo add-apt-repository ppa:format-junkie-team/release
$ sudo apt-get update
$ sudo apt-get install formatjunkie
$ sudo ln -s /opt/extras.ubuntu.com/formatjunkie/formatjunkie /usr/bin/formatjunkie

将 Format Junkie 安装到 Ubuntu 13.10

如果你正在运行Ubuntu 13.10 (Saucy Salamander),你可以按照以下步骤下载 .deb 安装包来进行安装。由于Format Junkie 的 .deb 安装包只有很少的依赖包,所以使用 gdebi deb installer 来安装它。

在32位版Ubuntu 13.10上:

$ wget https://launchpad.net/~format-junkie-team/+archive/release/+files/formatjunkie_1.07-1~raring0.2_i386.deb
$ sudo gdebi formatjunkie_1.07-1~raring0.2_i386.deb
$ sudo ln -s /opt/extras.ubuntu.com/formatjunkie/formatjunkie /usr/bin/formatjunkie

在32位版Ubuntu 13.10上:

$ wget https://launchpad.net/~format-junkie-team/+archive/release/+files/formatjunkie_1.07-1~raring0.2_amd64.deb
$ sudo gdebi formatjunkie_1.07-1~raring0.2_amd64.deb
$ sudo ln -s /opt/extras.ubuntu.com/formatjunkie/formatjunkie /usr/bin/formatjunkie

将 Format Junkie 安装到 Ubuntu 14.04 或之后版本

现有可供使用的官方 Format Junkie .deb 文件需要 libavcodec-extra-53,不过它从Ubuntu 14.04开始就已经过时了。所以如果你想在Ubuntu 14.04或之后版本上安装Format Junkie,可以使用以下的第三方PPA来代替。

$ sudo add-apt-repository ppa:jon-severinsson/ffmpeg
$ sudo add-apt-repository ppa:noobslab/apps
$ sudo apt-get update
$ sudo apt-get install formatjunkie

如何使用 Format Junkie

安装完成后,只需运行以下命令即可启动 Format Junkie:

$ formatjunkie

使用 Format Junkie 来转换音频、视频、图像和归档格式

就像下方展示的一样,Format Junkie 的用户界面简单而且直观。在顶部的音频、视频、图像和iso媒体四个标签当中点击你需要的那个。你可以根据需要添加任意数量的文件用于批量转换。添加文件后,选择输出格式,直接点击 “Start Converting” 按钮进行转换。

Linux:如何在 Ubuntu 上转换图像、音频和视频格式
Linux:如何在 Ubuntu 上转换图像、音频和视频格式

Format Junkie支持以下媒体格式间的转换:

  • Audio: mp3, wav, ogg, wma, flac, m4r, aac, m4a, mp2.
  • Video: avi, ogv, vob, mp4, 3gp, wmv, mkv, mpg, mov, flv, webm.
  • Image: jpg, png, ico, bmp, svg, tif, pcx, pdf, tga, pnm.
  • Archive: iso, cso.

用 Format Junkie 进行字幕编码

除了媒体转换,Format Junkie 可提供了字幕编码的图形界面。实际的字幕编码是由MEncoder来完成的。为了使用Format Junkie的字幕编码接口,首先你需要安装MEencoder。

$ sudo apt-get install mencoder

然后点击Format Junkie 中的 “Advanced”标签。选择 AVI/subtitle 文件来进行编码,如下所示:

Linux:如何在 Ubuntu 上转换图像、音频和视频格式
Linux:如何在 Ubuntu 上转换图像、音频和视频格式

总而言之,Format Junkie 是一个非常易于使用和多才多艺的媒体转换工具。但也有一个缺陷,它不允许对转换进行任何定制化(例如:比特率,帧率,采样频率,图像质量,尺寸)。所以这个工具推荐给正在寻找一个简单易用的媒体转换工具的新手使用。

喜欢这篇文章吗?请在下面发表评论吧。多谢!


via: http://xmodulo.com/how-to-convert-image-audio-and-video-formats-on-ubuntu.html

作者:Dan Nanni 译者:Ping 校对:Caroline

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

来源:https://linux.cn/article-4731-1.html

Linux:如何在Linux上安装一个开源VPN服务器

Linux:如何在Linux上安装一个开源VPN服务器
Linux:如何在Linux上安装一个开源VPN服务器

我上网时最担心的一件事情是,我该如何确保我的数据安全和隐私。在搜索答案的过程中,我找到了很多保持匿名的方法,比如使用代理网站。但是使用第三方的服务不能完全保证。我需要的是有一款软件可以让我自己安装并运行,那样我就能确保只有我才能访问数据。

这款软件叫什么呢?

它叫VPN服务,就是虚拟隐私网络的简称。它允许访问时通过SSL加密你的数据。因为是加密的连接,所以你的ISP不能看到你的浏览信息。

在本篇Linux教程中,我会在CentOS 7上安装一个OpenVPN服务。OpenVPN很容易使用,开源且拥有社区的支持。它的客户端支持Windows、Android和Mac。

第一步: 在你的Linux机器或者 VPS 上安装OpenVPN服务

从 https://openvpn.net/index.php/access-server/download-openvpn-as-sw.html (它被墙一点都不奇怪,你知道的)下载安装包,Ubuntu用户也可以找到合适的安装包并安装。

[leo@vps ]$ cd /tmp
[leo@vps tmp]$ wget http://swupdate.openvpn.org/as/openvpn-as-2.0.10-CentOS7.x86_64.rpm
[leo@vps tmp]$ sudo rpm -Uvh openvpn-as-2.0.10-CentOS7.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:openvpn-as-0:2.0.10-CentOSrelease################################# [100%]
The Access Server has been successfully installed in /usr/local/openvpn_as
Configuration log file has been written to /usr/local/openvpn_as/init.log
Please enter "passwd openvpn" to set the initial
administrative password, then login as "openvpn" to continue
configuration here: https://yourhostIP:943/admin
To reconfigure manually, use the /usr/local/openvpn_as/bin/ovpn-init tool.
Access Server web UIs are available here:
Admin  UI: https://yourhostIP:943/admin
Client UI: https://yourhostIP:943/

第二步: 为 OpenVPN 客户端设置密码

[leo_g@vps ]$passwd openvpn

第三步: 通过管理URL https://yourhostIP:943/admin 登录并启动服务

Linux:如何在Linux上安装一个开源VPN服务器
Linux:如何在Linux上安装一个开源VPN服务器

输入用户名 “openvpn” 和你先前设置的密码

Linux:如何在Linux上安装一个开源VPN服务器
Linux:如何在Linux上安装一个开源VPN服务器

第四步: 从客户端URL安装客户端 (它会给你一个选项下载安装程序)

Linux:如何在Linux上安装一个开源VPN服务器
Linux:如何在Linux上安装一个开源VPN服务器

你可以在这里看指导来了解如何在你的操作系统上安装。

第五步: 用你先前创建的用户名和密码连接你的服务器

Linux:如何在Linux上安装一个开源VPN服务器
Linux:如何在Linux上安装一个开源VPN服务器

就是这样,你可以访问whatismyip.com来查看你的IP,应该已经是你的CentOS 7上的OpenVPN的地址了。


via: http://techarena51.com/index.php/how-to-install-an-opensource-vpn-server-on-linux/

作者:Leo G 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-4733-1.html

Linux:用 Linux blkid 命令查找块设备详情

今天我们将会向你展示如何使用 lsblkblkid 工具来查找关于块设备的信息,我们使用的是一台安装了 CentOS 7.0 的机器。

lsblk

lsblk 是一个 Linux 工具,它会显示有关你系统里所有可用块设备的信息。它从 sysfs 文件系统 中获取信息。默认情况下,这个工具将会以树状格式显示(除了内存虚拟磁盘外的)所有块设备。

lsblk 默认输出

默认情况下 lsblk 会将块设备输出为树状格式:

  • NAME —— 设备的名称

  • MAJ:MIN —— Linux 操作系统中的每个设备都以一个文件表示,对块(磁盘)设备来说,这里用主次设备编号来描述设备。

  • RM —— 可移动设备。如果这是一个可移动设备将显示 1,否则显示 0。

  • TYPE —— 设备的类型

  • MOUNTPOINT —— 设备挂载的位置

  • RO —— 对于只读文件系统,这里会显示 1,否则显示 0。

  • SIZE —— 设备的容量

显示设备的所有者

若想显示设备所有者相关的信息,包括文件的所属用户、所属组以及文件系统挂载的模式,你可以使用 -m 选项,像这样:

lsblk -m

列出设备块

如果你只想要列出设备,而不想让他们以树状输出,你可以使用 -l 选项:

lsblk -l

在脚本中使用

高级技巧:如果你想要在脚本中使用而希望剔除表头,你可以这样使用 -n 选项:

lsblk -ln

blkid

blkid 命令是一个命令行工具,它可以显示关于可用块设备的信息。它可以识别一个块设备内容的类型(如文件系统、交换区)以及从内容的元数据(如卷标或 UUID 字段)中获取属性(如 tokens 和键值对)。它主要有两类作用:用指定的键值对搜索一个设备,或是显示一个或多个设备的键值对。

blkid 使用方法

不添加任何参数直接运行 blkid 将会输出所有可用的设备、它们的通用唯一识别码(UUID)、文件系统类型以及卷标(如果有设置过)。

# blkid

根据名字或 UUID 列出设备

如果你只想显示一个特定设备的信息,你可以将该设备的名字作为选项添加在 blkid 后面:

# blkid /dev/sda1

如果你知道一个设备的 UUID 而想要知道它的设备名,你可以用 -U 选项,像这样:

# blkid -U d3b1dcc2-e3b0-45b0-b703-d6d0d360e524

详细信息

如果你想要获取更多详细信息,你可以使用 -p 和 -o udev 选项来将它们用整齐的格式显示出来,像这样:

# blkid -po udev /dev/sda1
Linux:用 Linux blkid 命令查找块设备详情
Linux:用 Linux blkid 命令查找块设备详情

重置缓存

有时候设备列表可能不会更新,如果遇到这种情况你可以使用 -g 选项来清理 blkid 的缓存,从而清除已经不存在的设备。

# blkid -g

via: http://linoxide.com/linux-command/linux-command-lsblk-blkid/

作者:Adrian Dinu 译者:felixonmars 校对:wxy

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

来源:https://linux.cn/article-4734-1.html

Linux:在 CentOS7.0 上搭建 Chroot 的 Bind DNS 服务器

BIND(Berkeley internet Name Daemon)也叫做NAMED,是现今互联网上使用最为广泛的DNS 服务器程序。这篇文章将要讲述如何在 chroot 监牢中运行 BIND,这样它就无法访问文件系统中除“监牢”以外的其它部分。

例如,在这篇文章中,我会将BIND的运行根目录改为 /var/named/chroot/。当然,对于BIND来说,这个目录就是 /(根目录)。 “jail”(监牢,下同)是一个软件机制,其功能是使得某个程序无法访问规定区域之外的资源,同样也为了增强安全性(LCTT 译注:chroot “监牢”,所谓“监牢”就是指通过chroot机制来更改某个进程所能看到的根目录,即将某进程限制在指定目录中,保证该进程只能对该目录及其子目录的文件进行操作,从而保证整个服务器的安全)。Bind Chroot DNS 服务器的默认“监牢”为 /var/named/chroot。

你可以按照下列步骤,在CentOS 7.0 上部署 Bind Chroot DNS 服务器。

Linux:在 CentOS7.0 上搭建 Chroot 的 Bind DNS 服务器
Linux:在 CentOS7.0 上搭建 Chroot 的 Bind DNS 服务器

1、安装Bind Chroot DNS 服务器

[root@centos7 ~]# yum install bind-chroot bind -y

2、拷贝bind相关文件,准备bind chroot 环境

[root@centos7 ~]# cp -R /usr/share/doc/bind-*/sample/var/named/* /var/named/chroot/var/named/

3、在bind chroot 的目录中创建相关文件

[root@centos7 ~]# touch /var/named/chroot/var/named/data/cache_dump.db
[root@centos7 ~]# touch /var/named/chroot/var/named/data/named_stats.txt
[root@centos7 ~]# touch /var/named/chroot/var/named/data/named_mem_stats.txt
[root@centos7 ~]# touch /var/named/chroot/var/named/data/named.run
[root@centos7 ~]# mkdir /var/named/chroot/var/named/dynamic
[root@centos7 ~]# touch /var/named/chroot/var/named/dynamic/managed-keys.bind

4、 将 Bind 锁定文件设置为可写

[root@centos7 ~]# chmod -R 777 /var/named/chroot/var/named/data
[root@centos7 ~]# chmod -R 777 /var/named/chroot/var/named/dynamic

5、 将 /etc/named.conf 拷贝到 bind chroot目录

[root@centos7 ~]# cp -p /etc/named.conf /var/named/chroot/etc/named.conf

6、 在/etc/named.conf中对 bind 进行配置。

在 named.conf 文件尾添加 example.local 域信息, 创建转发域(Forward Zone)与反向域(Reverse Zone)(LCTT 译注:这里example.local 并非一个真实有效的互联网域名,而是通常用于本地测试的一个域名;如果你需要做权威 DNS 解析,你可以将你拥有的域名如这里所示配置解析。):

[root@centos7 ~]# vi /var/named/chroot/etc/named.conf

 –

..
..
zone "example.local" {
    type master;
    file "example.local.zone";
};
zone "0.168.192.in-addr.arpa" IN {
        type master;
        file "192.168.0.zone";
};
..
..

named.conf 完全配置如下:

//
// named.conf
//
// 由Red Hat提供,将 ISC BIND named(8) DNS服务器
// 配置为暂存域名服务器 (用来做本地DNS解析).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { any; };
        /*
         - 如果你要建立一个 授权域名服务器 服务器, 那么不要开启 recursion(递归) 功能。
         - 如果你要建立一个 递归 DNS 服务器, 那么需要开启recursion 功能。
         - 如果你的递归DNS服务器有公网IP地址, 你必须开启访问控制功能,
           只有那些合法用户才可以发询问. 如果不这么做的话,那么你的服
           服务就会受到DNS 放大攻击。实现BCP38将有效抵御这类攻击。
        */
        recursion yes;
        dnssec-enable yes;
        dnssec-validation yes;
        dnssec-lookaside auto;
        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";
        managed-keys-directory "/var/named/dynamic";
        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
zone "." IN {
        type hint;
        file "named.ca";
};
zone "example.local" {
    type master;
    file "example.local.zone";
};
zone "0.168.192.in-addr.arpa" IN {
        type master;
        file "192.168.0.zone";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

7、 为 example.local 域名创建转发域与反向域文件

a)创建转发域

[root@centos7 ~]# vi /var/named/chroot/var/named/example.local.zone

添加如下内容并保存:

;
;       Addresses and other host information.
;
$TTL 86400
@       IN      SOA     example.local. hostmaster.example.local. (
                               2014101901      ; Serial
                               43200      ; Refresh
                               3600       ; Retry
                               3600000    ; Expire
                               2592000 )  ; Minimum
;       Define the nameservers and the mail servers
               IN      NS      ns1.example.local.
               IN      NS      ns2.example.local.
               IN      A       192.168.0.70
               IN      MX      10 mx.example.local.
centos7          IN      A       192.168.0.70
mx               IN      A       192.168.0.50
ns1              IN      A       192.168.0.70
ns2              IN      A       192.168.0.80

b)创建反向域

[root@centos7 ~]# vi /var/named/chroot/var/named/192.168.0.zone

 –

;
;       Addresses and other host information.
;
$TTL 86400
@       IN      SOA     example.local. hostmaster.example.local. (
                               2014101901      ; Serial
                               43200      ; Refresh
                               3600       ; Retry
                               3600000    ; Expire
                               2592000 )  ; Minimum
0.168.192.in-addr.arpa. IN      NS      centos7.example.local.
70.0.168.192.in-addr.arpa. IN PTR mx.example.local.
70.0.168.192.in-addr.arpa. IN PTR ns1.example.local.
80.0.168.192.in-addr.arpa. IN PTR ns2.example.local.。

8、开机自启动 bind-chroot 服务

[root@centos7 ~]# /usr/libexec/setup-named-chroot.sh /var/named/chroot on
[root@centos7 ~]# systemctl stop named
[root@centos7 ~]# systemctl disable named
[root@centos7 ~]# systemctl start named-chroot
[root@centos7 ~]# systemctl enable named-chroot
ln -s '/usr/lib/systemd/system/named-chroot.service' '/etc/systemd/system/multi-user.target.wants/named-chroot.service'

via: http://www.ehowstuff.com/how-to-setup-bind-chroot-dns-server-on-centos-7-0-vps/

作者:skytech 译者:SPccman 校对:wxy

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

来源:https://linux.cn/article-4735-1.html

Linux:101个MySQL调试和优化技巧

MySQL是一个功能强大的开源数据库。随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限。这里是101条调节和优化 MySQL安装的技巧。一些技巧是针对特定的安装环境的,但这些思路是通用的。我已经把他们分成几类,来帮助你掌握更多MySQL的调节和优化技巧。

Linux:101个MySQL调试和优化技巧
Linux:101个MySQL调试和优化技巧

MySQL 服务器硬件和操作系统调节:

1. 拥有足够的物理内存来把整个InnoDB文件加载到内存中——在内存中访问文件时的速度要比在硬盘中访问时快的多。

2. 不惜一切代价避免使用Swap交换分区 – 交换时是从硬盘读取的,它的速度很慢。

3. 使用电池供电的内存。

4. 使用高级的RAID – 最好是RAID10或更高。

5. 避免RAID5 – 确保数据库完整性的校验是要付出代价的。

6. 将操作系统和数据分区分开,不仅仅是逻辑上,还包括物理上 – 操作系统的读写操作会影响数据库的性能。

7. 把MySQL临时空间和复制日志与数据放到不同的分区 – 当数据库后台从磁盘进行读写操作时会影响数据库的性能。

8. 更多的磁盘空间等于更快的速度。

9. 更好更快的磁盘。

10. 使用 SAS 磁盘代替 SATA 磁盘。

11. 较小的硬盘比较大的硬盘快,尤其是在RAID配置的情况下。

12. 使用电池支持的高速缓存RAID控制器。

13. 避免使用软件磁盘阵列。

14. 考虑为数据分区使用固态IO卡 (不是磁盘驱动器)  – 这些卡能够为几乎任何数量的数据支持2GB/s的写入速度。

15. 在Linux中设置swappiness的值为0 – 在数据库服务器中没有理由缓存文件,这是一个服务器或台式机的优势。

16. 如果可以的话,使用  noatime 和 nodirtime 挂载文件系统 – 没有理由更新访问数据库文件的修改时间。

17. 使用 XFS 文件系统 – 一种比ext3更快、更小的文件系统,并且有许多日志选项, 而且ext3 已被证实与MySQL有双缓冲问题。

18. 调整 XFS 文件系统日志和缓冲变量 – 为了最高性能标准。

19. 在 Linux 系统中, 使用 NOOP 或者 DEADLINE IO 定时调度程序 – 同 NOOP 和 DEADLINE定时调度程序相比,这个 CFQ 和 ANTICIPATORY 定时调度程序 显得非常慢。

20. 使用64位的操作系统 – 对于MySQL,会有更大的内存支持和使用。

21. 删除服务器上未使用的安装包和守护进程 – 更少的资源占用。

22. 把使用MySQL的host和你的MySQL host放到一个hosts文件中 – 没有DNS查找。

23. 切勿强制杀死一个MySQL进程 – 你会损坏数据库和正在运行备份的程序。

24. 把服务器贡献给MySQL – 后台进程和其他服务能够缩短数据库占用CPU的时间。

MySQL 配置:

25. 当写入时,使用 innodb_flush_method=O_DIRECT 来避免双缓冲。

26. 避免使用 O_DIRECT 和 EXT3 文件系统 – 你将序列化所有要写入的。

27. 分配足够的 innodb_buffer_pool_size 来加载整个 InnoDB 文件到内存中– 少从磁盘中读取。

28. 不要将 innodb_log_file_size 参数设置太大, 这样可以更快同时有更多的磁盘空间 – 丢掉多的日志通常是好的,在数据库崩溃后可以降低恢复数据库的时间。

29. 不要混用 innodb_thread_concurrency 和 thread_concurrency 参数– 这2个值是不兼容的。

30. 分配一个极小的数量给 max_connections 参数 – 太多的连接会用尽RAM并锁定MySQL服务。

31. 保持 thread_cache 在一个相对较高的数字,大约 16 – 防止打开连接时缓慢。

32. 使用skip-name-resolve参数 – 去掉 DNS 查找。

33.如果你的查询都是重复的,并且数据不常常发生变化,那么可以使用查询缓存。但是如果你的数据经常发生变化,那么使用查询缓存会让你感到失望。

34.增大temp_table_size值,以防止写入磁盘

35.增大max_heap_table_size值,以防止写入磁盘

36.不要把sort_buffer_size值设置的太高,否则的话你的内存将会很快耗尽

37.根据key_read_requests和key_reads值来决定key_buffer的大小,一般情况下key_read_requests应该比key_reads值高,否则你不能高效的使用key_buffer

38.将innodb_flush_log_at_trx_commit设置为0将会提高性能,但是如果你要保持默认值(1)的话,那么你就要确保数据的完整性,同时你也要确保复制不会滞后。

39.你要有一个测试环境,来测试你的配置,并且在不影响正常生产的情况下,可以常常进行重启。

MySQL模式优化:

40. 保持你的数据库整理性。

41. 旧数据归档 – 删除多余的行返回或搜索查询。

42. 将您的数据加上索引.

43. 不要过度使用索引,比较与查询.

44. 压缩文字和BLOB数据类型 – 以节省空间和减少磁盘读取次数.

45. UTF 8和UTF16都低于latin1执行效率.

46. 有节制地使用触发器.

47. 冗余数据保持到最低限度 – 不重复不必要的数据.

48. 使用链接表,而不是扩展行.

49. 注意数据类型,在您的真实数据中,尽可能使用最小的一个.

50. 如果其他数据经常被用于查询时,而BLOB / TEXT数据不是,就把BLOB / TEXT数据从其他数据分离出来.

51.检查和经常优化表.

52. 经常重写InnoDB表优化.

53. 有时,当添加列时删除索引,然后在添加回来索引,这样就会更快.

54. 针对不同的需求,使用不同的存储引擎.

55. 使用归档存储引擎日志表或审计表-这是更有效地写道.

56.  会话数据存储在缓存(memcache)的而不是MySQL中 – 缓存允许自动自动填值的,并阻止您创建难以读取和写入到MySQL的时空数据.

57.存储可变长度的字符串时使用VARCHAR而不是CHAR – 节省空间,因为固定长度的CHAR,而VARCHAR长度不固定(UTF8不受此影响).

58. 逐步进行模式的变化 – 一个小的变化,可以有巨大的影响.

59.在开发环境中测试所有模式,反映生产变化.

60. 不要随意更改你的配置文件中的值,它可以产生灾难性的影响.

61. 有时候,在MySQL的configs少即是多.

62. 有疑问时使用一个通用的MySQL配置文件.

Linux:101个MySQL调试和优化技巧
Linux:101个MySQL调试和优化技巧

查询优化:

63. 使用慢查询日志去发现慢查询。

64. 使用执行计划去判断查询是否正常运行。

65. 总是去测试你的查询看看是否他们运行在最佳状态下 –久而久之性能总会变化。

66. 避免在整个表上使用count(*),它可能锁住整张表。

67. 使查询保持一致以便后续相似的查询可以使用查询缓存。

68. 在适当的情形下使用GROUP BY而不是DISTINCT。

69. 在WHERE, GROUP BY和ORDER BY子句中使用有索引的列。

70. 保持索引简单,不在多个索引中包含同一个列。

71. 有时候MySQL会使用错误的索引,对于这种情况使用USE INDEX。

72. 检查使用SQL_MODE=STRICT的问题。

73. 对于记录数小于5的索引字段,在UNION的时候使用LIMIT不是是用OR.

74. 为了 避免在更新前SELECT,使用INSERT ON DUPLICATE KEY或者INSERT IGNORE ,不要用UPDATE去实现。

75. 不要使用 MAX,使用索引字段和ORDER BY子句。

76. 避免使用ORDER BY RAND().

77. LIMIT M,N实际上可以减缓查询在某些情况下,有节制地使用。

78. 在WHERE子句中使用UNION代替子查询。

79. 对于UPDATES(更新),使用 SHARE MODE(共享模式),以防止独占锁。

80. 在重新启动的MySQL,记得来温暖你的数据库,以确保您的数据在内存和查询速度快。

81. 使用DROP TABLE,CREATE TABLE DELETE FROM从表中删除所有数据。

82. 最小化的数据在查询你需要的数据,使用*消耗大量的时间。

83. 考虑持久连接,而不是多个连接,以减少开销。

84. 基准查询,包括使用服务器上的负载,有时一个简单的查询可以影响其他查询。

85. 当负载增加您的服务器上,使用SHOW PROCESSLIST查看慢的和有问题的查询。

86. 在开发环境中产生的镜像数据中 测试的所有可疑的查询。

MySQL 备份过程:

87. 从二级复制服务器上进行备份。

88. 在进行备份期间停止复制,以避免在数据依赖和外键约束上出现不一致。

89. 彻底停止MySQL,从数据库文件进行备份。

90. 如果使用 MySQL dump进行备份,请同时备份二进制日志文件 – 确保复制没有中断。

91. 不要信任LVM 快照 – 这很可能产生数据不一致,将来会给你带来麻烦。

92. 为了更容易进行单表恢复,以表为单位导出数据 – 如果数据是与其他表隔离的。

93. 当使用mysqldump时请使用 –opt。

94. 在备份之前检查和优化表。

95. 为了更快的进行导入,在导入时临时禁用外键约束。

96. 为了更快的进行导入,在导入时临时禁用唯一性检测。

97. 在每一次备份后计算数据库,表以及索引的尺寸,以便更够监控数据尺寸的增长。

98. 通过自动调度脚本监控复制实例的错误和延迟。

99. 定期执行备份。

100. 定期测试你的备份。

101: 执行MySQL 监控。

 

来源:http://www.oschina.net/translate/101-tips-to-mysql-tuning-and-optimization

Linux:「毁灭战士3」源码就是“保持简洁”的证明

假如你在网上搜最好的C++源代码。「毁灭战士3 | Doom 3」的源代码肯定会被提到好多次,这篇文章就来证明为何如何说。

我花了一些时间通读了 DOOM3 的源代码。这可能是我见过的最干净最漂亮的代码了。DOOM3是由id Software公司开发、Activision发行的视频游戏。该游戏为id Software赢得了商业上的成功,已售出350万多份拷贝。

Linux:「毁灭战士3」源码就是“保持简洁”的证明
Linux:「毁灭战士3」源码就是“保持简洁”的证明

在2011年11月23日,id Software维持开源传统,发布了他们上一个引擎的源代码。这份源代码已经被很多开发者审查,这里就有个fabien反馈的例子(链接):

DOOM3 BFG是用C++写的,一种庞大的语言,它既能写出优秀的代码,但也让人憎恶到眼睛流血。幸运的是,id Software退而求其次,使用C++子集,接近于“带类的C”,如以下几条规则:

  • 没有异常
  • 没有引用(使用指针)
  • 少用模板
  • 使用常量(Const everywhere)
  • 多态
  • 继承

很多C++专家不建议使用“带类的C”这样的方法。然而,DOOM3从2000开发至2004,没有使用任何现代C++机制。

让我们使用 CppDepend 来看看源代码,探索它的特别之处

DOOM3由少量的几个工程组成,这儿有它的工程列表和一些类型统计。

Linux:「毁灭战士3」源码就是“保持简洁”的证明
Linux:「毁灭战士3」源码就是“保持简洁”的证明

以及它们之间的依赖关系图:

Linux:「毁灭战士3」源码就是“保持简洁”的证明
Linux:「毁灭战士3」源码就是“保持简洁”的证明

DOOM3定义了很多全局函数。但是,大部分内容实现是在类中。

数据模型使用结构体定义。为了在源代码中对结构体的使用有个更具体的理解,在下图中将它们以蓝色分块显示出来。

在图表中,代码被表示为树形图,树形图表示法能使用嵌套的矩形来表示树状结构。而树结构用来表示代码分层结构。

  • 工程包含命名空间。
  • 命名空间包含类型。
  • 类型包含函数和域(field)。
Linux:「毁灭战士3」源码就是“保持简洁”的证明
Linux:「毁灭战士3」源码就是“保持简洁”的证明

我们可以观察到它定义了许多的结构体,比如DoomDLL 40%的类型都是结构体。它们被有条理地用来定义数据模型。该实践已经被很多工程所接受,这种方法有个最大的缺点是多线程应用,结构体的public变量并非不可改变的。

为何支持不可变对象,有个重要原因:能显著地简化并发编程。考虑下,写个合格的多线程程序是个艰巨的任务吗?因为很难同步线程访问资源(对象或者其他OS资源)。为什么同步这些操作很困难呢?因为很难保证在资源竞争状态下多线程对多个对象进行正确的读写操作。假如没有写操作呢?换句话说,线程只访问这些对象,而不做任何变动?这样就不再需要同步操作了!

让我搜索下只有一个基类的类:

Linux:「毁灭战士3」源码就是“保持简洁”的证明
Linux:「毁灭战士3」源码就是“保持简洁”的证明

几乎40%的结构体和类都只有一个基类。通常,OOP(面对对象编程)使用继承的好处之一是多态,下面蓝色标明了源代码中的虚函数:

Linux:「毁灭战士3」源码就是“保持简洁”的证明
Linux:「毁灭战士3」源码就是“保持简洁”的证明

超过30%的函数是虚函数,少数是纯虚函数,下面是所有虚基类列表:

Linux:「毁灭战士3」源码就是“保持简洁”的证明
Linux:「毁灭战士3」源码就是“保持简洁”的证明

只有52个类被定义为虚基类,其中35个类只是纯接口,也就是这些接口都是纯虚函数。

Linux:「毁灭战士3」源码就是“保持简洁”的证明
Linux:「毁灭战士3」源码就是“保持简洁”的证明

我们来搜搜使用了RTTI的函数

Linux:「毁灭战士3」源码就是“保持简洁”的证明
Linux:「毁灭战士3」源码就是“保持简洁”的证明

只有非常少的函数使用了RTTI。

为保证只使用OOP最基础的概念,不使用高级设计模式,不过度使用接口和虚基类,限制了RTTI的使用并且数据都定义为结构体。

至此这份代码跟很多C++开发者所批评的“带类的C”没太大区别。

开发者的一些有趣的选择,帮助我们理解它的奥秘:

1-为有用的服务提供公用的基础类。

许多类是从idClass继承下来的:

Linux:「毁灭战士3」源码就是“保持简洁”的证明
Linux:「毁灭战士3」源码就是“保持简洁”的证明

idClass提供如下服务:

  1. 创建实例化
  2. 类型管理
  3. 事件管理
Linux:「毁灭战士3」源码就是“保持简洁”的证明
Linux:「毁灭战士3」源码就是“保持简洁”的证明

2-方便的字符串操作

一般来说,字符串是一个项目里用的最多的对象,许多地方需要使用它,并且需要函数来对其进行操作。

DOOM3定义了idstr类,几乎包含了所有用的字符串操作函数,无需再自己定义函数来接受其它框架所提供的字符串类。

3-源代码与GUI框架(MFC)高度解耦

很多工程用了MFC后,它的代码就会与MFC类型高度耦合,并且在代码的任何一处都能发现MFC类型。

在DOOM3里,代码和MFC是高度解耦的,只有GUI类才会直接依赖它。下面的CQLinq查询可以展示这点:

Linux:「毁灭战士3」源码就是“保持简洁”的证明
Linux:「毁灭战士3」源码就是“保持简洁”的证明

这样的选择对生产力有很大的影响。事实上,只有GUI开发者才会关心MFC框架,其它开发者不应该被强制在MFC上浪费时间。

4-提供了非常好的公共函数库(idlib)

几乎在所有项目中都会用到公共工具类,就如以下查询的结果:

Linux:「毁灭战士3」源码就是“保持简洁”的证明
Linux:「毁灭战士3」源码就是“保持简洁”的证明

正如我们所看到经常使用的就是公共工具类。假如C++开发者不使用一个良好的公共工具框架,那就会为解决技术层面问题花费大部分的开发时间。

idlib提供了很多有用的类用于字符串处理,容器和内存。有效促进了开发者的工作,并且能让他们更多的关注在游戏逻辑上。

5-实现非常易于理解

DOOM3实现了非常难的编译器,对于C++开发者而言,开发语法解析器和编译器不是件轻松的事。尽管如此,DOOM3的实现非常容易被理解并且编写得十分干净。

这儿有这些编译器的类的依赖图:

Linux:「毁灭战士3」源码就是“保持简洁”的证明
Linux:「毁灭战士3」源码就是“保持简洁”的证明

这儿还有编译器源代码的代码片段:

Linux:「毁灭战士3」源码就是“保持简洁”的证明
Linux:「毁灭战士3」源码就是“保持简洁”的证明

我们也看过许多语法解析器和编译器的代码,但这是第一次我们发现编译器是如此得容易理解,和整个DOOM3源代码一样。这太神奇了。当我们探究DOOM3源代码时,我们忍不住会喊:喔,这太漂亮了!

总结

即使DOOM3选择了很基础的设计,但它的设计者所做的决定都是为了开发者能更多的关注游戏逻辑本身,并且为所有技术层面的东西提供便利。这提高了多大的生产力啊。

无论何时使用“带类的C”,你应该明白你自己在干什么。你必须像DOOM3的开发专家一样。但不推荐初学者忽视现代C++建议而冒险。

来源:http://blog.jobbole.com/83438/

Linux:如何在Ubuntu上找出可用的网络适配器

Linux:如何在Ubuntu上找出可用的网络适配器
Linux:如何在Ubuntu上找出可用的网络适配器

想知道在Linux中你正在使用的网卡是什么吗? 在Linux中很容易就找出网卡的生产商。打开一个终端并输入下面的额命令:

sudo lshw -C network

如果上面的命令不能在sudo下使用,那就别用 sudo 的特权模式。它的输出看上去有点奇怪但是很有用。

Linux:如何在Ubuntu上找出可用的网络适配器
Linux:如何在Ubuntu上找出可用的网络适配器
*-network
    description: Wireless interface
    product: BCM4360 802.11ac Wireless Network Adapter
    vendor: Broadcom Corporation
    physical id: 0
    bus info: pci@0000:03:00.0
    logical name: wlan0
    version: 03
    serial: 9c:f3:87:c1:5d:6a
    width: 64 bits
    clock: 33MHz
    capabilities: busmaster caplist ethernet physical wireless
    configuration: broadcast=yes driver=wl0 driverversion=6.30.223.248 (r487574) ip=192.168.1.23 latency=0 multicast=yes wireless=IEEE 802.11abg
    resources: irq:18 memory:b0600000-b0607fff memory:b0400000-b05fffff

如你所见,我Macbook Air上的无线网卡是BCM4360,这是一款在Ubuntu下面很容易出现无法检测无线网络问题的网卡。

lshw 命令实际上是用来列出硬件的,因此命令的名字是lshw。带上网络的选项后,就会只过滤出网络硬件了。

了解网卡的其他方法

另外你还可以使用lspci命令来显示PCI总线上的信息。你应该使用普通用户来运行这个命令。只需要在命令行下输入:

lspci

命令的输出看上去想这样:

Linux:如何在Ubuntu上找出可用的网络适配器
Linux:如何在Ubuntu上找出可用的网络适配器
00:00.0 Host bridge: Intel Corporation Haswell-ULT DRAM Controller (rev 09)
00:02.0 VGA compatible controller: Intel Corporation Haswell-ULT Integrated Graphics Controller (rev 09)
00:03.0 Audio device: Intel Corporation Haswell-ULT HD Audio Controller (rev 09)
00:14.0 USB controller: Intel Corporation 8 Series USB xHCI HC (rev 04)
00:16.0 Communication controller: Intel Corporation 8 Series HECI #0 (rev 04)
00:1b.0 Audio device: Intel Corporation 8 Series HD Audio Controller (rev 04)
00:1c.0 PCI bridge: Intel Corporation 8 Series PCI Express Root Port 1 (rev e4)
00:1c.1 PCI bridge: Intel Corporation 8 Series PCI Express Root Port 2 (rev e4)
00:1c.2 PCI bridge: Intel Corporation 8 Series PCI Express Root Port 3 (rev e4)
00:1c.4 PCI bridge: Intel Corporation 8 Series PCI Express Root Port 5 (rev e4)
00:1c.5 PCI bridge: Intel Corporation 8 Series PCI Express Root Port 6 (rev e4)
00:1f.0 ISA bridge: Intel Corporation 8 Series LPC Controller (rev 04)
00:1f.3 SMBus: Intel Corporation 8 Series SMBus Controller (rev 04)
02:00.0 Multimedia controller: Broadcom Corporation Device 1570
03:00.0 Network controller: Broadcom Corporation BCM4360 802.11ac Wireless Network Adapter (rev 03)
04:00.0 SATA controller: Marvell Technology Group Ltd. 88SS9183 PCIe SSD Controller (rev 14)

这些命令会同时列出有线和无线的网卡。你应该注意到上面的输出中显示我的系统中没有有线网卡。因为我使用的是Macbook Air,它没有以太网端口

我希望这边文章可以帮助你找到你系统中的网卡。欢迎提出问题和建议。


via: http://itsfoss.com/find-network-adapter-ubuntu-linux/

作者:Abhishek 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-4740-1.html

Linux:一个可以显示Linux命令运行进度的伟大工具

Coreutils Viewer(cv)是一个简单的程序,它可以用于显示任何核心组件命令(如:cp、mv、dd、tar、gzip、gunzip、cat、grep、fgrep、egrep、cut、sort、xz、exiting)的进度。它使用文件描述信息来确定一个命令的进度,比如cp命令。cv之美在于,它能够和其它Linux命令一起使用,比如你所知道的watch以及I/O重定向命令。这样,你就可以在脚本中使用,或者你能想到的所有方式,别让你的想象力束缚住你。

Linux:一个可以显示Linux命令运行进度的伟大工具
Linux:一个可以显示Linux命令运行进度的伟大工具

安装

你可以从cv的github仓库那儿下载所需的源文件。把zip文件下载下来后,将它解压缩,然后进入到解压后的文件夹。

该程序需要ncurses library。如果你已经在你的Linux系统中安装了ncurses,那么cv的安装过程对你而言就是那么的轻松写意。

通过以下两个简单步骤来进行编译和安装吧。

$ make
$ sudo make install

运行cv

要运行cv,只需要想其它程序一样,在命令行输入此命令即可。如果你没有执行make install,而选择从当前目录中去运行,那么你可以运行以下命令:

$ ./cv

否则,就运行以下命令吧。

$ cv

如果没有核心组件命令在运行,那么cv程序会退出,并告诉你:没有核心组件命令在运行。

cv no command

要有效使用该程序,请在你系统上运行某个核心组件程序。在本例中,我们将使用cp命令。

当拷贝一个打文件时,你就可以看到当前进度了,以百分比显示。

Linux:一个可以显示Linux命令运行进度的伟大工具
Linux:一个可以显示Linux命令运行进度的伟大工具

添加选项到 cv

你也可以添加几个选项到cv命令,就像其它命令一样。一个有用的选项是让你了解到拷贝或移动大文件时的预计剩余时间。

添加-w选项,它就会帮你显示预计的剩余时间。

$ cv -w
Linux:一个可以显示Linux命令运行进度的伟大工具
Linux:一个可以显示Linux命令运行进度的伟大工具

试着添加更多的命令选项吧。像下面这样添加其它选项:

$ cv -wq

cv 和 watch 命令

watch是一个用于周期性运行程序并显示输出结果的程序。有时候,你可能想要持续看看命令运行状况而不想将 cv 的结果存储到日志文件中。在这种情况下,watch就会派上用场了,它可以和cv一起使用。

$ watch cv -qw

该命令将会显示所有运行着的核心组件命令的实例。它也会显示进度和预计完成时间。

Linux:一个可以显示Linux命令运行进度的伟大工具
Linux:一个可以显示Linux命令运行进度的伟大工具

在日志文件中查看输出结果

正如其所承诺的那样,你可以使用cv来重定向它的输出结果到一个日志文件。这功能在命令运行太快而看不到任何有意义的内容时特别有用。

要在日志文件中查看进度,你仅仅需要重定向输出结果,就像下面这样。

$ cv -w >> log.txt

要查看该命令的输出结果,请用你喜爱的文本编辑器打开日志文件,也可以用cat命令,就像下面这样:

$ cat log.txt

获得帮助

如果你在任何地方受到阻碍,你总是可以通过查阅手册页或使用help选项来获取帮助信息。 要获取帮助信息,可以使用带-h选项的cv命令。

$ cv -h

如果需要更多详细信息,那么手册页是个很不错的地方。

$ man cv

但是,要获取上述手册页,你必须执行make install来安装cv。

耶!现在,你的Linux工具箱中又多了个伟大的工具。 你学会么?亲自去试试吧~


via: http://linoxide.com/linux-command/tool-show-command-progress/

作者:Allan Mbugua 译者:GOLinux 校对:wxy

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

来源:https://linux.cn/article-4741-1.html

Linux:10个重要的Linux ps命令实战

Linux作为Unix的衍生操作系统,Linux内建有查看当前进程的工具ps。这个工具能在命令行中使用。

Linux:10个重要的Linux ps命令实战
Linux:10个重要的Linux ps命令实战

PS 命令是什么

查看它的man手册可以看到,ps命令能够给出当前系统中进程的快照。它能捕获系统在某一事件的进程状态。如果你想不断更新查看的这个状态,可以使用top命令。

ps命令支持三种使用的语法格式

  1. UNIX 风格,选项可以组合在一起,并且选项前必须有“-”连字符
  2. BSD 风格,选项可以组合在一起,但是选项前不能有“-”连字符
  3. GNU 风格的长选项,选项前有两个“-”连字符

我们能够混用这几种风格,但是可能会发生冲突。本文使用 UNIX 风格的ps命令。这里有在日常生活中使用较多的ps命令的例子。

1. 不加参数执行ps命令

这是一个基本的 ps 使用。在控制台中执行这个命令并查看结果。

不加选项执行ps命令

结果默认会显示4列信息。

  • PID: 运行着的命令(CMD)的进程编号
  • TTY: 命令所运行的位置(终端)
  • TIME: 运行着的该命令所占用的CPU处理时间
  • CMD: 该进程所运行的命令

这些信息在显示时未排序。

2. 显示所有当前进程

使用 -a 参数。-a 代表 all。同时加上x参数会显示没有控制终端的进程。

$ ps -ax

这个命令的结果或许会很长。为了便于查看,可以结合less命令和管道来使用。

$ ps -ax | less
Linux:10个重要的Linux ps命令实战
Linux:10个重要的Linux ps命令实战

3. 根据用户过滤进程

在需要查看特定用户进程的情况下,我们可以使用 -u 参数。比如我们要查看用户’pungki’的进程,可以通过下面的命令:

$ ps -u pungki
Linux:10个重要的Linux ps命令实战
Linux:10个重要的Linux ps命令实战

4. 通过cpu和内存使用来过滤进程

也许你希望把结果按照 CPU 或者内存用量来筛选,这样你就找到哪个进程占用了你的资源。要做到这一点,我们可以使用 aux 参数,来显示全面的信息:

$ ps -aux | less
Linux:10个重要的Linux ps命令实战
Linux:10个重要的Linux ps命令实战

当结果很长时,我们可以使用管道和less命令来筛选。

默认的结果集是未排好序的。可以通过 –sort命令来排序。

根据 CPU 使用来升序排序

$ ps -aux --sort -pcpu | less
Linux:10个重要的Linux ps命令实战
Linux:10个重要的Linux ps命令实战

根据 内存使用 来升序排序

$ ps -aux --sort -pmem | less
Linux:10个重要的Linux ps命令实战
Linux:10个重要的Linux ps命令实战

我们也可以将它们合并到一个命令,并通过管道显示前10个结果:

$ ps -aux --sort -pcpu,+pmem | head -n 10

5. 通过进程名和PID过滤

使用 -C 参数,后面跟你要找的进程的名字。比如想显示一个名为getty的进程的信息,就可以使用下面的命令:

$ ps -C getty

通过进程名和PID过滤

如果想要看到更多的细节,我们可以使用-f参数来查看格式化的信息列表:

$ ps -f -C getty

通过进程名和PID过滤

6. 根据线程来过滤进程

如果我们想知道特定进程的线程,可以使用-L 参数,后面加上特定的PID。

$ ps -L 1213

根据线程来过滤进程

7. 树形显示进程

有时候我们希望以树形结构显示进程,可以使用 -axjf 参数。

$ps -axjf

树形显示进程

或者可以使用另一个命令。

$ pstree
Linux:10个重要的Linux ps命令实战
Linux:10个重要的Linux ps命令实战

8. 显示安全信息

如果想要查看现在有谁登入了你的服务器。可以使用ps命令加上相关参数:

$ ps -eo pid,user,args

参数 -e 显示所有进程信息,-o 参数控制输出。Pid,User 和 Args参数显示PID,运行应用的用户该应用

显示安全信息

能够与-e 参数 一起使用的关键字是args, cmd, comm, command, fname, ucmd, ucomm, lstart, bsdstart 和 start

9. 格式化输出root用户(真实的或有效的UID)创建的进程

系统管理员想要查看由root用户运行的进程和这个进程的其他相关信息时,可以通过下面的命令:

$ ps -U root -u root u

-U 参数按真实用户ID(RUID)筛选进程,它会从用户列表中选择真实用户名或 ID。真实用户即实际创建该进程的用户。

-u 参数用来筛选有效用户ID(EUID)。

最后的u参数用来决定以针对用户的格式输出,由User, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME 和 COMMAND这几列组成。

这里有上面的命令的输出结果:

Linux:10个重要的Linux ps命令实战
Linux:10个重要的Linux ps命令实战

10. 使用PS实时监控进程状态

ps 命令会显示你系统当前的进程状态,但是这个结果是静态的。

当有一种情况,我们需要像上面第四点中提到的通过CPU和内存的使用率来筛选进程,并且我们希望结果能够每秒刷新一次。为此,我们可以将ps命令和watch命令结合起来

$ watch -n 1 ‘ps -aux --sort -pmem, -pcpu’
Linux:10个重要的Linux ps命令实战
Linux:10个重要的Linux ps命令实战

如果输出太长,我们也可以限制它,比如前20条,我们可以使用head命令来做到。

$ watch -n 1 ‘ps -aux --sort -pmem, -pcpu | head 20’
Linux:10个重要的Linux ps命令实战
Linux:10个重要的Linux ps命令实战

这里的动态查看并不像top或者htop命令一样。但是使用ps的好处是你能够定义显示的字段,你能够选择你想查看的字段。

举个例子,如果你只需要看名为’pungki’用户的信息,你可以使用下面的命令:

$ watch -n 1 ‘ps -aux -U pungki u --sort -pmem, -pcpu | head 20’
Linux:10个重要的Linux ps命令实战
Linux:10个重要的Linux ps命令实战

结论

你也许每天都会使用ps命令来监控你的Linux系统。但是事实上,你可以通过ps命令的参数来生成各种你需要的报表。

ps命令的另一个优势是ps是各种 Linux系统都默认安装的,因此你只要用就行了。

不要忘了通过 man ps来查看更多的参数。(LCTT 译注:由于 ps 命令古老而重要,所以它在不同的 UNIX、BSD、Linux 等系统中的参数不尽相同,因此如果你用的不是 Linux 系统,请查阅你的文档了解具体可用的参数。)


via: http://linoxide.com/how-tos/linux-ps-command-examples/

作者:Pungki Arianto 译者:johnhoow 校对:wxy

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

来源:https://linux.cn/article-4743-1.html

Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率
Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

Linux内核是一名了不起的马戏表演者,它在进程和系统资源间小心地玩着杂耍,并保持系统的正常运转。 同时,内核也很公正:它将资源公平地分配给各个进程。

但是,如果你需要给一个重要进程提高优先级时,该怎么做呢? 或者是,如何降低一个进程的优先级? 又或者,如何限制一组进程所使用的资源呢?

答案是需要由用户来为内核指定进程的优先级

大部分进程启动时的优先级是相同的,因此Linux内核会公平地进行调度。 如果想让一个CPU密集型的进程运行在较低优先级,那么你就得事先配置好调度器。

下面介绍3种控制进程运行时间的方法:

  • 使用 nice 命令手动降低任务的优先级。
  • 使用 cpulimit 命令不断的暂停进程,以控制进程所占用处理能力不超过特定限制。
  • 使用linux内建的control groups(控制组)功能,它提供了限制进程资源消耗的机制。

我们来看一下这3个工具的工作原理和各自的优缺点。

模拟高cpu占用率

在分析这3种技术前,我们要先安装一个工具来模拟高CPU占用率的场景。我们会用到CentOS作为测试系统,并使用Mathomatic toolkit中的质数生成器来模拟CPU负载。

很不幸,在CentOS上这个工具没有预编译好的版本,所以必须要从源码进行安装。先从 http://mathomatic.orgserve.de/mathomatic-16.0.5.tar.bz2 这个链接下载源码包并解压。然后进入 mathomatic-16.0.5/primes 文件夹,运行 makesudo make install 进行编译和安装。这样,就把 matho-primes 程序安装到了 /usr/local/bin 目录中。

接下来,通过命令行运行:

/usr/local/bin/matho-primes 0 9999999999 > /dev/null &

程序运行后,将输出从0到9999999999之间的质数。因为我们并不需要这些输出结果,直接将输出重定向到/dev/null就好。

现在,使用top命令就可以看到matho-primes进程榨干了你所有的cpu资源。

Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率
Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

好了,接下来(按q键)退出 top 并杀掉 matho-primes 进程(使用 fg 命令将进程切换到前台,再按 CTRL+C)

nice命令

下面介绍一下nice命令的使用方法,nice命令可以修改进程的优先级,这样就可以让进程运行得不那么频繁。 这个功能在运行cpu密集型的后台进程或批处理作业时尤为有用。 nice值的取值范围是[-20,19],-20表示最高优先级,而19表示最低优先级。 Linux进程的默认nice值为0。使用nice命令(不带任何参数时)可以将进程的nice值设置为10。这样调度器就会将此进程视为较低优先级的进程,从而减少cpu资源的分配。

下面来看一个例子,我们同时运行两个 matho-primes 进程,一个使用nice命令来启动运行,而另一个正常启动运行:

nice matho-primes 0 9999999999 > /dev/null &
matho-primes 0 9999999999 > /dev/null &

再运行top命令。

Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率
Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

看到没,正常运行的进程(nice值为0)获得了更多的cpu运行时间,相反的,用nice命令运行的进程占用的cpu时间会较少(nice值为10)。

在实际使用中,如果你要运行一个CPU密集型的程序,那么最好用nice命令来启动它,这样就可以保证其他进程获得更高的优先级。 也就是说,即使你的服务器或者台式机在重载的情况下,也可以快速响应。

nice 还有一个关联命令叫做 renice,它可以在运行时调整进程的 nice 值。使用 renice 命令时,要先找出进程的 PID。下面是一个例子:

renice +10 1234

其中,1234是进程的 PID。

测试完 nicerenice 命令后,记得要将 matho-primes 进程全部杀掉。

cpulimit命令

接下来介绍 cpulimit 命令的用法。 cpulimit 命令的工作原理是为进程预设一个 cpu 占用率门限,并实时监控进程是否超出此门限,若超出则让该进程暂停运行一段时间。cpulimit 使用 SIGSTOP 和 SIGCONT 这两个信号来控制进程。它不会修改进程的 nice 值,而是通过监控进程的 cpu 占用率来做出动态调整。

cpulimit 的优势是可以控制进程的cpu使用率的上限值。但与 nice 相比也有缺点,那就是即使 cpu 是空闲的,进程也不能完全使用整个 cpu 资源。

在 CentOS 上,可以用下面的方法来安装它:

wget -O cpulimit.zip https://github.com/opsengine/cpulimit/archive/master.zip
unzip cpulimit.zip
cd cpulimit-master
make
sudo cp src/cpulimit /usr/bin

上面的命令行,会先从从 GitHub 上将源码下载到本地,然后再解压、编译、并安装到 /usr/bin 目录下。

cpulimit 的使用方式和 nice 命令类似,但是需要用户使用 -l 选项显式地定义进程的 cpu 使用率上限值。举例说明:

cpulimit -l 50 matho-primes 0 9999999999 > /dev/null &
Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率
Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

从上面的例子可以看出 matho-primes 只使用了50%的 cpu 资源,剩余的 cpu 时间都在 idle。

cpulimit 还可以在运行时对进程进行动态限制,使用 -p 选项来指定进程的 PID,下面是一个实例:

cpulimit -l 50 -p 1234

其中,1234是进程的 PID。

cgroups 命令集

最后介绍,功能最为强大的控制组(cgroups)的用法。cgroups 是 Linux 内核提供的一种机制,利用它可以指定一组进程的资源分配。 具体来说,使用 cgroups,用户能够限定一组进程的 cpu 占用率、系统内存消耗、网络带宽,以及这几种资源的组合。

对比nice和cpulimit,cgroups 的优势在于它可以控制一组进程,不像前者仅能控制单进程。同时,nice 和 cpulimit 只能限制 cpu 使用率,而 cgroups 则可以限制其他进程资源的使用。

对 cgroups 善加利用就可以控制好整个子系统的资源消耗。就拿 CoreOS 作为例子,这是一个专为大规模服务器部署而设计的最简化的 Linux 发行版本,它的 upgrade 进程就是使用 cgroups 来管控。这样,系统在下载和安装升级版本时也不会影响到系统的性能。

下面做一下演示,我们将创建两个控制组(cgroups),并对其分配不同的 cpu 资源。这两个控制组分别命名为“cpulimited”和“lesscpulimited”。

使用 cgcreate 命令来创建控制组,如下所示:

sudo cgcreate -g cpu:/cpulimited
sudo cgcreate -g cpu:/lesscpulimited

其中“-g cpu”选项用于设定 cpu 的使用上限。除 cpu 外,cgroups 还提供 cpuset、memory、blkio 等控制器。cpuset 控制器与 cpu 控制器的不同在于,cpu 控制器只能限制一个 cpu 核的使用率,而 cpuset 可以控制多个 cpu 核。

cpu 控制器中的 cpu.shares 属性用于控制 cpu 使用率。它的默认值是 1024,我们将 lesscpulimited 控制组的 cpu.shares 设为1024(默认值),而 cpulimited 设为512,配置后内核就会按照2:1的比例为这两个控制组分配资源。

要设置 cpulimited 组的 cpu.shares 为 512,输入以下命令:

sudo cgset -r cpu.shares=512 cpulimited

使用 cgexec 命令来启动控制组的运行,为了测试这两个控制组,我们先用cpulimited 控制组来启动 matho-primes 进程,命令行如下:

sudo cgexec -g cpu:cpulimited /usr/local/bin/matho-primes 0 9999999999 > /dev/null &

打开 top 可以看到,matho-primes 进程占用了所有的 cpu 资源。

Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率
Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

因为只有一个进程在系统中运行,不管将其放到哪个控制组中启动,它都会尽可能多的使用cpu资源。cpu 资源限制只有在两个进程争夺cpu资源时才会生效。

那么,现在我们就启动第二个 matho-primes 进程,这一次我们在 lesscpulimited 控制组中来启动它:

sudo cgexec -g cpu:lesscpulimited /usr/local/bin/matho-primes 0 9999999999 > /dev/null &

再打开 top 就可以看到,cpu.shares 值大的控制组会得到更多的 cpu 运行时间。

Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率
Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

现在,我们再在 cpulimited 控制组中增加一个 matho-primes 进程:

sudo cgexec -g cpu:cpulimited /usr/local/bin/matho-primes 0 9999999999 > /dev/null &
Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率
Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

看到没,两个控制组的 cpu 的占用率比例仍然为2:1。其中,cpulimited 控制组中的两个 matho-primes 进程获得的cpu 时间基本相当,而另一组中的 matho-primes 进程显然获得了更多的运行时间。

更多的使用方法,可以在 Red Hat 上查看详细的 cgroups 使用说明。(当然CentOS 7也有)

使用Scout来监控cpu占用率

监控cpu占用率最为简单的方法是什么?Scout 工具能够监控能够自动监控进程的cpu使用率和内存使用情况。

Scout的触发器(trigger)功能还可以设定 cpu 和内存的使用门限,超出门限时会自动产生报警。

从这里可以获取 Scout 的试用版。

总结

Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率
Linux:使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

计算机的系统资源是非常宝贵的。上面介绍的这3个工具能够帮助大家有效地管理系统资源,特别是cpu资源:

  • nice可以一次性调整进程的优先级。
  • cpulimit在运行cpu密集型任务且要保持系统的响应性时会很有用。
  • cgroups是资源管理的瑞士军刀,同时在使用上也很灵活。

via: http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups

译者:coloka 校对:wxy

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

来源:https://linux.cn/article-4742-1.html

Linux:使用Docker镜像构建RPM包

Linux:使用Docker镜像构建RPM包
Linux:使用Docker镜像构建RPM包

【编者的话】RPM(Red Hat Package Manager)是用于 Linux 分发版的最常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件。而RPM包的构建相当繁琐,并且对环境的要求比较高, 本文作者介绍了如何借助Docker来构建可以适用多个平台的RPM包。

在一个内部项目中,我一直在思考如何通过非CI工具/流程生成RPM包,我想手动生成RPM包,这样我可以测试它们是否能正常安装,并用于正常的冒烟测试(译者注:冒烟测试就是在每日构建完成后,对系统的基本功能进行简单的测试。这种测试强调功能的覆盖率,而不对功能的正确性进行验证)。

在我们的CI流程中,Docker算是个全能手,所以我也在想能否将Docker镜像和RPM结合起来。理想的情况下,让RPM与Docker集成, 这样,创建RPM包的过程其实就是在构建一个Docker镜像。基本上,RPM包的%prep部分的构建可以在一个特殊的Docker镜像中快速完成,然 后将生成的RPM包返回给主机。

这种方式的的优点在于,你的RPM包是在一个相对封闭且可再生的环境中构建的,所以你可以快速的为CentOS、Fedora、RHEL等其它系统构建RPM包。

我相信还有其它的一些变通方法也可以完成这样的工作,比如chroot之类的。但如果在RPM中内建这种打包机制(通过chroot/Docker或者别的容器技术抽象而来的系统来完成打包工作)的话,我想会更好。

由于我的项目还没有完成,所以我只是对我的想法进行了验证:简单构建一个包含依赖的镜像。

这是一个使用PBR生成版本 的Python项目。 首先我在build目录中生成一个tarball,然后得到生成的版本号,紧接着修改spec文件中的版本号,然后开始用新的tar包和spec文件构建 镜像。最后运行镜像,并挂载卷(Volume)到本地目录。当运行容器中的start.sh脚本之后,镜像就运行起来了。

start.sh相当简单。 它构建好RPM包后,以root身份把它拷贝到卷目录下, 还可以从主机上将它拷贝到output目录。我没有将它拷贝或者说更新到类似swift之类的对象存储系统,因为我还要在CI中使用它,所以就使用本地文件拷贝了。

在SPECS/project.spec以及 SOURCES/* 是标准RPM包需要的spec文件,源文件和patch文件。需要做的唯一一件事是定义%define_version宏,并在spec文件中使用它。下面是我的一些脚本。

主脚本build.sh。 可以从CI中运行。

#!/bin/bash
set -exf
PROJECT=myproject
CURDIR=$(dirname $(readlink -f $0))
TOPDIR=$(git rev-parse --show-topklevel 2>/dev/null)
rm -rf ${CURDIR}/.build/rpm
mkdir -p ${CURDIR}/.build/rpm/{BUILD,SRPMS,SPECS,RPMS/noarch}
cp -r ${CURDIR}/SOURCES ${CURDIR}/.build/rpm
pushd ${TOPDIR} >/dev/null
python setup.py sdist --dist-dir ${CURDIR}/.build/rpm/SOURCES/
SALADIER_VERSION=$(sed -n '/^Version/ { s/.* //; p}' ${PROJECT}.egg-info/PKG-INFO)
popd >/dev/null
sed -e "s/%define _version.*/%define _version ${SALADIER_VERSION}/" ${CURDIR}/SPECS/${MYROJECT}.spec > 
        ${CURDIR}/.build/rpm/SPECS/${MYPROJECT}.spec
docker build -t chmouel/buildrpm ${CURDIR}
docker run -v $CURDIR/.build:/data -it chmouel/buildrpm
if [[ -n ${ARTIFACT_DIR} ]];then
    rm -rf ${ARTIFACT_DIR}/rpm
    cp -a ${CURDIR}/.build/output ${ARTIFACT_DIR}/rpm
fi

DockerFile,为Docker 缓存做了一些优化:

FROM fedora:21
MAINTAINER Chmouel Boudjnah 
RUN yum -y groupinstall 'Development Tools'
RUN yum -y install fedora-packager
RUN yum -y install yum-utils
RUN yum -y install sudo
RUN sed -i.bak -n -e '/^Defaults.*requiretty/ { s/^/# /;};/^%wheel.*ALL$/ { s/^/# / ;} ;/^#.*wheel.*NOPASSWD/ { s/^#[ ]*//;};p' /etc/sudoers
RUN yum install -y https://rdo.fedorapeople.org/rdo-release.rpm
# This is an optimisation for caching, since using the auto generated one will
# make docker always run the builddep steps since new file
ADD SPECS/project.spec /tmp/
RUN yum-builddep -y /tmp/project.spec
ADD bin/start.sh /start.sh
RUN useradd -s /bin/bash -G adm,wheel,systemd-journal -m rpm
WORKDIR /home/rpm
CMD /start.sh
ADD .build/rpm/ /home/rpm/rpmbuild/
RUN chown -R rpm: /home/rpm
USER rpm

以及从容器中运行的start.sh脚本

#!/bin/bash
# script run inside the container
rpmbuild -ba rpmbuild/SPECS/project.spec || exit 1
[[ -d /data ]] || exit 0
sudo rm -rf /data/output
sudo cp -a rpmbuild/RPMS/noarch /data/output

脚本可能无法直接在你的环境中使用,但至少能让你了解这个idea。

来源:http://dockerone.com/article/138

Linux:如何在Linux的命令行中使用Evernote

这周让我们继续学习如何使用Linux命令行管理和组织信息。在命令行中管理你的个人花费后,我建议你在命令行中管理你的笔记,特别是当你用Evernote记录笔记时。要是你从来没有听说过它,Evernote 专门有一个用户友好的在线服务可以在不同的设备间同步笔记。除了提供花哨的基于Web的API,Evernote还发布了在Windows、Mac、Android和iOS上的客户端。然而至今还没有官方的Linux客户端可用。老实说在众多的非官方Linux客户端中,有一个程序一出现就吸引了所有的命令行爱好者,它就是Geeknote

Linux:如何在Linux的命令行中使用Evernote
Linux:如何在Linux的命令行中使用Evernote

Geeknote 的安装

Geeknote是使用Python开发的。因此,在开始之前请确保你已经安装了Python(最好是2.7的版本)和git。

在 Debian、 Ubuntu 和 Linux Mint 中

$ sudo apt-get install python2.7 git python-setuptools
$ git clone git://github.com/VitaliyRodnenko/geeknote.git
$ cd geeknote
$ sudo python2.7 setup.py install

在 Fedora 或者 CentOS/RHEL 中

$ sudo yum install git
$ git clone git://github.com/VitaliyRodnenko/geeknote.git
$ cd geeknote
$ sudo python setup.py install

在 Arch Linux 中

对于ArchLinux用户,只需要使用AUR中的包。

Geeknote 的基本使用

一旦你安装完Geeknote后,你应该将Geeknote与你的Evernote账号关联:

$ geeknote login

接着输入你的email地址、密码和你的二步验证码。如果你没有后者的话,忽略它并按下回车。

显然你需要一个Evernote账号来完成这些,因此先去注册吧。

完成这些之后,你就可以开始创建新的笔记并编辑它们了。

不过首先,你还需要设置你最喜欢的文本编辑器:

$ geeknote settings --editor vim

然后,一般创建一条新笔记的语法是:

$ geeknote create --title [title of the new note] (--content [content] --tags [comma-separated tags] --notebook [comma-separated notebooks])

上面的命令中,只有‘title’是必须的,它会与一条新笔记的标题相关联。其他的标注可以为笔记添加额外的元数据:添加标签来与你的笔记关联、指定放在那个笔记本里。同样,如果你的标题或者内容中有空格,不要忘记将它们放在引号中。

比如:

$ geeknote create --title "My note" --content "This is a test note" --tags "finance, business, important" --notebook "Family"

然后,你可以编辑你的笔记。语法很相似:

$ geeknote edit --note [title of the note to edit] (--title [new title] --tags [new tags] --notebook [new notebooks])

注意可选的参数如新的标题、标签和笔记本,用来修改笔记的元数据。你也可以用下面的命令重命名笔记:

$ geeknote edit --note [old title] --title [new title]

现在基本的创建和编辑已经完成了,更高级的特性是搜索和删除。你可以下面的语法搜索你的笔记:

$ geeknote find --search [text-to-search] --tags [comma-separated tags] --notebook [comma-separated notebooks] --date [date-or-date-range] --content-search

默认地上面的命令会通过标题搜索笔记。 用”–content-search”选项,就可以按内容搜索。

比如:

$ geeknote find --search "*restaurant" --notebooks "Family" --date 31.03.2014-31.08.2014

显示指定标题的笔记:

$ geeknote show [title]
Linux:如何在Linux的命令行中使用Evernote
Linux:如何在Linux的命令行中使用Evernote

我最喜欢使用的一个技巧是使用:

$ geeknote show "*"

这会显示所有的笔记并允许你在这中选择一个。

删除一条笔记:

$ geeknote remove --note [title]

小心这是真正的删除。它会从云存储中删除这条笔记。

最后有很多的选项来管理标签和笔记本。我想最有用的就是显示笔记本列表。

$ geeknote notebook-list

下面的命令非常相像。你可以猜到,可以用下面的命令列出所有的标签:

$ geeknote tag-list

创建一个笔记本:

$ geeknote notebook-create --title [notebook title]

创建一个标签:

$ geeknote tag-create --title [tag title]

一旦你了解了窍门,很明显这些语法是非常自然明确的。

如果你想要了解更多,不要忘记查看官方文档

福利

作为福利,Geeknote自带的gnsync工具可以让你在Evernote和本地计算机之间同步。不过,我发现它的语法有点枯燥:

$ gnsync --path [where to sync] (--mask [what kind of file to sync] --format [in which format] --logpath [where to write the log] --notebook [which notebook to use])

下面是这些参数的意义。

  • –path /home/adrien/Documents/notes/: 与Evernote同步笔记的位置。
  • –mask “*.txt”: 只同步纯文本文件。默认gnsync会尝试同步所有文件。
  • –format markdown: 你希望它们是纯文本或者markdown格式(默认是纯文本)。
  • –logpath /home/adrien/gnsync.log: 同步日志的位置。为防出错,gnsync会在那里写入日志信息。
  • –notebook “Family”: 同步哪个笔记本中的笔记。如果留空,程序会创建一个以你同步文件夹命令的笔记本。

总的来说,Geeknote是一款漂亮的Evernote的命令行客户端。我个人不常使用Evernote,但它仍然很漂亮和有用。命令行一方面让它变得很极客且很容易与shell脚本结合。此外,在Git上还有Geeknote的一个分支项目,在ArchLinux AUR上称为geeknote-improved-git,貌似它有更多的特性和比其他分支更积极的开发。我觉得值得去看看。

你认为Geeknote怎么样? 有什么你想用的么?或者你更喜欢使用传统的程序?在评论区中让我们知道。


via: http://xmodulo.com/evernote-command-line-linux.html

作者:Adrien Brochard 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-4752-1.html

Linux:如何在终端下以后台模式运行Linux程序

Linux:如何在终端下以后台模式运行Linux程序
Linux:如何在终端下以后台模式运行Linux程序

Linux终端窗口

这是一个简短但是非常有用的教程:它向你展示从终端运行Linux应用程序的同时,如何保证终端仍然可以操作。

在Linux中有许多方式可以打开一个终端,这主要取决于你的发行版的选择和桌面环境。

使用Ubuntu的话,你可以使用CTRL + ALT + T组合键打开一个终端。你也可以点击超级键(Windows键)打开一个终端窗口。在键盘上,打开Ubuntu Dash,然后搜索”TERM”。点击”Term”图标将会打开一个终端窗口。

其他诸如XFCE, KDE, LXDE, Cinnamon和MATE的桌面环境,你将会在菜单中发现“终端”这个应用。还有一些发行版会把终端图标放在菜单项,或者在面板上放置终端启动器。

你可以在终端里面输入一个程序的名字来启动一个应用。举例,你可以通过输入”firefox”启动火狐浏览器。

从终端运行程序的好处是可以使用额外的选项。

举个例子,如果你输入下面的命令,一个新的火狐浏览器将会打开,而且默认的搜索引擎将会搜索引号之间的词语:

firefox -search "Linux.About.Com"

你会发现,如果你运行火狐浏览器,应用程序打开后,控制权将会回到终端(重新出现了命令提示符),这将意味着你可以继续在终端工作。

通常情况下,如果你通过终端运行一个程序,程序打开后,并且直到那个程序关闭结束,你都将不会获得终端的控制权。这是因为你是在前台打开程序的。

想要从终端运行一个程序,并且立即将终端的控制权返回给你,你需要以后台进程的方式打开程序。

为了以后台进程的方式打开一个程序,只需要添加符号(&)到命令中,如下面所示:

libreoffice &

在终端中仅仅提供程序的名字,应用程序可能运行不了。如果程序不存在于一个设置在PATH 环境变量的文件夹中,你需要指定完整的路径名来运行程序。

/path/to/yourprogram &

如果你并不确定一个程序是否存在于Linux文件系统中,使用find或者locate命令来查找该应用程序。

找一个文件的语法如下:

find /path/to/start/from -name programname

举个例子,可以使用下面的命令寻找Firefox的位置:

find / -name firefox

输出会很快滚动出很多,所以你可以以管道的方式控制输出的多少:

find / -name firefox | more
find / -name firefox | less

find命令将会返回因权限拒绝而发生错误的文件夹数量,这些文件夹你没有权限去搜索。

你可以使用sudo命令提升你的权限。如果sudo没有安装,你需要切换到拥有权限的用户:

sudo find / -name firefox | more

如果你知道你想寻找的文件在你的当前文件夹中,你可以一个点代替先前的斜线,如下:

sudo find . -name firefox | more

你可能不需要sudo来提升权限。如果你在home文件夹中寻找文件,sudo就不需要。

一些应用程序需要提升用户权限来运行,你可能得到一个缺少权限的错误,除非你使用一个具有足够权限的用户,或者使用sudo提升你的权限。

下面是一个小花招。如果你运行一个程序,而且它需要提升权限来运行,输入下面命令来提升权限重新执行:

sudo !!

via: http://linux.about.com/od/commands/fl/How-To-Run-Linux-Programs-From-The-Terminal-In-Background-Mode.htm

作者:Gary Newell 译者:su-kaiyao 校对:wxy

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

来源:https://linux.cn/article-4754-1.html

Linux:检测 Linux 内存使用情况的 free 命令的10个例子

Linux是最有名的开源操作系统之一,它拥有着极其巨大的命令集。确定物理内存交换内存所有可用空间的最重要、也是唯一的方法是使用“free”命令。

Linux “free”命令可以给出类Linux/Unix操作系统中物理内存交换内存的总使用量、可用量及内核使用的缓冲区情况。

Linux:检测 Linux 内存使用情况的 free 命令的10个例子
Linux:检测 Linux 内存使用情况的 free 命令的10个例子

这篇文章提供一些各种参数选项的“free”命令,这些命令对于你更好地利用你的内存会有帮助。

1. 显示你的系统内存

free命令用于检测物理内存交换内存已使用量和可用量(默认单位为KB)。下面演示命令的使用情况。

# free
             total       used       free     shared    buffers     cached
Mem:       1021628     912548     109080          0     120368     655548
-/+ buffers/cache:     136632     884996
Swap:      4194296          0    4194296

2. 以字节为单位显示内存

加上-b参数的free命令,以字节为单位显示内存的大小。

# free -b
             total       used       free     shared    buffers     cached
Mem:    1046147072  934420480  111726592          0  123256832  671281152
-/+ buffers/cache:  139882496  906264576
Swap:   4294959104          0 4294959104

3. 以千字节为单位显示内存

加上-k参数的free命令(默认单位,所以可以不用使用它),以(KB)千字节为单位显示内存大小。

# free -k
             total       used       free     shared    buffers     cached
Mem:       1021628     912520     109108          0     120368     655548
-/+ buffers/cache:     136604     885024
Swap:      4194296          0    4194296

4. 以兆字节为单位显示内存

想以(兆字节)显示内存大小,使用-m参数。

# free -m
             total       used       free     shared    buffers     cached
Mem:           997        891        106          0        117        640
-/+ buffers/cache:        133        864
Swap:         4095          0       4095

5. 以千兆字节为单位显示内存

使用-g为参数,将会以GB(千兆字节)为单位显示内存大小。

# free -g
             total       used       free     shared    buffers     cached
Mem:             0          0          0          0          0          0
-/+ buffers/cache:          0          0
Swap:            3          0          3

6. 显示总计行

加上-t选项,将会在屏幕最后列出总计一行。

# free -t
             total       used       free     shared    buffers     cached
Mem:       1021628     912520     109108          0     120368     655548
-/+ buffers/cache:     136604     885024
Swap:      4194296          0    4194296
Total: 5215924 912520 4303404

7. 关闭显示缓冲区调整一行

默认情况下,free命令是显示“缓冲区调整”一行的,为了关闭显示,可以加上-o参数。

# free -o
             total       used       free     shared    buffers     cached
Mem:       1021628     912520     109108          0     120368     655548
Swap:      4194296          0    4194296

8. 定期时间间隔更新内存状态

-s选项加上一个整数,用来在定期时间间隔内更新free命令。举个例子,下面的命令将会在每5秒更新一个free命令。

# free -s 5
             total       used       free     shared    buffers     cached
Mem:       1021628     912368     109260          0     120368     655548
-/+ buffers/cache:     136452     885176
Swap:      4194296          0    4194296

9. 显示底和高内存统计信息

-l选项显示了具体的高和低内存的使用统计情况。

# free -l
             total       used       free     shared    buffers     cached
Mem:       1021628     912368     109260          0     120368     655548
Low:        890036     789064     100972
High:       131592     123304       8288
-/+ buffers/cache:     136452     885176
Swap:      4194296          0    4194296

10. 检查free命令版本

-V选项,显示free命令版本信息。

# free -V
procps version 3.2.8

via: http://www.tecmint.com/check-memory-usage-in-linux/

作者:Ravi Saive 译者:su-kaiyao 校对:wxy

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

来源:https://linux.cn/article-4755-1.html

Linux:在 Ubuntu 14.10 Server 上安装 Jetty 9(Java服务引擎和Web服务器)

Jetty提供了一个Web服务器和javax.servlet容器,为SPDY、WebSocket、OSGi、JMX、JNDI、JAAS以及许多其它集成套件添加了支持。这些组件都是开源的,也可用于商业用途和分发。

Jetty被广泛用于多种项目和产品,都可以在开发环境和生产环境中使用。Jetty可以很容易地嵌入到设备、工具、框架、应用服务器以及集群中。更多用途可参见Jetty网页。

Linux:在 Ubuntu 14.10 Server 上安装 Jetty 9(Java服务引擎和Web服务器)
Linux:在 Ubuntu 14.10 Server 上安装 Jetty 9(Java服务引擎和Web服务器)

Jetty特性

  • 全功能并基于标准
  • 开源与商用两可
  • 灵活和可扩展
  • 小足迹
  • 可嵌入
  • 异步支持
  • 企业弹性扩展
  • Apache和Eclipse双重许可证

ubuntu 14.10 server上安装Jetty 9

先决条件

在安装Jetty服务器前,您需要通过以下命令安装Java

sudo apt-get install openjdk-8-jdk

Java将会安装到/usr/lib/jvm/java-8-openjdk-i386,同时在该目录下会创建一个名为java-8-openjdk-i386的符号链接,在/usr/bin/java下也会相应创建符号链接。

现在你需要从这里下载Jetty9,在下载完成后,你需要使用以下命令来解压缩

$tar -xvf jetty-distribution-9.2.5.v20141112.tar.gz

该操作会将它解压到jetty-distribution-9.2.5.v20141112,而你需要使用以下命令将归档文件移动到/opt/jetty

$mv jetty-distribution-9.2.5.v20141112 /opt/jetty

你需要创建jetty用户,并将其设置成/opt/jetty目录的属主

sudo useradd jetty -U -s /bin/false
sudo chown -R jetty:jetty /opt/jetty

使用以下命令拷贝Jetty脚本到启动目录,以便让它作为一个服务来运行

$ cp /opt/jetty/bin/jetty.sh /etc/init.d/jetty

现在,你需要使用以下内容来创建Jetty设置文件

sudo vi /etc/default/jetty

添加以下行

JAVA_HOME=/usr/bin/java
JETTY_HOME=/opt/jetty
NO_START=0
JETTY_ARGS=jetty.port=8085
JETTY_HOST=0.0.0.0
JETTY_USER=jetty

保存并退出该文件

你需要使用以下命令来启动Jetty服务

sudo service jetty start

你应该看到和下面类似的输出

Starting Jetty: OK Mon Nov 24 11:55:48 GMT 2014

如果你看到了下面的错误

** ERROR: JETTY_HOME not set, you need to set it or install in a standard location

你需要确保在/etc/default/jetty文件中设置了正确的Jetty家目录路径,你可以使用以下URL来测试jetty。

Jetty现在应该运行在8085端口,打开浏览器并访问http://服务器IP:8085,你应该可以看到Jetty屏幕。

Jetty服务检查

使用以下命令来验证并检查配置

sudo service jetty check

使用以下命令来让Jetty开重启后自动启动

sudo update-rc.d jetty defaults

重启服务器并测试Jetty是否自动启动。

要检查Jetty运行在哪个端口上,或者该端口是否与其它程序冲突,可以运行netstat -tln


via: http://www.ubuntugeek.com/install-jetty-9-java-servlet-engine-and-webserver-on-ubuntu-14-10-server.html

作者:ruchi 译者:GOLinux 校对:wxy

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

来源:https://linux.cn/article-4758-1.html

Linux:Linux 有问必答:如何在Ubuntu或者Debian中启动后进入命令行

提问:我运行的是Ubuntu桌面,但是我希望启动后临时进入命令行。有什么简便的方法可以启动进入终端?

Linux桌面自带了一个显示管理器(比如:GDM、KDM、LightDM),它们可以让计算机启动自动进入一个基于GUI的登录环境。然而,如果你要直接启动进入终端怎么办? 比如,你在排查桌面相关的问题或者想要运行一个不需要GUI的应用程序。

注意虽然你可以通过按下Ctrl+Alt+F1到F6临时从桌面GUI切换到虚拟终端。然而,在这种情况下你的桌面GUI仍在后台运行,这不同于纯文本模式启动。

在Ubuntu或者Debian桌面中,你可以通过传递合适的内核参数在启动时启动文本模式。

启动临时进入命令行

如果你想要禁止桌面GUI并临时进入一次文本模式,你可以使用GRUB菜单。

首先,打开你的电脑。当你看到初始的GRUB菜单时,按下‘e’。

Linux:Linux 有问必答:如何在Ubuntu或者Debian中启动后进入命令行
Linux:Linux 有问必答:如何在Ubuntu或者Debian中启动后进入命令行

接着会进入下一屏,这里你可以修改内核启动选项。向下滚动到以“linux”开始的行,这里就是内核参数的列表。删除参数列表中的“quiet”和“splash”。在参数列表中添加“text”。

Linux:Linux 有问必答:如何在Ubuntu或者Debian中启动后进入命令行
Linux:Linux 有问必答:如何在Ubuntu或者Debian中启动后进入命令行

升级的内核选项列表看上去像这样。按下Ctrl+x继续启动。这会以详细模式启动控制台一次(LCTT译注:由于没有保存修改,所以下次重启还会进入 GUI)。

Linux:Linux 有问必答:如何在Ubuntu或者Debian中启动后进入命令行
Linux:Linux 有问必答:如何在Ubuntu或者Debian中启动后进入命令行

永久启动进入命令行

如果你想要永久启动进入命令行,你需要更新定义了内核启动参数GRUB设置

在文本编辑器中打开默认的GRUB配置文件。

$ sudo vi /etc/default/grub

查找以GRUB_CMDLINE_LINUX_DEFAULT开头的行,并用“#”注释这行。这会禁止初始屏幕,而启动详细模式(也就是说显示详细的的启动过程)。

更改GRUBCMDLINELINUX=”” 成:

GRUB_CMDLINE_LINUX="text"

接下来取消“#GRUB_TERMINAL=console”的注释。

更新后的GRUB配置看上去像下面这样。

Linux:Linux 有问必答:如何在Ubuntu或者Debian中启动后进入命令行
Linux:Linux 有问必答:如何在Ubuntu或者Debian中启动后进入命令行

最后,使用update-grub命令来基于这些更改重新生成/boot下的GRUB2配置文件。

$ sudo update-grub

这时,你的桌面应该可以从GUI启动切换到控制台启动了。可以通过重启验证。

Linux:Linux 有问必答:如何在Ubuntu或者Debian中启动后进入命令行
Linux:Linux 有问必答:如何在Ubuntu或者Debian中启动后进入命令行

via: http://ask.xmodulo.com/boot-into-command-line-ubuntu-debian.html

译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-4761-1.html