Vagrant 没了 VirtualBox 的话可以配 Qemu

开源虚拟机软件 VirtualBox 从当初不可一世的 Sun 易手到 Oracle 之间,变得不那么被许多公司信任了。之前一直是用 Vagrant 搭配 VirtualBox 在 Mac 下使用 Linux 虚拟机,因为不需要用到 Linux 桌面,用 Vagrant 操作虚拟机非常方便。但现在不得不要考虑别的方式,那就是 Vagrant + Qemu。Vagrant 的默认 Provider 是 VirtualBox, 我们搜索 Vagrant Box https://app.vagrantup.com/boxes/search 的时候,注意到  Vagrant 其实支持的 Provider 是一个很长的列表:

aws, cloudstack, digitalocean, docker, google, hyperv, libvirt, lxc, openstack, parallels, qemu, rackspace, softlayer, veertu, virtubalbox, vmware, vmware_desktop, vmware_fusion, vmware_ovf, vmware_workstation, vsphere, xenserver

有些尚未听说过,还有一些虽说支持,但别人提供的相应的 box 不多,Qemu 还算不错的 virtualbox 的替代品。Qemu 也是一款开源的虚拟机软件,它支持 Linux, macOS 和 Windows  平台,但它本身未提供友好的 UI 工具,所以创建一个 Qemu 虚拟机的命令会让人畏而却步。在 macOS 下有一个 Qemu 的 UI 工具 UTM 阅读全文 >>

找到 Linux 后台程序的打印输出

最近才狠命的折腾数码日购入的一个  DS920+ NAS,在上面用计划任务来同步两个目录的文件,似乎是在登陆它的 SSH 后的 rsync 同步命令与放在计划任务里的执行效果不一样。于是想看看计划任务里的 rsync -av --delete folder1 folder 时的控制台输出。到哪里去找呢?登陆到 SSH 于只能用 ps 命令看到它的进程 ID

yanbin@nas:~$ ps -ef|grep rsync
SynoRsy+ 10270 1 0 Sep28 ? 00:00:00 /usr/bin/rsync --daemon
root 14067 14066 51 23:03 ? 00:00:02 rsync -av folder1/ folder2/
root 14076 14067 0 23:03 ? 00:00:00 rsync -av folder1/ folder2/
root 14077 14076 58 23:03 ? 00:00:02 rsync -av folder1/ folder2/
Google 了一下找到了这篇 See the STDOUT redirect of a running process, 关键就是用 ls -l /proc/<pid>/fd 列出进程所有打开的文件描述符

阅读全文 >>

记录自己常用的一些 Linux Shell 脚本

常要在 Linux 下分析日志或其他类型的文件,基本用的命令也就 grep, awk, sed, cut, vim, cat, find, xargs, tail, more 或 less。本人工作平台为 Mac OS X, 而 Mac 下的 grep, sed, awk 的行为与 Linux 下的 GNU 标准的相应命令是有差别的, 所以我总是在 Mac 下安装 GNU 的 grep, sed, awk 等命令来替代系统默认的。

比如安装下面的命令

$ brew install findutils gawk gnu-sed grep

以上会安装 GNU 的 find, awk, sed 和 grep 命令,使用时要加个前缀,如 gfind, gawk, gsed 或 ggrep,也可以设置别名或符号链接来替换掉系统的相应命令。

注: brew install coreutils 会安装众多 Linux 下的基本命令替代品,ls, cat, cut 都在其中,使用它也是要加上前缀 g, 如 gls, gcut 等。

以下 grep, find, grep, sed 以 GNU 的行为为准。 阅读全文 >>

WordPress 在 Linux 下不能向 Gmail 邮箱发邮件的问题

一年前解决了 WordPress 在 Linux 下不能发送邮件的问题,后来有段时间很正常,我的网站接收邮件的邮箱是 Gmail 的。但是近来,网站上有留言时极少收到通知邮件,怀疑是 Debian 下的  exim4 又不能正常工作了。但是试了如下的 PHP 脚本

$ php -a
Interactive mode enabled
php> mail('<my_gmail_account>@gmail.com', 'test subject', 'test content');
php > exit

从命令行上并没有提示任何的错误,但是检查我的 Gmail 信箱,死活就是收不到邮件。即使直接用  mail 命令

echo Hello World | mail -v -s Test <my_gmail_account>@gmail.com

