跳转到内容

QEMU/SunOS 4.1.4

来自维基教科书,开放的书籍,用于开放的世界

本章介绍在模拟的 QEMU 1.4.0 SPARC 机器上安装 SunOS 4.1.4 (= Solaris 1.1.2)。SunOS 4.1.4 是 Sun Microsystems 的最后一个纯粹基于 BSD 的 Unix 操作系统。它被基于 System V Release 4 的 Solaris 2.x (= SunOS 5.x) 取代。为 SunOS 4.x 编译的程序在 Solaris 2.x 版本上无法运行,除非使用二进制模拟。Unix文件Solaris 2.4 下的实用程序会打印类似于以下内容的报告:

Sun demand paged SPARC executable

对于 SunOS 4.1.4 二进制文件,以及

ELF 32-bit MSB executable SPARC Version 1, dynamically linked, stripped

对于 Solaris 2.4 二进制文件。如果您想在 SunOS 4.1.4 上本机运行第一种类型的古老计算机程序,您可能需要尝试一下。

先决条件

[编辑 | 编辑源代码]
  • SunOS 4.1.4 安装 CD-ROM 镜像
  • SPARCstation 5 ROM Rev. 2.15 镜像

在下文中,CD 镜像文件名为solaris1.1.2.iso而 ROM 镜像文件名为ss5.bin。为了我们的安装,我们将创建一个大小为 2 GB 的磁盘镜像

$ qemu-img create -f qcow2 -o compat=1.1 sunos414.img 2G
Formatting 'sunos414.img', fmt=qcow2 size=2147483648 compat='1.1' encryption=off cluster_size=65536 lazy_refcounts=off 

为了与 1.1 之前的 QEMU 版本兼容,请省略compat=1.1。如果您需要更多空间,请将2G替换为更高的值,但请记住,安装程序不会提供预定义的磁盘几何形状。您将不得不在安装过程中自己输入 CHS 值。

复制 Miniroot 镜像

[编辑 | 编辑源代码]

我们使用以下命令启动模拟的机器。这里和以下所有在主机(QEMU 运行的系统)上的命令都将使用 shell 提示符“$”,ROM 提示符将是“ok”,访客提示符(在模拟机器上运行的系统的提示符)将是“#”,而 QEMU 监视器提示符将是“(qemu)".

$ qemu-system-sparc -monitor tcp::4444,server,nowait -bios ss5.bin -m 32 -nographic -hda sunos414.img -hdb solaris1.1.2.iso

我们省略了-machine选项,这意味着 QEMU 默认将模拟一个 SPARCstation 5(基于 sun4m 架构)。模拟的机器没有提供任何可用的图形,因此我们将使用-nographic禁用图形输出,将所有输出重定向到我们启动 QEMU 的终端。稍后我们将解释如何通过将显示输出到在主机上运行的 X 服务器来在访客上运行 X Windows 程序。由于也不会有键盘模拟,所以所有输入也将从终端接收。您将看到以下 ROM 消息

Keyboard not present. Using tty for input and output.

-monitor选项使我们能够通过 telnet 连接控制 QEMU,在我们的示例中,通过端口 4444。为此,请在另一个控制台中执行

$ telnet localhost 4444

。或者,我们可以省略该-monitor选项,并使用“Ctrl-a c”命令在控制台(QEMU 运行的控制台)和 QEMU 监视器提示符之间切换。在这种情况下,键入“Ctrl-a h”以获取帮助。有用的命令是

(qemu) stop

暂停模拟的机器,以及

(qemu) cont

恢复。当模拟的机器未暂停时,您将始终在主机系统上拥有完整的 CPU 负载。该命令会立即终止 QEMU

(qemu) q

我们的模拟机器拥有 32 MB 的 RAM,由-m选项指示。这似乎是最小的数量,不会导致 QEMU 退出并出现以下错误:

qemu: fatal: Trap 0x29 while interrupts disabled, Error state

