跳轉到內容

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
華夏公益教科書