也是不行的。

查看日志文件 /var/log/exim4/mainlog, 发现有下面的错误信息 阅读全文 >>

Linux 下配置滚动日志之 rotatelogs

上一篇 Linux 下配置滚动日志之 logrotate, 介绍了定时服务 logrotate 的方式对日志进行滚动,删除旧归档。logrotate 是目前流行 Linux 发行版内置的定时服务,默认每日根据配置文件来滚动日志文件。那么它可能有一个弊端就是,如果每日增长的日志超大,同时会暴盘,那么就必须调整 logrotate 这个 cron 定时服务为每小时,或自定义的 cron 表达式来控制。

而本文所介绍的 rotatelogs 工具(与 logrotate 名称太过相似) 是采用管道操作的方式来控制日志的滚动,可以基于实时监控的日志文件大小来滚动日志,也可以配置像 logrotate 来定时滚动日志。rotatelogs 是出自于 Apache HTTP Server 家族的,它被用于 Apache HTTP Server 的就错误日志,访问日志的滚动控制。

类似于 rotatelogs 的工具不有一个老旧的 cronolog,也是应用管道操作控制日志,它早已无人问津,最近更新在五年前,且功能很弱,只带滚动,不能清理旧归档,磁盘空间占用仍然是无上限。 阅读全文 >>

Linux 下配置滚动日志之 logrotate

日志是个好东西,便于定位历史问题,但记录太多,不滚动,不除旧总暴盘的时候。如果是用日志框架输出的日志,像 Log4j 或 Logback 通过选择具有滚动特性的 Appender 就能实现日志的滚动,并删除旧的归档日志文件。但也有在程序当中难以控制的日志输出文件,这用的话必须采取事后补救措施,程序尽管往一个日志文件里写,由另一个程序来对该日志文件进行归档,清理操作。

与此相关的工具,我们可以找到以下几个

  1. logrotate, 如今的多数 Linux 发布版都自带了,感觉有一种主场优势。github 上 logrotate/logrotate 仍活跃着
  2. newsyslog,  FreeBSD 和  Mac 系统自带,应该不常用。Mac OS 下可以看下配置文件 /etc/newsyslog.conf
  3. cronolog, 原本的官网 www.cronolog.org 全是日文了,找到它的快照 fleible web log rotation, github 上 fordmason/cronolog 最近更新是五年前
  4. rotatelogs, 出自于 Apache HTTP 项目, Apache HTTP server 用它滚动访问和错误日志

本人最为推崇使用第一个工具 logrotate, 因为多数 Linux 系统自带,不像 cronolog 和 rotatelogs 需要额外安装。它也有着更完备的功能,下面慢慢领略

logrotate 的工作机制

Linux 下默认有一个每日执行的 Cron Job,配置在 /etc/cron.daily/logrotate,文件内容为(以 centos7 为例) 阅读全文 >>

Bash/Zsh 下调用 Emacs/Vim 编辑当前命令

Bash 环境

多数时候我们用的是 Bash, 比如个人的 Linux 不愿去定制,远程服务器的由不得你去定制,所以就从 Bash 说起。

默认键绑定 emacs, 操作是 ctrl-x, ctrl-e

在默认的 Bash  环境下,只要在命令行中按下 ctrl-x, ctrl-e 就会把当前命令的内容调入到环境变量  $EDITOR 指示的编辑器(默认为 emacs)去编辑,编辑后保存退出就会立即执行。

如果未安装 Emacs 编辑器,在按下 ctrl-x, ctrl-e 会得到如下提示

[vagrant@localhost ~]$
-bash: emacs: command not found

如果希望使用 vi 来编辑当前命令,就需要设置 EDITOR 环境变量,比如在 .bashrc 中加入

export EDITOR=vi

那么在命令行中按下 ctrl-x, ctrl-e 使用打开  vi 来编辑当前命令。

注:Emacs 要用 ctrl-x, ctrl-c, 再回答 y, 命令保存到临时文中; 而 vi 的相应操作是 :wq, 至少这个操作上 vi 要简洁些。 阅读全文 >>

Bash 下的 emacs 和 vi 键绑定

初衷只是为了记述一下在 Bash/Zsh 中怎么调用 Vi 编辑当前的命令,但一发挥便涉及到了 Bash/Zsh 的键绑定的话题,无法打住,只得另立新篇。这里也只说 Bash 的键绑定,不会有 Zsh 键绑定的内容。

