warning: cal_days_in_month() [function.cal-days-in-month]: invalid date. in /home/menethil/public_html/red/blog.jianingy.com/sites/all/modules/archive/archive.module on line 106.

xrandr双屏显示屏幕大小不够的问题

在用xrandr设置双屏幕扩展显示的时候,有可能会提示下面的错误:

xrandr: screen cannot be larger than 1680×1680 (desired size 3120×1050)

该错误说明Xorg的虚拟桌面不够大,可以通过使用Xorg.conf的Virtual指令更改虚拟桌面的大小。例如:

Section "ServerLayout"
    Identifier     "Xorg Configured"
    Screen      0  "Primary Screen" 0 0
EndSection

Section "Monitor"
    Identifier "Primary Monitor"
    Modeline "1400x900"  104.23  1400 1480 1632 1864  900 901 904 932  -HSync +Vsync
EndSection

Section "Screen"
    Identifier "Primary Screen"
    Monitor    "Primary Monitor"
    DefaultColorDepth 24
    SubSection "Display"
        Depth 24
        Modes "1400x900" "1024x768"
        Virtual 3120 1050
    EndSubSection
EndSection

Section "DRI"
    Mode 0666
EndSection
No votes yet

smartctl常用参数

  • 获取SMART信息: smartctl -a -d ata /dev/sda
  • 健康检查: smartctl -H /dev/sda
  • 查看错误: smartctl -l error /dev/sda
  • 打开SMART支持: smartctl -s on -d ata /dev/sda
No votes yet

emacs23编译上的小bug

几天前,在一个没有X的机器上安装emacs23。操作系统应该是RHEL5。编译的时候会提示:找不到系统的alloca实现。出现类似下面的提示信息

configure: error: a system implementation of alloca is required

查看config.log发现出错原因是编译alloca测试程序时候加上了-lX11。事实上alloca是glibc提供的函数应该不需要-lX11。

configure:15318: checking for working alloca.h
configure:15345: gcc -o conftest   -O2  -D_BSD_SOURCE    -Wl,-znocombreloc  conftest.c -lX11   >&5

解决方法自然也很简单,就是编译的时候带上 --with-x=no :)

No votes yet

下载海贼漫画的脚本

经常去fzdm.com看海贼的漫画,每次都感觉那个站好慢,翻页经常不出图。因此做了这个脚本。可以先下载下来,再离线阅览。脚本本身还会制作一个简单的index.html方便浏览。

下载地址: http://github.com/jianingy/op_download

No votes yet

SSH逃逸键(Escape Key)

SSH逃逸键的作用有些类似Telnet的”^]“逃逸。可以让你在一个连接好的终端上进一步控制SSH连接。首先,我们看看这个逃逸键能帮我们做什么。在SSH终端里输入回车然后马上输入字符”~“再输入字符”?“,便可以调出SSH逃逸键使用帮助。你应该能看到类似下面的输出:

blackhole:~ $ ~?
Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

注意最后一行的Note,它说明了逃逸键使用的条件,即必须在回车后马上键入逃逸键。

比较常用的功能可能是用 "~."断开一个连接。有些时候我们在SSH终端上启动了有问题的daemon程序,或是SSH连接因为某种原因进入stalled状态,导致SSH不能正常终止。这时候就可以使用“~.”来终止这个连接。这要比关闭再打开你的终端窗口方便很多。

“~C“会打开一个SSH控制终端。在这个控制终端里,你可以进行端口映射的设置。也就是输入和SSH命令行参数一样的-L或是-R什么的。

“~^Z“是一个比较有趣的功能,可以让你挂起一个SSH连接并回到localhost的终端上。你可以用这个功能做些localhost上的操作再fg回去。也可以在做了端口转发后退出SSH终端并通过bg把它放到后台去。

逃逸键可以通过在执行SSH的时候用-e参数进行就改,具体方法请查看man ssh吧。

No votes yet

在自己的家目录中安装Perl模块

这两天逛水木看到一个对这个问题很不错的解法 — 使用CPAN模块 local::lib 。该模块可以生成环境变量,让单个用户可以在自己家目录中安装需要的perl模块。

举例来看,比如我的模块都在~/local/lib/perl5下。就把下面命令加入.bashrc中

eval $(perl -Mlocal::lib=~/local/lib/perl5)

重新登录之后,cpan就会把默认安装目录放到~/local/lib/perl5下了。

编写程序时,在程序中的头部加入“use local::lib qw(/local/lib/perl5)“就可以将/local/lib/perl5加入模块的搜索路径了。

No votes yet

如何实时添加Bash History

来自早年和豹爷的聊天记录

17:37 < weibao> Bash
的默认配置会存在一个问题,如果同时打开两个(或两个以上的)控制台,那么在这两
个控制台中执行的命令并不会互相分享到 history
中。有的命令历史甚至最终会被覆盖掉。要解决这个问题,可把下列内容添加到
~/.bashrc 或 ~/.bash_profile 文件中:
17:37 < weibao> shopt -s histappend
17:37 < weibao> PROMPT_COMMAND=‘history -a’
17:38 < weibao> 这个对于多人同时操作一个账号的时候,有点儿用
17:40 < weibao> 中午我记得好像是谁问这个来着
17:40 < laserhe> cool
17:40 < laserhe> 我需要这个
17:43 < jianingy> cool!

