How to Using VNC to Remote Control Linux from Mac OS X Lion

从Mac OS X中远程控制Linux非常简单,在Mac中无需安装任何软件,当然Linux端需要安装VNC服务。

环境概述:
Linux:Oracle Enterprise Linux 5.4
Mac:Mac OS X Lion(实际上Snow Leopard或者Leopard应该都是可以的)
VNC Server:Real VNC Free Edition

1. 在OEL中安装Real VNC Server

rpm -Uvh vnc-4_1_3-x86_linux.rpm

2. link X11字体文件位置,否则VNC启动会报错

# cd /usr/X11R6/lib
# ln -s /usr/share/X11 X11
# ls -l
total 4
lrwxrwxrwx 1 root root   14 Sep  5 18:10 X11 -> /usr/share/X11
drwxr-xr-x 3 root root 4096 Aug 31 15:46 modules

如果不执行以上命令,可能在启动VNC以后,在log文件中会看到如下报错:

Couldn't open RGB_DB '/usr/X11R6/lib/X11/rgb'

Fatal server error:
could not open default font 'fixed'
xsetroot:  unable to open display 'hpserver:1'
vncconfig: unable to open display "hpserver:1"
xterm Xt error: Can't open display: hpserver:1
twm:  unable to open display "hpserver:1"

2. 启动VNC,可以用任意用户启动VNC,建议不要使用root

$ vncserver

New 'hpserver:1 (kamus)' desktop is hpserver:1

Starting applications specified in /home/kamus/.vnc/xstartup
Log file is /home/kamus/.vnc/hpserver:1.log

3. 检查vnc log文件,确认vnc监听的端口

vi /home/kamus/.vnc/hpserver:1.log

可以在log文件中看到如下字样,这表示通过RFB协议访问VNC服务器应该指向5901,而通过http协议访问则指向5801。

vncext:      Listening for VNC connections on port 5901
vncext:      Listening for HTTP connections on port 5801

4. 确认VNC已经正常启动,注意在log文件中可能存在warning或者报错,我们通过检查端口来确认VNC是否正常启动。

# lsof|grep 5901|grep vnc
Xvnc      20656     kamus    3u     IPv4     206853                  TCP *:5901 (LISTEN)

如果上述命令,没有返回值,则表明VNC没有成功启动。

5. 用Mac连接VNC
Cmd+K快捷键或者Finder->Go->Connect to Server,打开如下界面,输入:vnc://server-ip:port,port就是上面第三步检查的通过RFB协议访问VNC服务器的端口,通常为590x。

但是默认启动的VNC界面是比较简陋的,如下图这样。当然,也完全可以使用。

6. 如果我们想在VNC中使用gnome界面,那么需要修改一下启动vnc的脚本。该脚本通常位于启动VNC的用户Home下的.vnc目录中,也就是跟log文件在一个目录下,文件名为xstartup。

$ vi ~/.vnc/xstartup

添加如下行。

unset SESSION_MANAGER
exec /etc/X11/xinit/xinitrc

修改完毕以后,整个xstartup脚本如下所示。

#!/bin/sh
unset SESSION_MANAGER
exec /etc/X11/xinit/xinitrc

