Debian/Ubuntu - Xen折腾秘笈

八月 23, 2010

作为秘籍,本文包含折腾Xen所必须了解,但是在一般能找到的教程里面都没提及的资料。这里不包含一些必须的步骤等,所以很可能你需要先浏览这些资料,并让浏览器同时开着这些页面随时查阅:

一:Xen工具及其关系

在 Debian 上安装和配置 Xen》一文把在Debian上安装Xen简化成一道命令:

apt-get install xen-hypervisor-3.2-1-amd64 \
xen-linux-system-2.6.26-2-xen-amd64 xen-utils-3.2-1 \
xenstore-utils xenwatch xen-shell xen-tools
  • xen-hypervisor主要只有一个文件:/boot/xen-3.2-1-amd64.gz,就是宿主内核;
  • xen-linux-system则是打了Xen补丁的Linux内核,这个内核脱离hypervisor是无法启动的,只适用于虚拟机;dom0对hypervisor来说也是虚拟机之一,domU也可以直接用这个内核启动。
  • xen-utils则是运行在Dom0上的程序,比如xend、xm,作用是跟hypervisor通讯,是主要由Python编写的一系列程序。
  • xen-tools是如xen-create-image的一系列工具,作为xm工具的前端,用以管理安装虚拟机;这是一套perl脚本,也有很灵活扩展性。
  • xen-shell是一个交互式的shell,常见用于VPS服务商提供给用户的操作界面,用户根据几个封装好的命令控制虚拟机如重启等工作。
  • xenstore-utilsxenwatch分别是虚拟机间数据共享和虚拟机监控的工具,不是必要组建,可不安装。

二: Dom0的启动

  1. grub2跟xen dom0目前关系不怎么所以如果你用grub2启动遇到挂掉xen启动不起来之类的,换回grub-legacy吧。

  2. 装完xen-hypervisor后可以打开/boot/grub/menu.lst看看,第一个选项应该是Xen 3.2-1-amd64之类的,看他的启动参数,是先加载Xen内核/xen-3.2-1-amd64.gz,再按模块挂在Linux内核;如果没有出现,需要运行update-grub。有这个后就可以放心重启了。

  3. /boot/grub/menu.lst文件里面有这么一行配置:

1
2
## Xen hypervisor options to use with the default Xen boot option
# xenhopt=

是预留来传hypervisor参数的,比如要限制dom0的内存使用,可以写成:

1
# xenhopt=dom0_mem=256M

修改后记得运行 update-grub才生效。

关于Dom0内存的占用可能导致虚拟机不稳定可参看:Dom0 mem allocation and domU network issues

三:虚拟机的网络

无论是简单的桥接,安全的NAT子网,内部私有网,单双向网,利用内核的特性都可以做到: Xen Networking

四:虚拟机的安装

关于管理工具

有两套工具可以用来创建Xen虚拟机:xen-tools, libvirt-bin,从它们各自的主页很清晰看到它们的定位不同,前者主要用于本地管理Xen,由Debian支持,后者用于管理各种虚拟方案(xen,openvz,kvm,qeum,vbox,vmware....),由Redhat支持。虽然都支持跟兼容,但实际上前者有利于安装前者的系统,后者有利于安装后者的系统。这里只研究前者。

关于 xen-create-image

xen-tools是相当简单实用的一套脚本,教程里面一般提到使用的xen-create-image

xen-tools有一个全局配置文件/etc/xen-tools/xen-tools.conf,里面写的参数会最终被xen-create-image的命令行参数覆盖或补充。

关于 --install-method

xen-tools的作用主要是控制怎么安装一个发行版,因为xen虚拟机的特殊方式,一般都不会启动该发行版的安装程序,而是用发行版的基础包管理来进行安装,安装参数--install-method负责这个过程,比如Debian/Ubuntu就要用debootstrap方法安装,CentOS/Fedora用rinserpmstrap,另外还有copytar方法。安装好一个模板系统后对那个镜像手动挂载,tar压缩后来用部署其他虚拟机,是个好方法。

关于 --dist

--dist让你指定一个发行版的名字,你会发现并不是所有发行版都能被支持的,实际支持的可以看看/usr/lib/xen-tools的内容,里面各个对应发行版的目录内都包含了一系列的脚本,如预先安装什么包,需要设置某个配置文件,比如说libc6-xen,不过在64位机环境下这个是不需要的,脚本会自动判断。