SPARCstation 5 的最大数量为 256 MB。如果您不想等待 ROM 内存测试(需要一些时间),请选择 32 MB。我们不会通过-cdrom选项使用模拟的 CD-ROM 设备,因为它不起作用。相反,我们将安装 CD 声明为第二个硬盘。ROM 的启动序列以网络启动失败结束

Boot device: /iommu/sbus/ledma@5,8400010/le@5,8c00000  File and args: 
Internal loopback test -- Wrong packet length; expected 36, observed 64 

似乎 QEMU 1.4.0 版本无法让我们通过网络启动。我们将使用

ok boot disk1:d

从第二个硬盘(我们的 CD 镜像)上的第四个分区启动,该分区包含针对我们架构的启动块。进行以下选择

What would you like to do?
  1 - install SunOS mini-root
  2 - exit to single user shell
Enter a 1 or 2: 1
Beginning system installation - probing for disks.
Which disk do you want to be your miniroot system disk?
  1 - sd1:  <CD-ROM Disc for SunOS Installation> at esp0 slave 8
  2 - sd3:  <drive type unknown>> at esp0 slave 0
  3 - exit to single user shell
Enter a 1, 2 or 3: 2
selected disk unit "sd3".
Do you want to format and/or label disk "sd3"?
  1 - yes, run format
  2 - no, continue with loading miniroot
  3 - no, exit to single user shell
Enter a 1, 2, or 3: 1

请注意,启动的系统有自己的想法来排列连接的驱动器。我们启动的设备(第二个硬盘)被命名为sd1,而我们的目标磁盘被命名为sd3。我们选择格式化后者。我们选择类型“SUN2.1G”

format> type


AVAILABLE DRIVE TYPES:
        0. Quantum ProDrive 80S
        1. Quantum ProDrive 105S
        2. CDC Wren IV 94171-344
        3. SUN0104
        4. SUN0207
        5. SUN0320
        6. SUN0327
        7. SUN0424
        8. SUN0535
        9. SUN0669
        10. SUN1.0G
        11. SUN1.05
        12. SUN1.3G
        13. SUN2.1G
        14. CD-ROM Disc for SunOS Installation
        15. other
Specify disk type (enter its number): 13
selecting sd3: <SUN2.1G>
[disk formatted, no defect list found]

预定义的磁盘格式存储在/etc/format.dat(位于 miniroot 文件系统中)。我们 CD-ROM 上 miniroot 镜像的路径是

EXPORT/EXEC/KVM/SUN4M_SUNOS_4_1_4/MINIROOT_SUN4M

format.dat中,我们可以找到针对我们磁盘类型的磁盘几何形状

disk_type = "SUN2.1G" \
	: ctlr = SCSI : fmt_time = 4 \
	: ncyl = 2733 : acyl = 2 : pcyl = 3500 : nhead = 19 : nsect = 80 \
	: rpm = 5400 : bpt = 44823

,以及针对预定义的划分的

partition = "SUN2.1G_PREINSTALL" \
        : disk = "SUN2.1G" : ctlr = SCSI \
        : a = 0, 62320 : b = 41, 197600 : c = 0, 4154160 : g = 171, 1947120 \
        : h = 1452, 1947120

partition = "SUN2.1G_STANDARD" \
        : disk = "SUN2.1G" : ctlr = SCSI \
        : a = 0, 62320 : b = 41, 197600 : c = 0, 4154160 : g = 171, 3894240

请注意,ncyl*nhead*nsect=4154160是第三个分区的 512 字节块数,它包含所有可用空间,而磁盘的大小为(ncyl+acyl)*nhead*nsect=4157200块,大约为 1.98 GB 或 2.13e9 字节。如果您想在没有预定义几何形状的磁盘镜像上安装,您将不得自己输入这些数字。要将分区写入磁盘并打印分区表,请执行

format> label
Ready to label disk, continue? y