[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
twm &

然后停止VNC,再重新启动。

$ vncserver -kill :1
Killing Xvnc process ID 21210
$ vncserver

New 'hpserver:1 (kamus)' desktop is hpserver:1

Starting applications specified in /home/kamus/.vnc/xstartup
Log file is /home/kamus/.vnc/hpserver:1.log

7. 再次从Mac中连接VNC,就可以看到美观的gnome界面了。

如何停止vncserver。

[orat0@hpserver2 ~]$ vncserver -list

TigerVNC server sessions:

X DISPLAY #	PROCESS ID
:1		701
[orat0@hpserver2 ~]$ 
[orat0@hpserver2 ~]$ 
[orat0@hpserver2 ~]$ vncserver -kill :1
Killing Xvnc process ID 701

参考文章:
How To Setup Linux VNC Server In 3 Minutes

How to Release Port 8888 on OEL5.5

准备在OEL5.5中安装Oracle VM Manager,文档中说明要保证8888端口可用。

# netstat -na |grep 8888
unix  3      [ ]         STREAM     CONNECTED     8888 

说明该端口已经被占用,那么如何释放该端口?

通过lsof命令可以看到该端口被avahi-daemon程序占用。avahi-daemon的主页可以参看avahi.org

# lsof | grep 8888
avahi-dae 2747     avahi   12u     unix 0xeb4d9740                8888 socket

检查自动启动的服务,发现avahi-daemon是自动启动的。

# chkconfig --list | grep avahi
avahi-daemon   	0:off	1:off	2:off	3:on	4:on	5:on	6:off
avahi-dnsconfd 	0:off	1:off	2:off	3:off	4:off	5:off	6:off

停止avahi-daemon,需要使用avahi-daemon脚本停止。

# service avahi-daemon off
Usage: /etc/init.d/avahi-daemon {start|stop|status|restart|condrestart}
# /etc/init.d/avahi-daemon stop
Shutting down Avahi daemon:                                [  OK  ]

设置avahi-daemon不再随着机器重启而自动启动。

# chkconfig avahi-daemon off

再次检查,端口已经释放。

# netstat -na |grep 8888

How to use Oracle Instant Client in Mac OS X Lion

升级到Mac OS X Lion以后,原先在Snow Leopard下运行正常的Oracle 10.2.0.4 64bit将无法正常工作,无论执行什么命令(比如sqlplus或者lsnrctl)都会报如下错误。

$ sqlplus
Segmentation fault: 11

在OTN Forum中有此问题的讨论,但是目前为止还没有任何可用的解决方案。Oracle对于Mac的支持一向很弱,而OS X最近的这次升级一定是更改了很多库文件,导致64bit的Oracle数据库/64bit的Oracle Instant Client均无法在OS X Lion中正常运行。

对于Oracle数据库而言,只有for MAC OS X on Intel x86-64版本存在,但是对于Oracle Instant Client却有32bit版本下载,因此如果急于在Mac OS X Lion中使用sqlplus的,可以先安装32bit版本。

安装和设置方法:
1. 从以下链接下载Instant Client for Mac OS X。
http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html
下载Version 10.2.0.4 (32-bit) 中的:
instantclient-basic-10.2.0.4.0-macosx-x86.zip
instantclient-sqlplus-10.2.0.4.0-macosx-x86.zip

2. 将两个zip文件都解压到一个文件夹中,比如文件夹名为instantclient,我将此文件夹转移到到/Applications/Utilities/下,在你的环境中,任何路径都可以。

3. 修改Mac用户的环境变量,直接修改User Home下的.bash_profile文件,添加如下行,其中的路径替换为你环境中的instantclient路径。

export DYLD_LIBRARY_PATH=/Applications/Utilities/instantclient/
export ORACLE_HOME=/Applications/Utilities/instantclient/
export SQLPATH=$ORACLE_HOME
export PATH=$PATH:/Applications/Utilities/instantclient/:.

4. 手动创建tns_admin目录,以及tnsnames.ora文件,其中的内容自己写。

mkdir -p $ORACLE_HOME/network/admin
vi $ORACLE_HOME/network/admin/tnsnames.ora

在我的环境中,用instantclient连接VirtualBox中的11gR2数据库。

localhost:~ Kamus$ sqlplus kamus@vbox-orcl-oel5

SQL*Plus: Release 10.2.0.4.0 - Production on Sat Jul 30 12:09:35 2011

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Enter password: 

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, Automatic Storage Management, Oracle Label Security and Real Application Testing options

SQL> 

备注:关于glogin.sql
默认解压完的instantclient-sqlplus-10.2.0.4.0-macosx-x86.zip是不包含目录结构的,因此glogin.sql在sqlplus执行的时候无法被正确调用,导致的结果就是比如show parameter命令的格式非常难看。因此需要手动做如下操作:
1. 创建bin目录,将sqlplus可执行文件mv到该目录中
2. 创建sqlplus/admin目录,将glogin.sql文件mv到该目录中
3. 修改用户.bash_profile文件,将instantclient/bin添加到PATH环境变量中

Open Terminal in Current Folder & Create New Text in Current Folder by AppleScript

如下图所示,在Finder的toolbar中最后有两个自定义的图标,第一个是iTerm2图标,点击该图标会在Finder当前目录中打开iTerm2程序,第二个是TextWrangler图标,点击该图标会在Finder当前目录中用TextWrangler创建一个新文本文件,文件名为当前日期时间。
Finder

我们使用AppleScript来完成这两项工作。

1. 打开AppleScript Editor

2. 将后文给出的两段脚本copy到AppleScript Editor中,分别保存为两个Application。也就是在Save as的时候选择File format为“Application”(默认为Script)。
保存位置随意,我保存在/Applications目录下。比如第一个脚本保存为“Open iTerm2 Here”,第二个脚本保存为“New Text Here”。

3. 修改新建Application的图标,在Mac中复制粘贴的强大在这里体现了。
以“New Text Here”为例,在Finder中同时选中“New Text Here”和TextWrangler这两个程序,Cmd+I快捷键调出属性窗口,在TextWrangler的属性窗口中鼠标点击最上面的小图标(如下图),按Cmd+C复制,然后鼠标点击“New Text Here”属性窗口中最上面的小图标(原本是AppleScript的默认图标),按Cmd+V粘贴。
Copy Icon

4. 将修改完图标的两个App拖动到Finder顶端的Toolbar中,完成。

AppleScript:
–Open iTerm2 Here
–这里我使用的是iTerm2,你可以改成自己习惯的Terminal程序,比如iTerm,那么只需要将以下脚本中的tell application “iTerm2″改为tell application “iTerm”即可。

-- cd to the current finder window folder in iTerm2. Or drag a folder onto this script to cd to that folder in iTerm2.
-- found this script in the comments of this article: http://www.macosxhints.com/article.php?story=20050924210643297
-- script was opened by click in toolbar
on run
	tell application "Finder"
		try
			set currFolder to (folder of the front window as alias)
		on error
			set currFolder to (path to desktop folder as alias)
		end try
	end tell
	CD_to(currFolder, false)
end run

-- script run by draging file/folder to icon
on open (theList)
	set newWindow to false
	repeat with thePath in theList
		set thePath to thePath as string
		if not (thePath ends with ":") then
			set x to the offset of ":" in (the reverse of every character of thePath) as string
			set thePath to (characters 1 thru -(x) of thePath) as string
		end if
		CD_to(thePath, newWindow)
		set newWindow to true -- create window for any other files/folders
	end repeat
	return
end open

-- cd to the desired directory in iterm2
on CD_to(theDir, newWindow)
	set theDir to quoted form of POSIX path of theDir as string
	tell application "iTerm2"
		activate
		delay 1
		-- talk to the first terminal 
		tell the first terminal
			try
				-- launch a default shell in a new tab in the same terminal 
				launch session "Default Session"
			on error
				display dialog "There was an error creating a new tab in iTerm2." buttons {"OK"}
			end try
			tell the last session
				try
					-- cd to the finder window
					write text "cd " & theDir
				on error
					display dialog "There was an error cding to the finder window." buttons {"OK"}
				end try
			end tell
		end tell
	end tell
end CD_to

–New Text Here
–这里我使用的是/usr/local/bin/edit来直接创建新文档,此命令在安装完TextWrangler之后才会有,如果你使用其它的文本编辑器(比如系统自带的TextEdit),那么可能无法使用该脚本。
–该脚本中获取当前日期时间拼成文件名的实现方法有些丑陋,如果你有更好的方法请告诉我。

-- Create new text file in Finder's Current Folder
-- 2011.7.1 Written by Kamus

-- script was opened by click in toolbar
on run
	tell application "Finder"
		try
			set currFolder to (folder of the front window as alias)
		on error
			set currFolder to (path to desktop folder as alias)
		end try
	end tell
	create_text_file(currFolder)
end run

-- cd to the desired directory in iterm
on create_text_file(theDir)
	set theDir to quoted form of POSIX path of theDir as string
	set yearStr to year of (current date) as integer
	set monthStr to month of (current date) as integer
	set dayStr to day of (current date) as integer
	set timeStr to time of (current date) as integer
	
	try
		do shell script "/usr/local/bin/edit " & theDir & yearStr & monthStr & dayStr & timeStr & ".txt"
	on error the error_message number the error_number
		display dialog "Error: " & the error_number & ". " & the error_message buttons {"OK"} default button 1
	end try
end create_text_file

How to using Quick Look to view SQL scripts in Mac OS X

在开始本文之前,先介绍两个与本文毫无关系但是很酷的QuickLook插件。
Zip Quick Look Plugin - 直接在QuickLook中查看zip包中的内容。
Folder Quick Look Plugin - 直接在QuickLook中查看文件夹的内容。

Mac OS X的Quick Look是很强大的功能。在Finder中高亮需要查看的文件,然后按空格键就可以在弹出的新窗口中直接预览该文件的内容,支持几乎所有需要预览的文件类型,比如txt文本,pdf,微软office文档,苹果iWork文档,可以用Quicktime播放的视频等等。

但是正如Apple的很多产品一样,预置的功能已经很好,但是却几乎不给使用者任何调整的方法,比如在我的机器里有很多.sql扩展名的SQL脚本文件,我很想能够用Quick Look来快速查看,但是在Mac OS X中天生的Quick Look是不支持快速预览sql文件的,并且没有给于任何选项来将某些文件类型加入到Quick Look中。

在默认情况下,用Quick Look打开SQL脚本,将仅仅显示如下文件信息窗口。我个人的系统设置是如果双击SQL脚本,则用TextWrangler打开,因此这里显示为“TextWrangler text document”。

我们需要手工修改一些文件,来让Quick Look也可以直接预览SQL脚本。

1. 修改Info.plist文件,在我的例子中是修改TextWrangler的plist文件,如果你选择不同的应用程序打开SQL脚本,那么需要修改相应程序的plist。

vi /Applications/TextWrangler.app/Contents/Info.plist

在最后这两行的前面:

</dict>
</plist>

添加下面这些内容:

<key>UTExportedTypeDeclarations</key>
<array>
<dict>
  <key>UTTypeConformsTo</key>
  <array>
	<string>public.text</string>
	<string>public.plain-text</string>
  </array>
  <key>UTTypeDescription</key>
  <string>SQL Script file</string>
  <key>UTTypeIdentifier</key>
  <string>com.barebones.textwrangler</string>
  <key>UTTypeTagSpecification</key>
  <dict>
	<key>com.apple.ostype</key>
	<string>TEXT</string>
	<key>public.filename-extension</key>
	<array>
	  <string>sql</string>
	</array>
  </dict>
</dict>
</array>

其中com.barebones.textwrangler可能需要改成你使用的应用名称,比如TextMate则是com.macromates.textmate,通常这个名字可以在plist文件的前面部分找到。

2. 使改动生效

touch /Applications/TextWrangler.app

然后再次使用Quick Look就可以直接查看SQL脚本内容了。

参考文档:
Add Quick Look support for certain file formats

How to change I/O scheduler in Linux

Updated@2015/12/15

为什么可能会去修改Linux I/O Scheduler (elevator)?以及什么是I/O Scheduler,应该如何为数据库系统选择合适的I/O Scheduler?可以参看以下文章。

那么如果我们确认要修改I/O scheduler,该如何进行? 参考 – How to change default I/O scheduler?

大体上来说就是,比如像修改I/O scheduler为dealine:

  1. 在RHEL4/OEL4中,修改/boot/grub/grub.conf文件,添加elevator=deadline,重启生效,比如:
    title Red Hat Enterprise Linux Server (2.6.18-8.el5)
    root (hd0,0)
    kernel /vmlinuz-2.6.18-8.el5 ro root=/dev/vg0/lv0 elevator=deadline
    initrd /initrd-2.6.18-8.el5.img
  2. 在RHEL5/OEL5以及之后的版本中(比如RHEL6和RHEL7),可以针对每块磁盘制定I/O Scheduler,修改完毕立刻生效,比如:
    --当前是是noop
    # cat /sys/block/sda1/queue/scheduler 
    [noop] anticipatory deadline cfq
    --修改为deadline
    # echo 'deadline'>/sys/block/sda1/queue/scheduler 
    --立刻生效
    # cat /sys/block/sda1/queue/scheduler 
    noop anticipatory [deadline] cfq 

Mac之路(十)- How to Change Default Programs in Mac OS X Leopard

有时候我们想双击某个文件的时候默认用另外一个程序打开,比如在Mac中视频文件默认用Quicktime打开,想改成MPlayerX;图片文件默认用Preview打开,想改为Picasa。

Change default application in Mac OS X

很简单。
1. 在Finder中找到任何一个想改变默认打开方式的文件,选中文件,按苹果键+I(也可以点击File->Get Info)打开文件信息窗口。
2. 找到Open with项,在下面的下拉菜单中就是所有可以选择的程序,选择你希望默认打开的程序。
3. 记住要点击“Change All”按钮,否则改动只对当前文件有效,而不是对与该文件类型相同的所有文件有效。

Mac之路(九)- 自定义截屏目录、文件名

在本站中搜索“Mac之路”,可以找到之前写的一系列文章,有些很幼稚,有些现在看起来仍然很有用。

这是此系列的最新一篇,主要介绍如何自定义Mac自带的截屏快捷键所截取图片存放的路径,图片的格式,图片的名称。

本文主要参考自:
http://snowleopardtips.net/tips/everything-you-need-to-know-about-screen-captures.html

Mac自带的截屏本身已经很强大,如果还不知道如何截屏(Sreen Capture)的,请自行Google,关键字“Mac截屏”。

默认情况下,截取的文件存放在用户桌面上,文件名类似“Screen shot 2011-03-01 at 18.48.25 .png”这样带时间和空格,格式为png文件。

现在我们准备修改为:截屏文件自动保存在用户目录下的Pictures/snap目录中,并且名字为“screenshot001.jpg”,其中的数字自动递增。

1. 修改存储目录
在Terminal中执行如下命令,location关键字后为目录的绝对路径:

defaults write com.apple.screencapture location /Users/kamus/Pictures/snap

2. 修改文件类型
在Terminal中执行如下命令,type关键字后为想要保存的文件类型:

defaults write com.apple.screencapture type jpg

3. 修改文件名
这部分比较复杂,无法用defaults write com.apple.screencapture name ‘filename’这样的命令来完成。所以这里我们使用到了Mac中强大的Automator folder action。

首先创建一个Automator脚本。一个Automator脚本就类似一个工作流,按照指定的步骤一步一步执行下去。创建完毕的脚本截图如下:
Automator

实际上这个工作流就是先在指定目录中寻找符合条件的文件名,然后在文件名后面附加递增的数字。

Folder Action类型的Automator脚本默认保存在~/Library/Workflows/Applications/Folder Actions/目录下。(不同类型的脚本保存的目录不同,比如Service类型的Automator脚本则保存在~/Library/Services目录中)

bogon:Folder Actions kamus$ pwd
/Users/kamus/Library/Workflows/Applications/Folder Actions
bogon:Folder Actions kamus$ ls -l
total 0
drwxr-xr-x@ 3 kamus  staff  102 Mar  1 19:11 RenameScreenCaptures.workflow

接下来需要将该脚本绑定到snap目录上。
在Finder中找到该目录,右键单击,在菜单中选择“Folder Actions Setup…”,在弹出窗口中选择刚刚保存的脚本,在我的例子中保存为RenameScreenCaptures.workflow。

Choose automator folder action

做完以上所有更动,需要Logout用户再登陆,或者直接在命令行中输入:

killall SystemUIServer

再重新截屏试一下,All done。

java.lang.InternalError when using Xming

正在逐渐将机器上的所有盗版转成正版,实在找不到替代品的准备购买。之前一直在使用盗版的Xmanager做远程X桌面转发,现在开始使用free的Xming。

在使用Xming安装Oracle软件的时候,可能会遇到如下错误,图形界面无法正常打开。
Exception java.lang.InternalError: java/langNullPointerException occurred..

这是因为少安装了额外的Xming font package,安装完毕以后,错误将消失。记录以备忘。

关于Xming及Xming font package的安装,可以参看这里