关于安装新版本系统

因为版本太旧,在Debian Lenny里面的xen-tools跟debootstrap不能直接支持比如Ubuntu Lucid(10.4)之类的较新的发行版的安装,倒是有比较曲折的方法Ubuntu upgrade to 9.10/10.04 for Xen DomU 。但其实有更好的方法:下载新版的Xen-toolsdebootstrap的deb回来装上。因为这些只是一些脚本,不会跟系统其他包有冲突。装完后就可以直接安装新版系统了。(dpkg安装新版xen-tool时候提示缺一个依赖,按名字装上即可)

关于 --mirror

安装教程里面一般都让你指定一个对应发行版的源,考虑到网速因素,这样安装一个虚拟机是很累的,虽然xen-create-image有个--cache可以在dom0上缓存deb包。其实如果你有相应发行版的iso文件,完全可以拿iso来做安装源:

1
2
3
4
mkdir /mnt/isodir
mount -o loop /path/to/the_iso_file.iso /mnt/isodir
cd /mnt/isodir
python -m SimpleHTTPServer

现在这个机器就在8000端口上运行着一个HTTP源了,直接在mirror参数里面指定该地址即可,这样的安装过程很快。缺点是可能安装脚本有一些包在iso中没有提供而出错,建议加上--verbose参数查看整个安装过程。

安装过程的日至会被放在/var/log/xen-tools/<NAME>.log,如果安装过程出现什么问题可以直接看这个对应的文件。使用本地ISO做源虽然一般没什么问题,但如果缺了什么包之类的会在日志中提示。

关于 --role

--role=udev这个参数建议创建新虚拟机时候加上。--role参数会让创建脚本在/etc/xen-tools/role.d/目录下寻找相应名字的脚本运行,udev就是其中一个,作用是给虚拟机装上udev包。udev是提供动态/dev目录的机制,是提供内核对硬件识别的事件桥梁,对一般的xen虚拟机来说影响不算太大,如果不安装最显然的是会找不到/dev/shm挂载点(启动过程有一个warnning),但一般来说还是推荐安装。

/etc/xen-tools/role.d/里面默认包含了以下一些有用的脚本,使用时可以逗号分隔,如--role=udev,minimal,cfengine

  • builder 自动安装build-essential等编译链包,部署distcc集群有用。
  • cfengine CFengine是一个服务器自动化控制服务,对部署大量服务器很有用。会拷贝dom0上的配置。
  • editor 自动根据dom0里面的sed脚本来配置domU内的配置文件,具体可以打开/etc/xen-tools/role.d/editor看看说明。
  • passwd 自动修改domU的密码。默认--passwd参数是会出现passwd的交互修改root密码的过程,用这个role脚本就可以实现自动应答。要使用--role-args=mYpassWd传入相应密码。
  • minimal 精简化domU系统。安装一些screen、vim等实用工具,卸除manpages等对虚拟机意义不大的包。
  • udev 如前述,安装udev包。
  • xdm 安装X、xdm、icewm等GUI包。
  • gdm 同上,登陆器换成gdm。

另外这些脚本默认都是针对Debian系系统设计的,Redhat系的应该用不了。

关于 --pygrub

最后有个--pygrub参数,关系到domU的引导过程。xen的半虚拟并没有从引导区的虚拟过程,而是直接读取内核文件运行。默认情况下是直接用dom0的内核的,如果domU的发行版跟版本跟dom0一致,这样处理倒是很方便,但是一旦不一致就容易出现找不到root分区等各种引导问题。如果安装的domU的系统跟dom0不一致的(包括amd64/i386这样的架构不同),就加上--pygrub参数,这会让domU安装上它自己的内核,以及生成一个/boot/grub/menu.lst文件,引导虚拟机时会根据这个文件模拟grub出现一个引导菜单,提出其自己的内核文件来启动虚拟机。

pygrub其实是xend的一个python工具,在/usr/lib/xen-3.2-1/bin/pygrub,可以直接这样运行来测试pygrub是否正常读取到内核:

1
/usr/lib/xen-3.2-1/bin/pygrub /home/xen/domains/lenny3/disk.img

会出现菜单,选择后会退出,返回一段临时文件数据,内核文件的临时位置。

目前在Debian Squeeze内的Xen 4.0的pygrub有个小小的低级错误,运行后会报模块导入错误,其实只要编辑/usr/lib/xen-4.0/bin/pygrub文件,把里面修改path的一行提前即可:

