自从买了Macbook之后一直在学习Unix命令行,目的之一是为了更熟练地玩Liunx系统。虽然Mac OS X和Linux都是基于Unix,但是Mac OS X在各种设定上还是和主流Linux有很大区别,所以最终还是在Parallels里面安装了Ret Hat旗下的Fedora(因为它和RHEL有很多共通的地方)。既然要学命令行式的操作方式,那默认启动的X对我来说就是徒占系统资源而已,毫无意义,所以想到直接在Mac OS X的Terminal里SSH连接到Fedora虚拟机,这样一来能够节省系统资源,二来不用在虚拟机和本机之间切换,省去很多麻烦,三来可以让自己习惯命令行的操作方式,一举多得。

X模式和文本模式下的Fedora虚拟机系统资源占用对比

X模式和文本模式下的Fedora虚拟机系统资源占用对比

Parallels虚拟机的默认网络设定是Shared Networking,在这种模式下,主机和虚拟机之间能够通过虚拟网络互相通信,虚拟机也能通过主机连接互联网,所以其实在本机不需要任何设定就可以连接到虚拟机。事实上,我们通过ifconfig命令就会发现,Parallels在本地建立了两个虚拟网卡,vnic0和vnic1,前者用于Shared Networking,后者用于Host-Only模式。

Parallels的shared-networking模式

所以要实现SSH连接到Linux虚拟机,只需要在Linux下做一些设定即可。

设定Fedora默认启动为文本模式(可选)

Linux一般有0-6一共7种启动级别,默认为5,即图形界面模式,可以通过编辑/etc/inittab文件的方式更改。这个文件事实上也只有最后一行有效,其他全是注释。

#我把Root用户的命令提示符全部更换成了美元符号,不然命令会被错误地识别为注释了。

[root@Mac /]$ vi /etc/inittab

#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:

编辑保存之后,下次重启就会启动到文本界面了。

开启SSH服务,并设定为开机自启动

Fedora下SSH服务默认是停止的,所以我们需要手动开启。

#查看sshd服务的状态
[root@mac /]$ service sshd status
openssh-daemon is stopped

#开启sshd服务
[root@mac /]$ service sshd start
Generating SSH2 RSA host key:                              [  OK  ]
Generating SSH1 RSA host key:                              [  OK  ]
Generating SSH2 DSA host key:                              [  OK  ]
Starting sshd:                                             [  OK  ]

#再确认一下状态,running状态说明启动成功
[root@mac /]$ service sshd status
openssh-daemon (pid  2027) is running...

每次手动开启就太麻烦了,所以可以将SSH服务设置为开机自启动

#通过chkconfig命令来设定开机自启动,默认为在2-5这4个启动级别上自动启动
[root@Mac /]$ chkconfig sshd on

#确认设定成功
[root@Mac eric]$ chkconfig | grep sshd
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off

更改防火墙设定

Fedora的防火墙在手动配置之前是拒绝ssh连接的,所以即便是开启了ssh服务,我从本地连接也会提示Connection Refused。

#IP地址可以在虚拟机里通过ifconfig命令获取
ericzhuの Macbook :~ $ ssh root@10.211.55.8
ssh: connect to host 10.211.55.8 port 22: Connection refused

解决办法有两个:

  1. 完全禁用防火墙 最省心的办法,本来这个防火墙也没有太大作用。方法和处理SSH服务的类似。
[root@Mac eric]$ service iptables stop
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]

[root@Mac eric]$ chkconfig iptables off
[root@Mac eric]$ chkconfig | grep iptables
iptables        0:off   1:off   2:off   3:off   4:off   5:off   6:off
  1. 配置iptables文件,允许SSH连接 如果觉得禁用防火墙太暴力,可以配置一下防火墙设定,让它允许ssh连接。Fedora提供了一个图形配置界面system-config-firewall,在文本模式下直接输入system-config-firewall即可进入配置界面,进入Custom选项之后,在Trust Services列表里勾选SSH,然后应用即可。

配置防火墙的图形界面system-config-firewall

当然,system-config-firewall也仅仅是一个用来向/etc/sysconfig/iptables写入数据的工具,我们可以直接修改iptables文件,手动加入防火墙规则,然后重启iptables服务即可。

第10行就是允许SSH连接的规则(SSH默认端口22)。

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

保存之后,重启防火墙服务

[root@Mac eric]$ service iptables restart
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]
[root@Mac eric]#

在终端里SSH登陆到虚拟机

这样一切配置妥当之后,在终端里就能ssh登陆到Linux虚拟机了。为了以后方便,我在.bashrc里写入一笔别名:

alias fedora='ssh root@虚拟机IP地址'

以后启动虚拟机之后,直接输入fedora然后输入密码即可登入。

从Mac终端登入Fedora虚拟机

杂七杂八

Parallels还支持Bridge Networking(网络桥接),采用这种模式的时候,虚拟机可以模拟成本地网络中的机器,和本机平行。我在家使用无线路由器,所以虚拟机的IP就会变成192.168.0.X,这种方式也许比Shared Networking更加直观。

Ubuntu不同,Fedora(Red Hat系的Linux应该都这样)默认启用了root账号,而在安装过程中新建的用户账号是没有sudo权限的,也就是说,如果要执行某些系统管理命令,必须切换到root,而不能使用sudo,这和我以前在Ubuntu下养成的习惯不同。

可以通过visudo命令将自己的账户加入到sudoer。

Fedora 15也即将推出了,好像是要加入到 GNOME 3,很牛掰的样子。