format> partition
partition> print
Current partition table (SUN2.1G_PREINSTALL):
        partition a - starting cyl      0, # blocks    62320 (41/0/0)
        partition b - starting cyl     41, # blocks   197600 (130/0/0)
        partition c - starting cyl      0, # blocks  4154160 (2733/0/0)
        partition d - starting cyl      0, # blocks        0 (0/0/0)
        partition e - starting cyl      0, # blocks        0 (0/0/0)
        partition f - starting cyl      0, # blocks        0 (0/0/0)
        partition g - starting cyl    171, # blocks  1947120 (1281/0/0)
        partition h - starting cyl   1452, # blocks  1947120 (1281/0/0)

partition> quit

交换分区的的大小b为 100 MB。在 SunOS 4.x 中,交换分区的的大小应至少与 RAM 的大小相同,因为每个程序都保留了与内存大小相同的交换空间。根据需要更改交换空间,并使用以下命令退出格式化实用程序:

format> quit
checking writeability of /dev/rsd3b
0+1 records in
1+0 records out
Extracting miniroot ...
using cdrom partition number 3
fastread: failed to open /dev/rsr0No such device or address
ERROR while loading miniroot disk: /dev/rsd3b

通过extract脚本提取 minroot 会失败,因为源 CD-ROM 设备/dev/rsr0不存在。在文件/extract中,我们可以找到用于定位 miniroot 镜像的数字(以字节为单位)

miniskip=4194304
minicount=7168000

以及用于复制它的命令

        fastread $cddev $cdpartno $miniskip $minicount > /dev/r${disk}b

有了这些信息,我们可以将 miniroot 提取到目标磁盘的交换分区中

# dd if=/dev/rsd1d bs=4096 skip=1024 count=1750 of=/dev/sd3b
1750+0 records in
1750+0 records out

使用以下命令重新启动机器:

# reboot

回到 ROM 提示符,我们启动 miniroot

ok boot disk0:b -w

-w标志是必要的,以使挂载的文件系统可写,如 SunInstall 程序所要求。SunInstall 程序不允许我们选择硬盘作为安装源。因此,我们将 CD-ROM 设备/dev/sr0链接到与我们的 CD-ROM 镜像关联的硬盘

# cd /dev
# mv sr0 sr0.bak
# ln -s sd1a sr0

SunInstall 将使用脚本/dev/MAKEDEV重新创建设备名称。为了排除/dev/sr0,我们删除了它在MAKEDEV:

# mv MAKEDEV MAKEDEV.bak
# sed 's/sr0 //' MAKEDEV.bak > MAKEDEV
# chmod 755 MAKEDEV
# cd /

中的条目。我们现在准备启动 SunInstall

# suninstall

                               Welcome to SunInstall

     Remember:  Always back up your disks before beginning an installation.

  SunInstall provides two installation methods:
     1. Quick installation

        This option provides an automatic installation with a choice of 
        standard installations, and a minimum number of questions asked. 

     2. Custom installation

        Choose this method if you want more freedom to configure your
        system.  You must use this option if you are installing your
        system as a server.

        Your choice (or Q to quit) >> 2


Select your terminal type:
        1) Televideo 925
        2) Wyse Model 50
        3) Sun Workstation
        4) Other

>> 4

Enter the terminal type ( the type must be in /etc/termcap ):
>> ansi

Enter the local time zone name (enter ? for help):

>> ?

终端类型ansi似乎运行良好。如果您在显示 SunInstall 菜单时遇到问题,您可以使用“Ctrl-l”重新绘制屏幕。如果您知道自己的时区名称,您可以直接输入。使用“?”,我们将引导至菜单以选择我们的时区。确认正确的时区设置后,我们将被引导至分配主机信息的表格

 HOST FORM                [?=help] [DEL=erase one char] [RET=end of input data]