1
2
sys.path.insert(1, sys.path[0] + '/../lib/python') #这行原在30行左右,提前到这里
import xen.lowlevel.xc  #原本这里出错

典型的几种创建方法

1
2
3
4
5
xen-create-image --hostname=my-lenny --dist=lenny --mirror=http://mirrors.163.com/debian --role=udev --force --verbose
 
xen-create-image --hostname=my-ubuntu-vm --dist=lucid --mirror=http://mirrors.163.com/ubuntu --role=udev --pygrub --force --verbose
 
xen-create-image --hostname=my-xen-vm --dist=squeeze --install-method=tar --install-source=/path/to/system_tared.tar.gz --pygrub --force --verbose

第五章:虚拟机的运行

关于虚拟机配置文件

完成创建虚拟机后,默认情况下在/home/xen/domains/<NAME>下生成虚拟机的磁盘文件,在/etc/xen/<NAME>.cfg生成相应虚拟机的配置文件。关于虚拟机配置的修改,只需直接打开这个cfg文件修改即可(如内存大小,CPU多少,使用VNC等)。配置文件其实是一个Python脚本,也就是说可以对虚拟机的参数进行创建时的动态调节。

配置文件的选项完整说明可以运行xm create --help_config查看。

启动虚拟机以Xen的术语来说是创建一个实例:xm create -c /etc/xen/<NAME>.cfg,-c参数可以马上进入虚拟机的console,使用pygrub的虚拟机只能通过这个方法看到grub菜单。

关于虚拟机启动过程

本文成文时,使用Debian Lenny默认安装系统部署的domU似乎都有一个启动bug,即创建后使用xm console <NAME>仅能看到虚拟机启动的log信息,但是不出现shell,也无法登录,无法响应,只能按ctrl-]返回dom0。如果按上述安装了新版的Xen-toolsdebootstrap再创建的虚拟机就没有这个问题了。

用了旧版工具但要修复这个问题也不算太麻烦:

1
2
3
4
5
6
xm shutdown <NAME>
#确保关闭,运行xm list确保虚拟机已经没有运行
mount -o loop /home/xen/domains/<NAME>/disk.img /mnt
cp /mnt/etc/inittab /mnt/etc/inittab.bak
sed 's/tty1/hvc0/' /mnt/etc/inittab.bak > /mnt/etc/inittab
umount /mnt

就是替换/mnt/etc/inittab文件里面,把虚拟终端的交互设备从tty1改成hvc0。在新版的xen-tools里面,这个替换已经由安装脚本完成了。hvc0是Xen虚拟机的类终端设备,只有让虚拟终端的输出输入跟hvc0链接,才能通过xen的console方法登录虚拟机。

如果使用vnc连接虚拟机,又会发现vnc里面无法登录虚拟机,vnc是framebuffer驱动的图形,默认连接tty1设备,可以按上述方法打开虚拟机的/mnt/etc/inittab文件,在getty那一段,写成这样:

1
2
0:2345:respawn:/sbin/getty 38400 hvc0
1:2345:respawn:/sbin/getty 38400 tty1

如果你安装的是Ubuntu,Ubuntu默认没有使用inittab来配置终端,而是使用了新的机制,使用目录/etc/init/里面的文件来控制,可以发现里面有tty1.conf之类的文件,可以cp /etc/init/tty1.conf /etc/init/hvc0.conf,然后打开/etc/init/hvc0.conf,把tty1那一段改成hvc0,保存即可。

关于使用VNC查看虚拟机

关于VNC的设置在/etc/xen/xend-config.sxp和各个虚拟机的配置文件里面都有选项,关系是前者是全局配置。

要打开一个虚拟机的VNC输出,只需在其配置文件内添加(望文生义即可):

1
2
3
vfb = [ 'type=vnc' ]
#复杂点的:
vfb = [ 'type=vnc,vncdisplay=10,vncpasswd=s3cr3t' ]

vncdisplay的值加上5900,得到的就是最终vnc服务所监听的端口。

更复杂的配置选项看xm create --help_config

关于虚拟机的自动启动

让虚拟机跟随dom0启动的方法有很几种,比如在/etc/xen/auto/目录里面放虚拟机配置文件的链接。但似乎更好的做法是在每个配置文件里面写上:

1
2
on_xend_start = 'start'
on_xend_stop = 'suspend'