什么是 Bash 的键绑定(keybing) 呢? 就是在 Bash 中的快捷键方案,即相当于某个 IDE 的快捷键配置,或者叫 Keymap。比如说 IntelliJ IDEA 中可选择的 Keymap 有 Eclipse, Emacs, JBuilder, Mac OS X, Mac OS X 10.5+, NetBean, Visual Studio, 以满足不同使用者的习惯。

相应的 Bash 也为我们提供了两种键绑定的方案,即 emacs(默认) 和 vi 键绑定类型。

Emacs 键绑定

我们大多数天天在 Bash 下无意识中使用着 Emacs 键绑定类型,即使可能从未用过 Emacs 本身。比如我们在 Bash 下的按键组合

ctrl + a     跳到命令行的开始
ctrl + e     跳到命令行末尾
!!               重复最后一个命令
ctrl + l      清屏操作,类似于  clear 命令
ctrl + c      中断/杀掉当前运行的进程 (SIGINT)
ctrl + d     发送 EOF 标记,这会关掉当前的 shell (EXIT)
ctrl + z      发送 SIGTSTP 给当前任务,使其挂起送到后台。(所以如果 vi 未正常退出,而是按 ctrl + z 的话,vi 进程还呆在后台

它们都是来自于 Emacs 键绑定。是不是那么的熟悉啊? 阅读全文 >>

WordPress 在 Linux 下不能发送邮件的问题

本博客迁移到现在的 VPS 上已是两年有余,在有评论到来时从来就没收到过提醒邮件,以前是放在租的主机上,所以那些都有人配置好了的。其实一直没把 WordPress 未能发送邮件的问题放心上,自己收不到倒无所谓,但评论者接收邮件提醒算是件重要的事。

今天一同事说我的博客无法进行评论,我一段时间以来只有一丝感觉为何这么久没人评论了,只想大家都不爱说话罢了,并未意思到博客本身的问题,也在此表示感谢。于是自己测试了下,登陆用户评论没问题,游客无法评论,最后查到是 wpDiscuzMath Comment Spam Protection 插件起冲突了,于是把后者禁用了就没问题。至于评论提交后响应有些慢是由于不得不用的 Akismet 插件的原因。

为评论的问题既然登陆到了 VPS 上了,也顺便把两年来的邮件发送问题也诊断一下,其实做来很简单,就是当初配置 VPS 时少做了一步。当前所用的 Linux 发行版是  Debian,之前记录过一篇 Debian Linux VPS 为 WordPress 的系统准备,其中提到 WordPress 发送邮件用的是 exim4,

所以第一步,修改 /etc/exim4/update-exim4.conf.conf, dc_eximconfig_configtype 的值由 'local' 改成 'internet'

dc_eximconfig_configtype='internet'

然后重启 exim4 服务,可用命令 service exim4 restart. 阅读全文 >>

Docker for Mac 公测版试用

伴随着 2016 年 Docker Conference 的进行, Docker for Mac 和 Windows 的版本终于完全公测开始了. 之前阅读 Docker for Mac Windows Beta: the simple way to use Docker on your laptop 里的介绍, 想要安装的必须在 https://beta.docker.com/  收到获准才能下载.

Docker for Mac and Windows 可能让我们在 Mac 或 Windows 下脱离 Virtual Box 虚拟机, 像在 Linux 下一样跑 Docker. 因为不存在了 Virtual Box 这一中间层, 端口重定向就变成了一件很简单的事情了. 再也不用像原来那样 Localhost:80 -> VirtualBox-Default:1080 -> Container:80, 而直接就是 Localhost:80 -> Container:80.

也不再需要用 eval $(docker-machine env default) 来设置 DOCKER_HOST 等环境变量了.

目前的 Beta 版是 Version 1.12.0-rc2-beta16 (build: 9493) f615be9fb245904fbdf1aa0cad251d418c869428

本人趁手的是 Mac, 所以大概讲述如何安装 Docker for Mac. 首先我们可以尽情的卸载掉已安装的 Virtual Box, Docker-Machine 和 Docker 了, 然后从 https://docs.docker.com/docker-for-mac/ 下载 Docker for Mac. 它是一个 dmg 文件, 想安装普通的 Mac 应用那样拖拽到 /Applications 目录,  阅读全文 >>