Linux 序列埠控制檯

要使用序列埠作為控制檯,您需要將支援編譯到核心中 - 預設情況下它沒有被編譯進去。 對於 PC 風格的序列埠,它是選單選項旁邊的配置選項

字元裝置 ‣ 序列埠驅動程式 ‣ 8250/16550 和相容序列埠支援 ‣ 8250/16550 和相容序列埠上的控制檯

您必須將序列埠支援編譯到核心中,而不是作為模組。

可以為控制檯輸出指定多個裝置。您可以定義一個新的核心命令列選項來選擇哪個裝置用於控制檯輸出。

此選項的格式為

console=device,options

device:         tty0 for the foreground virtual console
                ttyX for any other virtual console
                ttySx for a serial port
                lp0 for the first parallel port
                ttyUSB0 for the first USB serial device

options:        depend on the driver. For the serial port this
                defines the baudrate/parity/bits/flow control of
                the port, in the format BBBBPNF, where BBBB is the
                speed, P is parity (n/o/e), N is number of bits,
                and F is flow control ('r' for RTS). Default is
                9600n8. The maximum baudrate is 115200.

您可以在核心命令列上指定多個 console= 選項。

當每個裝置型別僅提及一次時,行為定義明確。 在這種情況下,輸出將出現在所有請求的控制檯上。 並且當您開啟 /dev/console 時,將使用最後一個裝置。 因此,例如

console=ttyS1,9600 console=tty0

定義開啟 /dev/console 將獲得當前前臺虛擬控制檯,並且核心訊息將出現在 VGA 控制檯和 9600 波特的第二個序列埠(ttyS1 或 COM2)上。

當定義了多次相同裝置型別時,行為更加複雜。 在這種情況下,有以下兩個規則

  1. 輸出將僅出現在每個已定義型別的第一個裝置上。

  2. /dev/console 將與第一個註冊的裝置相關聯。 註冊順序取決於核心如何初始化各種子系統。

    由於拼寫錯誤或硬體不可用等原因,即使最後一個 console= 引數未用於其他原因,也使用此規則。

結果可能會令人驚訝。 例如,以下兩個命令列具有相同的結果

console=ttyS1,9600 console=tty0 console=tty1
console=tty0 console=ttyS1,9600 console=tty1

核心訊息僅在 tty0ttyS1 上列印。 並且 /dev/consoletty0 相關聯。 這是因為核心嘗試在序列埠之前註冊圖形控制檯。 這是因為在未指定任何控制檯裝置時的預設行為,請參見下文。

請注意,最後一個 console=tty1 引數仍然有所不同。 systemd 也使用核心命令列。 它會將最後一個定義的 tty1 用作登入控制檯。

如果未指定任何控制檯裝置,則將使用找到的第一個能夠充當系統控制檯的裝置。 此時,系統首先查詢 VGA 卡,然後查詢序列埠。 因此,如果您的系統中沒有 VGA 卡,則第一個序列埠將自動成為控制檯,除非核心配置了 CONFIG_NULL_TTY_DEFAULT_CONSOLE 選項,否則它將預設使用 ttynull 裝置。

您需要建立一個新裝置才能使用 /dev/console。 官方的 /dev/console 現在是字元裝置 5,1。

(您還可以使用網路裝置作為控制檯。有關該資訊,請參見 Documentation/networking/netconsole.rst。)

這是一個將使用 /dev/ttyS1 (COM2) 作為控制檯的示例。 根據需要替換示例值。

  1. 建立 /dev/console(真實控制檯)和 /dev/tty0(主虛擬控制檯)

    cd /dev
    rm -f console tty0
    mknod -m 622 console c 5 1
    mknod -m 622 tty0 c 4 0
    
  2. LILO 也可以從序列埠獲取輸入。 這是一個非常有用的選項。 要告訴 LILO 使用序列埠:在 lilo.conf 中(全域性部分)

    serial  = 1,9600n8 (ttyS1, 9600 bd, no parity, 8 bits)
    
  3. 調整新核心的核心標誌,再次在 lilo.conf 中(核心部分)

    append = "console=ttyS1,9600"
    
  4. 確保 getty 在序列埠上執行,以便在系統啟動完成後可以登入到它。 這是透過在 /etc/inittab 中新增類似這樣的行來完成的(確切語法取決於您的 getty)

    S1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
    
  5. Init 和 /etc/ioctl.save

    Sysvinit 將其 stty 設定儲存在 /etc 中的一個檔案中,稱為 /etc/ioctl.save。 首次使用序列埠控制檯之前,請刪除此檔案,因為否則 init 可能會將波特率設定為 38400(虛擬控制檯的波特率)。

  6. /dev/console 和想要使用虛擬控制檯的 X 程式通常會開啟 /dev/console。 如果您建立了新的 /dev/console 裝置,並且您的控制檯不是虛擬控制檯,則某些程式將失敗。 這些是想要訪問 VT 介面並使用 /dev/console 而不是 /dev/tty0 的程式。 其中一些程式是

    Xfree86, svgalib, gpm, SVGATextMode
    

    儘管如此,它應該在這些程式的現代版本中修復。

    請注意,如果您在沒有 console= 選項(或使用 console=/dev/tty0)的情況下啟動,則 /dev/console/dev/tty0 相同。 在這種情況下,一切仍將正常工作。

  7. 謝謝

    感謝 Geert Uytterhoeven <geert@linux-m68k.org> 將補丁從 2.1.4x 移植到 2.1.6x,並負責將這些補丁整合到 m68k、ppc 和 alpha 中。

Miquel van Smoorenburg <miquels@cistron.nl>, 11-Jun-2000