这样的好处是当dom0关机,Xen会先让虚拟机进入挂起状态(当然也可以改成shutdown直接关机),下次重启后虚拟机直接恢复。

第六章:其他问题

关于虚拟机的磁盘方式

使用xen-create-image工具创建的虚拟机,默认都是使用loop文件设备来映射,这样对io比较敏感的服务来说会有些影响。Xen3.3后引入了使用blktap驱动映射的磁盘设备,据称性能会有提高,不过根据试验好像跟pygrub配搭不怎么稳定(在xen-4.0下)。

觉得最靠谱的方式是使用lvm,xen-create-image工具也是支持直接创建lvm逻辑卷来安装的,这样即没有性能问题,也没有稳定问题。

全虚拟半虚拟与CPU支持VM指令集的关系

扫了一圈Google到的Xen资料,很多都让你检查/proc/cpuinfo里面有没有支持VM标记。其实CPU是否支持VM指令集,对xen来说只是能不能跑windows的问题,对于Xen的特色——半虚拟来说没什么影响,而且这才是xen最有价值的地方。

相关资料

配置GDM 2.28+登录画面背景、触摸板点击、屏幕背光等……

七月 30, 2010
1
2
3
4
5
6
#!/usr/bin/env xdg-open
 
[Desktop Entry]
Type=Application
Exec=gnome-control-center
Name=gnome_con

把上面的内容保存为/usr/share/gdm/autostart/LoginWindow/gnome_con.desktop,注销登出,在GDM画面时自然出现了gnome-control-center的配置窗口,在外观(apprerance)里面可以配置GMD的壁纸、图标主题,电源管理(Power Managerment)可以设置本本的屏幕背光、触摸板鼠标等等等等,跟一般Gnome配置无异。

完成后重新登录,删除上述保存的文件,即可。Ubuntu 10.04, Fedora 12等一大堆跟进了Gnome 2.28以上的发行版都可以这么配置。

关于GDM还有一些较高级的配置可见 Simple Greeter的开发文档 ,需要配置gconf内的选项,可按上述方法,仅把Exec一项改为Exec=gconf-editor;也可使用su -c,用gconftool-2工具设置文档里面提到的键值具体可参看 ArchLinux Wiki Gnome 2.28 Changes

Across the Great Wall we can reach every corner in the world

七月 6, 2010

2010-7-26 Updated: 支持侦测繁忙服务器。

Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
 
LOCAL_PORT=7070
 
auto_login_ssh () {
    expect -c "set timeout -1;
                spawn ssh -o StrictHostKeyChecking=no $2 ${@:3};
                expect *assword:*;
                send -- $1\r;
                interact;";
}
 