-----------------------------------------------------------------------------
 Workstation Information :
      Name : sunguest
      Type : x[standalone]  [server]  [dataless]





 Network Information :
      Ethernet Interface :  [none] x[le0]

      Internet Address   : 10.0.2.15  
      NIS Type           : x[none]  [master]  [slave]  [client]


 Misc Information :
      Reboot after completed        :  [y] x[n]



 Are you finished with this form [y/n] ? y
    [x/X=select choice] [space=next choice] [^B/^P=backward] [^F/^N=forward]

在此示例中,我们将主机名设置为“sunguest”,而 10.0.2.15 是 QEMU 分配给访客系统的标准地址。下一个表格让我们分配磁盘信息

 DISK FORM                [?=help] [DEL=erase one char] [RET=end of input data]
 -----------------------------------------------------------------------------
 Attached Disk Devices :
    [sd1]    x[sd3]

 Disk Label :  [default] x[use existing]  [modify existing]
 Free Hog Disk Partition :  [d]  [e]  [f]  [g] x[h]
 Display Unit            : x[Mbytes]  [Kbytes]  [blocks]  [cylinders]

 PARTITION START_CYL BLOCKS    SIZE     MOUNT PT             PRESERVE(Y/N)
 ==============================================================================
     a     0         62320     31       /                          n
     b     41        197600    100
     c     0         4154160   2126
     d     0         0         0
     e     0         0         0
     f     0         0         0
     g     171       1947120   996      /usr                       n
     h     1452      1947120   996      /home                      n



 Ok to use this partition table [y/n] ? y
    [x/X=select choice] [space=next choice] [^B/^P=backward] [^F/^N=forward]

最终,我们设置源设备并为软件选择做出选择

 SOFTWARE FORM            [?=help] [DEL=erase one char] [RET=end of input data]
 -----------------------------------------------------------------------------
 Software Architecture Operations :
      x[add new release]  [edit existing release]




 Media Information :
      Media Device   :  [st0]  [st1]  [st2]  [st_]  [xt0]  [mt0]  [fd0] x[sr0]
      Media Location : x[local]  [remote]


 Choice : x[all]  [default]  [required]  [own choice]
      Executables path :  /usr
      Kernel executables path :  /usr/kvm






 Ok to use these values to select Software Categories [y/n] ? y
    [x/X=select choice] [space=next choice] [^B/^P=backward] [^F/^N=forward]

然后,我们将收到有关要安装的软件包的信息,并到达最终屏幕,从该屏幕我们可以开始安装

 MAIN MENU                                                            [?=help]
 -----------------------------------------------------------------------------
                   Sun Microsystems System Installation Tool

                     ( + means the data file(s) exist(s) )


                    +     assign host information

                    +     assign disk information

                    +     assign software information





                          start the installation

                          exit suninstall



  [RET/SPACE=next choice] [x/X=select choice] [^B/^P=backward] [^F/^N=forward]

数据文件的存在由“+”指示,意味着即使我们重新启动机器,输入的数据也不会丢失。SunInstall 完成工作后,我们可以使用以下命令重新启动

# reboot

,并且应该能够使用以下命令启动我们的新系统

ok boot disk0

在登录提示符下,我们可以输入root,并获得无需密码的 shell 提示符。可以使用以下命令停止系统

# halt

,并可以使用以下命令关闭机器

ok power-off

访客配置

[编辑 | 编辑源代码]

如果您想使用主机名来访问主机系统,请在/etc/hosts(位于访客中)将 IP 地址 10.0.2.2 分配给它

# cat >> /etc/hosts
10.0.2.2 qemuhost
^D

其中^D表示 Ctrl-d。主机名对于在访客中使用 rlogin、rsh 和 rcp 是必要的。为了连接到外部,我们将使用以下命令设置默认路由

# route add default 10.0.2.2 1
add net default: gateway 10.0.2.2

并使用以下命令使其永久有效

# cat > /etc/defaultrouter
10.0.2.2
^D

使用以下命令检查路由