No votes yet

如何重定向正在运行中的进程

有时我们会突然想把一个正在运行中的程序放到后台去执行。由于事先没有准备,很可能忘记重定向输出到文件或者忘记使用screen、nohup一类的命令来跑。下面介绍一个处理这种问题的小技巧。

  1. 获得程序的进程号(PID)
  2. 使用gdb调试这个进程。(gdb -p xxx)
  3. 通过close系统调用关闭标准输出(STDOUT)或者标准错误(STDERR)
  4. 通过creat系统调用打开一个文件并将其文件描述符通过dup2系统调用复制给标准输出或者标准错误
  5. 退出调试器。现在可以将程序通过“CTRL+z”, “bg”, “disown“放入后台运行了。具体方法请参考: 让程序在后台运行的几个简单方法

详细操作步骤截图如下

nby:~ $ ps awux | grep [t]op
jianingy 4753 0.1 0.0 2308 1008 pts/2 S+ 17:44 0:00 top -b
nby:~ $ gdb -p 4753
GNU gdb (GDB) 7.0

0xb776a424 in __kernel_vsyscall ()
(gdb) call close(1)
$1 = 0
(gdb) call dup2(creat(”/tmp/log”, 0600), 1)
$2 = 1
(gdb) quit

使用本文附件中提供的脚本,可以方便的使用这种方法进行重定向。

参考文献

  1. http://etbe.coker.com.au/2008/02/27/redirecting-output-from-a-running-pr...
No votes yet

如何在32bit环境下使用off64_t类型

编译的时候定义宏:-D_LARGEFILE64_SOURCE

No votes yet

OpenSSH主机认证(Host-based Authentication)配置方法

主机认证的设置上并不复杂,考虑全面就能很容易搞定。我们还是先来简单描述下环境。这里我们假设主机admin是管理节点,我们的目标是admin上的所有用户都能通过主机认证从admin节点上登陆其他机器而不需要输入密码。首先,来看看需要修改的文件有那些以及他们各自的作用。

  • admin上的/etc/ssh/ssh_known_hosts: 系统级别的主机公钥文件,需要将你想登陆主机的公钥全部放在这个文件里。
  • 其他机器上的 /etc/ssh/sshd_config :ssh服务进程的配置文件,稍后我们要在这个文件里开启服务进程对主机认证的支持。
  • admin上的 /etc/ssh/ssh_config: 系统级别的ssh客户端配置文件,我们需要在里面打开客户端对主机认证的支持。
  • 其他机器上的 /etc/hosts.equiv : 允许通过主机认证登陆本机的主机名称(域名或者IP)以及用户名称。(有点拗口,但是就是这个逻辑)

我们先来配置admin上的/etc/ssh/ssh_known_hosts。该文件应该包含admin希望登陆的所有机器的rsa或者dsa公钥。为了获取这个公钥我们可以使用openssh提供的工具“ssh-keyscan”:http://www.linuxmanpages.com/man1/ssh-keyscan.1.php 。下面的例子演示了如何获得几个机器的rsa公钥。

ssh-keyscan -t rsa ls101 ls102 ls103 #获取几个机器的公钥,并输出在屏幕上
 sort <(ssh-keyscan -t rsa ls101 ls102 ls103) <(cat /etc/ssh/ssh_known_hosts) | uniq #获取几个机器的公钥并和原有的公钥列表做简单排重

接下来我们要在其他机器上开启ssh服务进程对主机认证的支持。编辑文件/etc/ssh/sshd_config,进行下面的设置:

HostbasedAuthentication yes #开启主机认证
IgnoreRhosts no # 允许用户自己设置 ~/.shosts 和 ~/.rhosts。该设置对主机认证中root用户的登陆有关键作用。

修改好ssh服务进程的配置文件后,我们需要重新启动一下ssh服务以应用最新的设置。

在各个ssh服务器准备完毕后,我们来配置admin上面ssh客户端参数。编辑文件/etc/ssh/ssh_config,进行下面的设置:

Host *
    HostbasedAuthentication yes # 开启主机认证
    EnableSSHKeysign yes # 开启SSH签名支持

由于主机认证会用到一个叫“ssh-keysign”:http://www.linuxmanpages.com/man8/ssh-keysign.8.php 的程序来进行认证,因此在ssh_config中开启对SSHKeysign的支持是必要的。

最后,我们将admin的域名加入到每个机器的 /etc/hosts.equiv 文件中。现在,在admin上除root用户外的所有用户都可以通过主机认证登陆其他机器了。为了让root用户也有这样的便利,我们还需要在其他机器的/root中加入文件.shosts。其内容和/etc/hosts.equiv相同。至此,我们已经成功完成了ssh主机认证的全部配置。

No votes yet
Syndicate content