conn_to_ssh () {
    echo "Retriving servers list from freessh.us ...."
    HOSTS=($(curl freessh.us | sed -n "s/.*<td bgcolor='#FFFFFF'>\(.\+\?\)<\/td>.*$/\1/p"))
    ITMS=${#HOSTS[@]}
 
    for I in seq 0 7 $(($ITMS - 1)); do
        if [[ ${HOSTS[$I + 6]} == "正常" ]]; then
            IDX=$I
            break
        elif [[ $I -eq $(($ITMS - 7)) ]]; then
            echo -e "\nError: All server are busy, or something's wrong: \n\n${HOSTS[@]}"
            exit 1
        fi
    done
 
    HOST=${HOSTS[1+$IDX]}
    USR=${HOSTS[2+$IDX]}
    PSW=${HOSTS[3+$IDX]}
    echo "Connecting to ${HOSTS[0+$IDX]} $HOST"
    auto_login_ssh $PSW $USR@$HOST -NC -D $LOCAL_PORT
}
 
while true; do
    conn_to_ssh
done

Remember to have expect installed:

1
sudo apt-get install expect

or

1
sudo yum install expect

Save the code above or download source from google code:

1
2
wget http://ptcoding.googlecode.com/svn/trunk/freessh.sh
chmod +x freessh.sh

To get CROSSED, just run ./freessh.sh or put this into your own PATH.

感谢国家,感谢freessh.us

An improved Vimpress

七月 3, 2010

Vim has been so graceful that I like to have any text editing work done in her, especially coding and blogging.

As a Firefox user, I previously use scribefire to write to my wordpress blog, actually I was working with HTML, I don't like WYSIWYG editing, which always creates dirty codes. However, scribefire is not good enought to me, many of my blogs includes codes, they needed to be surround by <pre> element to be syntax high-lighted, scribefire doesn't always works that well with code symbols, sometimes got translated into codes that hardly understand, I have to login into my blog to correct those lines.

What's more importantly, scribefire isn't good enough as an editor.

Then I found vimpress, and sadly found it was totaly broken, which haven't updated since 2007-07-13. Vimpress's official page is also broken. I googled for it, found that vimpress was noticed by many other blogger, they improved it, and hosting working versions of vimpress in their own repository.

The version by pigeond, he posted a blog about his improvement, this's first working version I got.

Then the other post by Erik, he had vimpress in another git repository, and discussed about his using about vimpress, what's worth another mention here is, vimpress is communicating to your wordpress blog through the XML-RPC protocol, unless your blog uses HTTPS(then use https url in vimpress), or you password would be transfered in plain text.

When I found vimpress is written in Python, I feel eager to improve it. Firstly it didn't support for wp-slug, which is called as 'postname' in wordpress, this is supposed to be a url friendly pattern, won't hurt if people write posts in English, wordpress simply translate spaces in Title into hyphen. But in other language like Chinese, such transfer would be ugly, I often use an English postname for every post.

And then the image upload. Scribefire allow me to upload images to blog and insert the img element to the edit. I added this feature to vimpress.

I added more friendly notifications for exceptions proccess, and many functions rewritten.

Now vimpress is mature enough to fulfill my blogging works. I firstly write my blog in Markdown, save as a temp file, then open a new buffer, type :BlogNew, then :r !markdown my_tmp.mkd , my post will translate into pretty HTML. Then fillin those title meta data, then :BlogSave publish, done. Pretty, Simple.

I still think I should have markdown ingranted to support with Markdown.

My version of vimpress could be retrived in my google code repository:

1
svn checkout http://ptcoding.googlecode.com/svn/trunk/vimpress

下班关机拔U盘的提醒程序

七月 2, 2010

我的U盘是跟钥匙系一起的,最近两次因为U盘插在公司机器上下班后忘了拿,结果回家后在门口游荡,郁闷的等室友回来才有家门进,于是要做这么个东西,关机前检测到没拔U盘,要猛叫猛叫

原理倒是不复杂,研究了下,检测U盘可以读取/proc/bus/usb/devices,如果主机上插有U盘,会出现Driver=usb-storage这一行的。

然后是关机脚本的运行。Linux关机时候会执行level 0的init脚本,比如对于Debian/Ubuntu,就是/etc/rc0.d下的文件,我工作机跑的是Archlinux,专门为用户自定命令提供了/etc/rc.local.shutdown文件,作为/etc/rc.shutdown的hook,前者不会因为initscripts包的升级安装被覆盖。

至于让主机会叫,当然是主机喇叭了,这里可没有外放音箱。查了下发现beep这个程序,安装后发现功能还不少,可以定制beep的音调,时长等,可玩性很高。于是先找了音谱频率对照表,按把美剧《24小时》里面CTU内常用的电话铃声谱了出来,大概是EEGC 或者 EEC^C的样子,不过因为主板蜂鸣器的结构区别,通常不同频率的音量有些不同。

另外当然也应该有点视觉提示啦,在init script里面,终端支持的东西多着呢,按终端颜色代码,让终端打印红色加粗闪烁体,足够显眼了。

最终效果是这样的:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
#
# /etc/rc.local.shutdown: Local shutdown script.
#
 
while [[ `cat /proc/bus/usb/devices | grep usb-storage` ]]; do
    echo -e "\033[43;31;1;5m!!!!!!  Unplug Your USB Driver or I'll Keep SCREAMING !!!!!!! \033[0m"
    beep -f 659.3 -l 200 -D 100 -n -f 659.3 -l 200 -D 200 -n -f 1046 -l 200 -D 50 -n -f 523.3 -l 600
    sleep 1;
done;

其他的几组不同八度的响声,记下来以后备用。

1
2
3
4
#!/bin/bash
beep -f 659.3 -l 200 -D 100 -n -f 659.3 -l 200 -D 200 -n -f 784 -l 200 -D 50 -n -f 523.3 -l 600
beep -f 1318.5 -l 200 -D 100 -n -f 1318.5 -l 200 -D 200 -n -f 1568 -l 200 -D 50 -n -f 1046.5 -l 600
beep -f 2637 -l 200 -D 100 -n -f 2637 -l 200 -D 200 -n -f 3136 -l 200 -D 50 -n -f 2093 -l 600

用于shell脚本无交互的ssh自动登陆

六月 24, 2010

用于shell脚本无交互的ssh自动登陆

ssh连接远程主机时候询问密码,跟su、sudo命令的默认行为一样,是不从stdin读入数据的,据称是为安全考虑,但是有时候在脚本当中确实需要无人守值的登陆。

搜索一下不难找到类似的例子,使用expect来完成密码应答:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
auto_login_ssh () {
    expect -c "set timeout -1;
                spawn -noecho ssh -o StrictHostKeyChecking=no $2 ${@:3};
                expect *assword:*;
                send -- $1\r;
                interact;";
}
 
auto_login_ssh passwd user@host

StrictHostKeyChecking=no参数让ssh默认添加新主机的公钥指纹,也就不会出现出现是否继续yes/no的提示了。

expect很不错,上述代码基本可以达到要求了,能够当翻墙用的ssh -D自动登陆,执行远程命令等等,但是如果作为一个非交互的远程工具,应该说还差一点,不能返回整个连接执行过程是否成功。

使用expect后,程序的exit status是expect的,而不是ssh的,所以如果遇上连接不到的主机、密码错误等情况,expect也一样是正常退出,$?为0,所以需要对expect的代码稍加修改;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
auto_smart_ssh () {
    expect -c "set timeout -1;
                spawn ssh -o StrictHostKeyChecking=no $2 ${@:3};
                expect {
                    *assword:* {send -- $1\r;
                                 expect {
                                    *denied* {exit 2;}
                                    eof
                                 }
                    }
                    eof         {exit 1;}
                }
                "
    return $?
}
 
auto_smart_ssh passwd user@host ls /var
echo -e "\n---Exit Status: $?"

这段expect的Tcl代码我已经尽量弄的好看点了(但还是挺难看),主要作用是,如果在输入密码后遇到Permission denied,肯定是脚本提供的帐号有问题,就直接让expect按状态2退出;而如果主机不可达No route to host, timed out, Connection refused等情况,ssh会直接退出,expect收到eof,让其按状态1退出。而因为这个设计本来就用于执行远程命令后退出,不需要用户交互,所以第9行的eof则是让expect等待ssh退出,而不是不是进行interact了。

有这样的处理,使用auto_smart_ssh的脚本就可以根据返回值判断执行过程的是否成功,而进行相应处理了。

openssh里面另外一个很好用的远程文件传输工具scp,也以如法炮制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
auto_scp () {
    expect -c "set timeout -1;
                spawn scp -o StrictHostKeyChecking=no ${@:2};
                expect {
                    *assword:* {send -- $1\r;
                                 expect {
                                    *denied* {exit 1;}
                                    eof
                                 }
                    }
                    eof         {exit 1;}
                }
                "
    return $?
}
 
auto_scp pass ~/myfile user@host:~/path/to/myfile
echo $?

后话:如果仅仅是日常使用,为了避免经常输入主机密码的麻烦,最理想的方法是生产本机的公/私密钥对,把指纹直接复制到远程主机上,较新的openssh提供了ssh-copy-id工具:

1
2
3
4
ssh-keygen
ssh-copy-id user@host1
ssh-copy-id user@host2
ssh-copy-id user@host3

运行ssh-keygen时会问几个问题,全部回车默认就是我们要的效果了,分别把密钥分发到远程主机后,以后执行ssh user@host,还是scp,都是直接完成了。

如果需要删除远程机器上对应本机本账户的密钥,登陆到该账户,打开~/.ssh/authorized_keys文件,搜索你的用户名,删除那行,保存,即可。

Unix心传:无名师与MCSE能者(伪文言翻译)

六月 11, 2010

无名师与MCSE能者

一通熟Windows之能者见无名师,曰:“闻师深修Unix之道,吾以密巧相述,相益,可乎?”

无名师曰:“求智,善矣;然Unix之道并无甚密巧。”

能者惑:“人曰师乃当世Unix大道之贤者,通晓其中之变法,如吾之于Windows;吾乃MCSE,有世所罕之证书,吾铭记各注册表项功能于心,更可细述任一Windows API,乃至微软所未曾详述者。师,所以为师,为智,皆揭而知他人之不知也。”

无名师曰:“怠矣,本无秘,何以揭?”

能者嗔:“若无密巧,何以修乃成师之业?”

无名师曰:“求智者,以他人之不知为智,犹如求光明者,拥烛笼火,以为珍贵,乃终被灼也。”

听此,能者顿觉灵光。

Master Foo and the MCSE

Once, a famous Windows system administrator came to Master Foo and asked him for instruction: “I have heard that you are a powerful Unix wizard. Let us trade secrets, that we may both gain thereby.”

Master Foo said: “It is good that you seek wisdom. But in the Way of Unix, there are no secrets.”

The administrator looked puzzled at this. “But it is said that you are a great Unix guru who knows all the innermost mysteries. As do I in Windows; I am an MCSE, and I have many other certifications of knowledge not common in the world. I know even the most obscure registry entries by heart. I can tell you everything about the Windows API, yes, even secrets those of Redmond have half-forgotten. What is the arcane lore that gives you your power?”

Master Foo said: “I have none. Nothing is hidden, nothing is revealed.”

Growing angry, the administrator said “Very well, if you hold no secrets, then tell me: what do I have to know to become as powerful in the Unix way as you?”

Master Foo said: “A man who mistakes secrets for knowledge is like a man who, seeking light, hugs a candle so closely that he smothers it and burns his hand.”

Upon hearing this, the administrator was enlightened.

==========================================

纯装B而作,原Source

Linux系统的备份、恢复与迁移

六月 9, 2010

整系统的备份,应该很多人会想起Ghost,其实开源界有其相应的实现,比如CloneZillaPartimage,或者原始点的dd,对备份Linux来说,这些Linux原生的工具显然要比需要DOS/WinPE环境的Ghost要更加“原汁原味”,而且开源版的工具功能一点也不少,一样可以网络传输等,而且支持多种格式(或者说格式无关,dd),不过本文关注的,是一个更加原始的方法,tar。

tar的历史都好几十年了,它的用法没有改变,而且相信未来很几十年内都不会变,而且作为一个日常常用的压缩解压工具,很多人都可以对它自如控制。其实,tar是很好的系统备份/迁移工具,它抽象于文件系统,不管是从ext迁移到reiserfs,从普通文件系统到LVM,还是到RAID,比起上述的那些影像工具,tar可以说是最胜任的迁移工具。

其实Ubuntu的社区文档BackupYourSystem/TAR有详细的解析和介绍,我在这里抄录一些重点,不做过多解释,看命令:

创建备份:

cd /
tar -cvpzf backup.tar.gz --exclude=/backup.tar.gz --exclude=/lost+found --exclude=/proc/* --exclude=/sys/* --exclude=/mnt/* --exclude=/media/* --exclude=/dev/* /

恢复备份:

tar -xvpzf /home/test/backup.tar.gz -C /

通过网络接收备份并恢复:

nc -l -p 1024 | tar -xvpjf - -C /mnt/disk

或者:(这个就不用nc了,也就不需要下面那行,但是要开sshd)

ssh user@host cat backfile.tar.gz |tar -xvpzf - -C /mnt/disk

通过网络发送备份:

cat backup.tar.gz | nc -q 0 192.168.1.x 1024

通过网络发送备份成文件等,按需自由配置。
【这里用的nc是netcat工具,提供稳定的后台网络连接;另外archlinux下默认安装的gnu-netcat不支持-q参数,意为管道传输完后退出,一般在发送方配置,如果省了,可以人工Ctrl+C结束之】

PT的喃喃自语:
看到netcat这个工具在这里应用,我第一感觉是,惊艳,太惊艳了,虽然玩Linux两年来惊艳的感觉时有体会。马上想起的是不久前读的《开源世界旅行手册》。其中一章节,无根的根:无名师的 Unix 心传(Rootless Root:The Unix Koans of Master Foo)原来是《Unix编程艺术》一书的附录,中文翻译颇像一些类似经文之类的口吻(就是翻译后略显艰涩了,我找来英文版对着才看懂),内容很有趣。其中“无名师与万行码”就说到shell跟C,哪个更“Unix-nature”,netcat就是很好的例子,功能很简单,就是提供网络连接,但至于要传输什么,是系统备份的压缩数据,是个配置文件,是ffmpeg编码出来摄像头的视频信息……经过了内核的管道,bang!,多神奇的功能就这么组合起来轻松实现了,这就是Unix-nature,注重于任务的快速、高效、简洁地完成,而不是写了多少行代码。

Page optimized by WP Minify WordPress Plugin

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org