# netstat -r
Routing tables
Destination          Gateway              Flags    Refcnt Use        Interface
localhost            localhost            UH       1      288        lo0
default              qemuhost             UG       0      0          le0
arpanet              sunguest             U        2      96         le0

用户网络

[编辑 | 编辑源代码]

使用 QEMU 的默认网络后端,我们可以利用-redir选项允许主机和访客之间通过 Telnet(端口 23)、rlogin 到访客(端口 513)或使用 rcp(端口 514)在主机和访客之间复制文件进行连接。如果主机连接到互联网,Telnet 也可用于从访客连接到外部世界。对于 rlogin 和 rcp,我们需要在 Linux 主机系统上拥有 root 权限才能定义数据包过滤器规则。使用以下命令启动仿真机器:

$ qemu-system-sparc -monitor tcp::4444,server,nowait -bios ss5.bin -m 32 -nographic -hda sunos414.img \
-redir tcp:4423:10.0.2.15:23 -redir tcp:4513:10.0.2.15:513 -redir tcp:4514:10.0.2.15:514

使用infoQEMU 监控器的命令打印转发端口的表格

(qemu) info usernet
info usernet
VLAN 0 (user.0):
  Protocol[State]    FD  Source Address  Port   Dest. Address  Port RecvQ SendQ
  TCP[HOST_FORWARD]  10               *  4423       10.0.2.15    23     0     0
  TCP[HOST_FORWARD]   9               *  4513       10.0.2.15   513     0     0
  TCP[HOST_FORWARD]   8               *  4514       10.0.2.15   514     0     0

转发到主机的端口必须大于 1023(只要您不是以 root 身份运行 qemu)。要检查 QEMU 正在监听的端口,请执行以下操作:

$ netstat -tulpn | grep qemu
tcp        0      0 0.0.0.0:4514            0.0.0.0:*               LISTEN      27021/qemu-system-s 
tcp        0      0 0.0.0.0:4423            0.0.0.0:*               LISTEN      27021/qemu-system-s 
tcp        0      0 0.0.0.0:4444            0.0.0.0:*               LISTEN      27021/qemu-system-s 
tcp        0      0 0.0.0.0:4513            0.0.0.0:*               LISTEN      27021/qemu-system-s 

访客系统启动后,我们就可以从主机连接到访客

$ telnet localhost 4423

以及从访客连接到主机

# telnet 10.0.2.2

或从访客连接到外部(india.colorado.edu 报告当前的协调世界时)

# telnet 128.138.140.44 13
Trying 128.138.140.44 ...
Connected to 128.138.140.44.
Escape character is '^]'.

56365 13-03-14 00:33:39 50 0 0 147.2 UTC(NIST) * 
Connection closed by foreign host.

我们甚至可以使用ping命令从访客检查主机是否在线

# ping 10.0.2.2
10.0.2.2 is alive

Rlogin 和 rcp 使用固定端口。我们在主机上定义端口重定向规则以获取到访客的连接。要使此操作正常工作,您可能需要在以 root 身份执行之前禁用防火墙(或参见下文以获取更精确的设置)

$ iptables -t nat -I OUTPUT -o lo -p tcp --dport 513 -j REDIRECT --to-ports 4513
$ iptables -t nat -I OUTPUT -o lo -p tcp --dport 514 -j REDIRECT --to-ports 4514

使用以下命令打印规则:

$ iptables -t nat -n -L OUTPUT
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:514 redir ports 4514 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:513 redir ports 4513 

可以使用以下命令删除这些规则:

$ iptables -t nat -D OUTPUT 1
$ iptables -t nat -D OUTPUT 1

在 openSUSE 11.4 中,禁用防火墙将删除这些规则。因此,我们将首先停止防火墙,然后定义规则。或者,我们可以保持防火墙开启,只删除以下单个规则:

$ iptables -t raw -n -L OUTPUT
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
NOTRACK    all  --  0.0.0.0/0            0.0.0.0/0           

使用以下命令:

$ iptables -t raw -D OUTPUT 1

可以使用以下命令恢复此规则:

$ iptables -t raw -A OUTPUT -j NOTRACK

或通过停止防火墙并重新启动它。现在我们应该能够从主机连接到访客,方法是:

$ rlogin -l root localhost

以及以主机上的 root 身份双向复制文件:

$ rcp file_on_host localhost:
$ rcp localhost:file_on_guest .

要以主机上的普通用户身份使用 rcp,我们必须在访客上创建一个同名的用户。由于作者未知的原因,类似于以下的远程 shell 命令:

$ rsh localhost uname

会失败,并出现以下错误:

socket: protocol failure in circuit setup

从访客到主机的 rlogin、rsh 和 rcp 在此设置中不起作用。使用以下命令进行端口重定向:

$ ssh -L 23:localhost:4423 localhost

(作为 root)适用于 Telnet,但当通过 SSH 重定向端口 513 和 514 时,无法从主机建立连接。错误消息为:

rlogind: Permission denied.

尝试 rlogin 到访客时

rcmd: localhost: short read

尝试 rcp 到访客时。

使用 TAP 设备

[edit | edit source]

在上一节中,我们看到了 QEMU 用户网络的不足。使用 tap 网络后端允许主机和访客之间建立不受限制的连接。要在 Linux 主机上创建和配置 TUN/TAP 接口,我们需要 root 权限

$ tunctl -t tap0 -u user_name_on_host
$ ifconfig tap0 10.0.2.2 netmask 255.255.255.0

我们使用以下命令启动 qemu:

$ qemu-system-sparc -monitor tcp::4444,server,nowait -nographic -bios ss5.bin -m 32 -hda sunos414.img \
-net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=no,downscript=no

从主机,我们使用地址 10.0.2.15 访问主机,从访客,我们使用地址 10.0.2.2 访问主机。对于访客上的 rlogin 和其他命令,我们需要使用在/etc/hosts中定义的主机名引用主机系统。如果主机配置允许,我们应该能够毫无问题地进行 ping 和通过 Telnet、rlogin、rsh 和 rcp 进行连接。主机上的 root rlogin 可能完全被禁用,对于用户,我们通常需要将地址 10.0.2.2 添加到~/.rhosts。主机上的防火墙必须配置(或禁用)以允许此类连接。我们还可以通过在主机 X 服务器上显示来在访客上运行 X Window 程序

$ xhost +10.0.2.15

(在主机上)将允许从访客访问,以及

# usr/openwin/bin/xterm -display 10.0.2.2:0

启动访客上 X Window 系统的终端模拟器,显示在主机上的一个窗口中。我们可以通过在主机上启用 IP 转发来为访客提供互联网访问

$ echo 1 > /proc/sys/net/ipv4/ip_forward
$ iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

其中wlan0是将主机连接到互联网的网络设备(通常是eth0用于局域网连接)。主机上的防火墙可能需要禁用才能使其正常工作。

运行 OpenWindows

[edit | edit source]

使用 TAP/TUN 网络设置,在访客上设置以下环境变量:

# setenv DISPLAY 10.0.2.2:1.0
# setenv OPENWINHOME /usr/openwin
# setenv PATH $OPENWINHOME/bin:$PATH
# setenv LD_LIBRARY_PATH $OPENWINHOME/lib
# setenv MANPATH $OPENWINHOME/share/man:/usr/man
# setenv HELPPATH $OPENWINHOME/lib/help

我们将显示导出到运行在主机 X 服务器窗口内的第二个 X 服务器

$ Xephyr :1 -ac -screen 1152x900 &

在访客上启动窗口管理器

# olwm &

您现在应该在 Xephyr 窗口中看到 OpenWindows 桌面。右键单击鼠标以显示应用程序菜单。不幸的是,帮助查看器拒绝使用以下命令启动:

XView error: NULL pointer passed to xv_set
华夏公益教科书