Thiết bị đầu cuối văn bản trên Linux

14.1 Getty (được sử dụng trong / etc / inittab)

Giới thiệu về Getty

Để có một quá trình đăng nhập chạy trên một cổng nối tiếp (và thiết bị đầu cuối được kết nối với nó) khi máy tính khởi động (hoặc chuyển các mức chạy) một lệnh getty phải được đưa vào tệp / etc / inittab. Chạy getty từ dòng lệnh có thể gây ra vấn đề (xem Nếu getty chạy từ dòng lệnh: Các chương trình bị dừng lại để xem tại sao). Getty nhận được một TTY (một thiết bị đầu cuối). Mỗi thiết bị đầu cuối cần lệnh getty riêng của nó. Ngoài ra còn có ít nhất một lệnh getty cho giao diện điều khiển trong mỗi tệp / etc / inittab. Tìm điều này và đặt các lệnh getty cho các thiết bị đầu cuối thực bên cạnh nó. Tệp này có thể chứa các dòng getty mẫu cho các thiết bị đầu cuối văn bản được nhận xét để tất cả những gì bạn cần làm là bỏ ghi chú chúng (loại bỏ # hàng đầu) và thay đổi một vài đối số.

Các đối số được cho phép phụ thuộc vào getty bạn sử dụng:
Hai gettys tốt nhất cho các thiết bị đầu cuối kết nối trực tiếp là:

Hai gettys tốt nhất cho dial-in modem (tránh cho các thiết bị đầu cuối kết nối trực tiếp) là:

Gettys đơn giản để sử dụng nếu bạn không sử dụng một thiết bị đầu cuối văn bản thực. Hầu hết người dùng Linux đều sử dụng một trong số này ở màn hình của họ:

Bản phân phối Linux của bạn có thể đi kèm với ps_getty hoặc agetty cho text-terminal. Một số bản phân phối không cung cấp. Thật không may, họ thường chỉ gọi nó là "getty", do đó bạn có thể cần phải xác định cái nào bạn có kể từ khi các đối số bạn đặt sau khi nó trong / etc / inittab khác nhau. Debian sử dụng agetty (trong gói util-linux). RedHat và Fedora đã sử dụng ps_getty tại: ps_getty

Như một phương sách cuối cùng để cố gắng xác định xem bạn có getty nào, bạn có thể kiểm tra mã thực thi của nó (thường là trong / sbin). ps_getty có / etc / gettydefs được nhúng trong mã này. Để tìm kiếm, hãy vào / sbin và gõ:
chuỗi getty | grep getty
Nếu getty là thực sự agetty ở trên sẽ dẫn đến không có gì. Tuy nhiên, nếu bạn có cách gõ chữ:
getty -h
nên hiển thị các tùy chọn [-hiLmw].

Nếu bạn không có getty, bạn muốn kiểm tra các bản phân phối khác và chương trình người ngoài hành tinh để chuyển đổi giữa các gói RPM và Debian. Mã nguồn có thể được tải xuống từ Phần mềm Getty.

Nếu bạn không sử dụng các đường điều khiển modem (ví dụ: nếu bạn chỉ sử dụng số lượng tối thiểu 3 dây dẫn: truyền, nhận và mặt đất tín hiệu chung), bạn nên cho phép điều này bằng cách sử dụng cờ "cục bộ". Định dạng này phụ thuộc vào bạn sử dụng getty nào.

Getty thoát sau khi đăng nhập (và có thể respawn)

Sau khi bạn đăng nhập, bạn sẽ nhận thấy (bằng cách sử dụng "top", "ps -ax", hoặc "ptree") rằng quá trình getty không còn chạy nữa. Chuyện gì đã xảy ra với nó? Tại sao getty lại khởi động lại nếu shell của bạn bị giết? Đây là lý do tại sao.

Sau khi bạn nhập tên người dùng, getty sẽ lấy nó và gọi chương trình đăng nhập cho biết tên người dùng của bạn. Quá trình getty được thay thế bằng quá trình đăng nhập. Quá trình đăng nhập yêu cầu mật khẩu của bạn, kiểm tra và bắt đầu bất kỳ quy trình nào được chỉ định trong tệp mật khẩu của bạn. Quá trình này thường là bash shell. Nếu vậy, bash sẽ bắt đầu và thay thế quá trình đăng nhập. Lưu ý rằng một quá trình thay thế một tiến trình khác và quá trình bash shell ban đầu được bắt đầu như là quá trình getty. Các tác động của điều này sẽ được giải thích dưới đây.

Bây giờ trong tập tin / etc / inittab, getty có nghĩa vụ phải respawn (khởi động lại) nếu bị giết. Nó nói như vậy trên dòng gọi getty. Nhưng nếu bash shell (hoặc quá trình đăng nhập) bị giết, hãy bắt đầu lại (khởi động lại). Tại sao? Vâng, cả hai quá trình đăng nhập và bash là thay thế cho getty và kế thừa

* Chỉ mục Cách lập Chỉ mục Văn bản

các kết nối tín hiệu được thiết lập bởi người tiền nhiệm của họ. Trong thực tế, nếu bạn quan sát các chi tiết, bạn sẽ nhận thấy rằng quá trình thay thế sẽ có cùng một ID tiến trình như quy trình gốc. Như vậy bash là loại getty trong ngụy trang với cùng một số ID quá trình. Nếu bash bị giết thì cũng giống như getty đã bị giết (mặc dù getty không chạy nữa). Điều này dẫn đến getty respawning.

Khi một bản ghi ra, tất cả các quá trình trên cổng nối tiếp đó sẽ bị giết bao gồm cả bash shell. Điều này cũng có thể xảy ra (nếu được bật) nếu tín hiệu gác máy được gửi tới cổng nối tiếp bằng cách giảm điện áp DCD bằng modem. Việc đăng xuất hoặc thả trong DCD sẽ dẫn đến phản hồi rất tốt. Người ta có thể buộc getty để respawn bằng cách giết bằng tay bash (hoặc đăng nhập) hoặc bằng cách nhấn phím k, vv trong khi trong "top" hoặc với lệnh "kill". Bạn có thể sẽ cần phải giết nó với tín hiệu 9 (mà không thể bỏ qua).

Nếu getty chạy từ dòng lệnh: Các chương trình bị dừng lại

Bạn thường nên chạy getty từ bên trong / etc / inittab và không phải từ dòng lệnh hoặc một số chương trình đang chạy trên thiết bị đầu cuối có thể bị treo bất ngờ (dừng). Đây là lý do tại sao (bỏ qua phần tiếp theo nếu tại sao không quan trọng đối với bạn). Nếu bạn bắt đầu getty để nói ttyS1 từ dòng lệnh của thiết bị đầu cuối khác, nói tty1, sau đó nó sẽ có tty1 là "thiết bị đầu cuối điều khiển" của nó mặc dù thiết bị đầu cuối thực tế nó chạy trên là ttyS1. Do đó nó có thiết bị đầu cuối điều khiển sai. Nhưng nếu nó bắt đầu bên trong tập tin inittab thì nó sẽ có ttyS1 làm thiết bị đầu cuối điều khiển (chính xác).

Mặc dù các thiết bị đầu cuối kiểm soát là sai, đăng nhập tại ttyS1 hoạt động tốt (kể từ khi bạn đã ttyS1 như là một đối số để getty). Đầu vào và đầu ra tiêu chuẩn được đặt thành ttyS1 mặc dù thiết bị đầu cuối điều khiển vẫn là tty11. Các chương trình khác chạy tại ttyS1 có thể kế thừa đầu vào / đầu ra tiêu chuẩn này (được kết nối với ttyS1) và mọi thứ đều OK. Nhưng một số chương trình có thể làm cho sai lầm của cố gắng để đọc từ thiết bị đầu cuối kiểm soát của họ (tty1) đó là sai. Bây giờ tty1 có thể nghĩ rằng các chương trình này đang được chạy trong nền bởi tty1 vì vậy một nỗ lực để đọc từ tty1 (nó phải có được ttyS1) kết quả trong ngăn chặn quá trình cố gắng để đọc. (Một quá trình nền không được phép đọc từ thiết bị đầu cuối điều khiển của nó.). Bạn có thể thấy một thông báo như sau: " [1] + Ngừng " trên màn hình. Tại thời điểm này bạn đang bị mắc kẹt vì bạn không thể tương tác với một quá trình đang cố gắng giao tiếp với bạn thông qua thiết bị đầu cuối sai. Tất nhiên để thoát khỏi điều này, bạn có thể đi đến một thiết bị đầu cuối khác và giết chết quá trình, v.v.

agetty (có thể được đặt tên là getty)

Một dòng ví dụ trong / etc / inittab:

S1: 23: respawn: / sbin / getty -L 19200 ttyS1 vt102

S1 là từ ttyS1. 23 có nghĩa là getty được chạy khi nhập vào các mức chạy 2 hoặc 3. respawn có nghĩa là nếu getty (hoặc một quá trình thay thế nó như bash) bị giết, getty sẽ tự động khởi động lại (respawn) một lần nữa. / sbin / getty là lệnh getty. Các -L có nghĩa là địa phương (bỏ qua tín hiệu điều khiển modem). -h (không được hiển thị trong ví dụ) cho phép điều khiển luồng phần cứng (giống như crtscts stty). 19200 là tốc độ truyền. ttyS1 có nghĩa là / dev / ttyS1 (COM2 trong MS-DOS). vt102 là loại thiết bị đầu cuối và getty này sẽ đặt biến môi trường TERM thành giá trị này. Không có tệp cấu hình nào. Nhập "init q" trên dòng lệnh sau khi chỉnh sửa getty và bạn sẽ thấy dấu nhắc đăng nhập.

Tự động phát hiện các vấn đề chẵn lẻ của Agetty

Chương trình agetty sẽ cố gắng tự động phát hiện thiết lập chẵn lẻ bên trong thiết bị đầu cuối (không bao gồm chẵn lẻ). Nó không hỗ trợ byte dữ liệu 8 bit cộng với độ chẵn lẻ 1 bit. Xem byte dữ liệu 8 bit (cộng với tính chẵn lẻ). Nếu bạn sử dụng stty để thiết lập chẵn lẻ, agetty sẽ tự động bỏ đặt nó vì nó ban đầu muốn bit chẵn lẻ đi qua như thể nó là một bit dữ liệu. Điều này là bởi vì nó cần để có được bit cuối cùng (có thể là một bit chẵn lẻ) khi bạn gõ tên đăng nhập của bạn để nó có thể tự động phát hiện chẵn lẻ. Vì vậy, nếu bạn sử dụng tính chẵn lẻ, hãy kích hoạt nó chỉ bên trong thiết bị đầu cuối văn bản và để tự động phát hiện nó và đặt nó ở máy tính. Nếu thiết bị đầu cuối của bạn hỗ trợ tính chẵn lẻ đã nhận, dấu nhắc đăng nhập sẽ bị cắt xén cho đến khi bạn nhập thứ gì đó để getty có thể phát hiện

tính chẵn lẻ. Các dấu nhắc bị cắt xén sẽ ngăn chặn khách truy cập, vv từ cố gắng đăng nhập. Đó có thể chỉ là những gì bạn muốn.

Đôi khi có vấn đề với tự động phát hiện chẵn lẻ. Điều này xảy ra bởi vì sau khi bạn nhập tên đăng nhập lần đầu tiên, agetty bắt đầu chương trình đăng nhập để hoàn tất việc đăng nhập. Thật không may, chương trình đăng nhập không thể phát hiện tính chẵn lẻ, nếu chương trình getty không xác định được tính chẵn lẻ thì đăng nhập sẽ không thể xác định được nó. Nếu lần đăng nhập đầu tiên không thành công, thông tin đăng nhập sẽ cho phép bạn thử lại, v.v. (tất cả đều bị sai số chẵn lẻ). Cuối cùng, sau một số lần thử đăng nhập thất bại (hoặc sau khi hết thời gian chờ), lệnh khởi động sẽ bắt đầu lại và bắt đầu lại chuỗi đăng nhập. Khi getty đang chạy lại, nó có thể phát hiện sự chẵn lẻ trong lần thử thứ hai để mọi thứ có thể hoạt động OK.

Với tính chẵn lẻ sai, chương trình đăng nhập không thể đọc chính xác nội dung bạn nhập và bạn không thể đăng nhập. Nếu thiết bị đầu cuối của bạn hỗ trợ tính chẵn lẻ, bạn sẽ tiếp tục thấy màn hình bị cắt xén. Nếu getty không phát hiện được tính chẵn lẻ, một tập tin / etc / issue thường được đổ vào màn hình ngay trước dấu nhắc, vì vậy nhiều từ bị cắt xén hơn có thể xuất hiện trên màn hình.

Tại sao không thể phát hiện sự chẵn lẻ bằng chữ cái đầu tiên được gõ? Đây là một ví dụ: Giả sử nó phát hiện một byte 8 bit với bit chẵn lẻ 0 (bit thứ tự cao) và với số lẻ là 1 bit. Chẵn lẻ là gì? Vâng, số lẻ của 1 bit ngụ ý rằng nó chẵn lẻ lẻ. Nhưng nó cũng có thể chỉ là một nhân vật 8 bit không có tính chẵn lẻ. Không có cách nào cho đến nay để xác định đó. Nhưng cho đến nay chúng tôi đã loại bỏ khả năng chẵn lẻ. Việc phát hiện chẵn lẻ do đó tiến hành bằng một quá trình loại bỏ.

Nếu byte tiếp theo được nhập tương tự như byte đầu tiên và cũng chỉ loại bỏ khả năng chẵn lẻ, thì vẫn không thể xác định tính chẵn lẻ. Tình trạng này có thể tiếp tục vô thời hạn và trong một số ít trường hợp, việc đăng nhập sẽ không thành công cho đến khi bạn thay đổi tên đăng nhập của mình. Nếu tìm thấy một bit chẵn lẻ của 1, nó sẽ giả định rằng đây là một bit chẵn lẻ và không phải là một bit thứ tự cao của một ký tự 8 bit. Do đó, giả định rằng bạn không sử dụng các ký tự meta (bộ bit cao) trong tên người dùng của bạn (nghĩa là tên của bạn nằm trong ASCII).

Người ta có thể nhận được vào một "vòng đăng nhập" theo nhiều cách khác nhau. Giả sử bạn chỉ nhập một hoặc hai chữ cái cho tên đăng nhập của bạn và sau đó nhấn trở lại. Nếu những chữ cái này không đủ để phát hiện chẵn lẻ, thì đăng nhập sẽ chạy trước khi tính chẵn lẻ được phát hiện. Đôi khi vấn đề này xảy ra nếu bạn không có thiết bị đầu cuối và / hoặc kết nối khi khởi động đầu tiên.

Nếu bạn gặp khó khăn trong "vòng đăng nhập" này, một cách thoát khỏi nó là nhấn phím trả về nhiều lần cho đến khi bạn nhận được dấu nhắc đăng nhập getty. Một cách khác là chờ một phút hoặc lâu hơn để hết thời gian chờ. Sau đó, dấu nhắc đăng nhập getty sẽ được đặt trên màn hình bởi chương trình getty và bạn có thể thử lại để đăng nhập.

8 byte dữ liệu bit (cộng chẵn lẻ)

Thật không may, agetty không thể phát hiện sự chẵn lẻ này. Vào cuối năm 1999, nó không có tùy chọn cho việc vô hiệu hóa tự động phát hiện chẵn lẻ và do đó sẽ phát hiện chẵn lẻ không chính xác. Kết quả là quá trình đăng nhập sẽ bị cắt xén và tính chẵn lẻ sẽ được đặt sai. Do đó, dường như không khả thi khi cố gắng sử dụng các byte dữ liệu 8 bit với tính chẵn lẻ.

getty (một phần của getty_ps)

(Hầu hết điều này là từ Serial-HOWTO cũ của Greg Hankins)
Đối với một trong những getty này cần phải đặt cả hai mục trong một tập tin cấu hình và thêm một mục trong / etc / inittab . Dưới đây là một số mục ví dụ để sử dụng cho thiết bị đầu cuối của bạn mà bạn đưa vào tệp cấu hình / etc / gettydefs .

# 38400 bps Dumb Terminal entry DT38400 # B38400 CS8 CLOCAL # B38400 SANE -ISTRIP CLOCAL # @ S @L đăng nhập: # DT38400 # 19200 bps Thiết bị đầu cuối Dumb nhập DT19200 # B19200 CS8 CLOCAL # B19200 SANE -ISTRIP CLOCAL # @ S @L đăng nhập: # DT19200 # 9600 bps Đầu Dumb Đầu vào DT9600 # B9600 CS8 CLOCAL # B9600 SANE -ISTRIP CLOCAL # @ S @L đăng nhập: # DT9600

Lưu ý rằng DT38400, DT19200, vv chỉ là nhãn và phải giống với nhãn bạn sử dụng trong / etc / inittab .

Nếu bạn muốn, bạn có thể thực hiện những điều thú vị in trong biểu ngữ đăng nhập. Trong ví dụ của tôi, tôi có tên hệ thống và dòng nối tiếp được in. Bạn có thể thêm những thứ khác: [blockquote

bóng râm = có] @B Hiện tại (được đánh giá tại thời điểm @B được nhìn thấy) tỷ lệ bps. @D Ngày hiện tại, tính bằng MM / DD / YY. @L Dòng nối tiếp mà getty được đính kèm. @S Tên hệ thống. @T Thời gian hiện tại, trong HH: MM: SS (24 giờ). @U Số lượng người dùng hiện đã đăng nhập. Đây là số lượng các mục nhập trong tệp / etc / utmp có trường ut_name không null. @V Giá trị của VERSION, như được đưa ra trong tệp mặc định. Để hiển thị ký tự '@' đơn lẻ, hãy sử dụng '\ @' hoặc '@@'.

Khi bạn đã chỉnh sửa xong / etc / gettydefs , bạn có thể xác minh rằng cú pháp là chính xác bằng cách thực hiện:

linux # getty -c / etc / gettydefs

Đảm bảo rằng không có tệp cấu hình nhỏ hoặc uugetty nào khác cho cổng nối tiếp mà thiết bị đầu cuối của bạn được đính kèm như ( /etc/default/{uu}getty.ttyS N hoặc /etc/conf.{uu}getty.ttyS N ) , vì điều này có thể sẽ ảnh hưởng đến việc chạy getty trên thiết bị đầu cuối. Xóa các tệp xung đột đó nếu chúng thoát.

Chỉnh sửa tệp / etc / inittab của bạn để chạy getty trên cổng nối tiếp (thay thế thông tin chính xác cho môi trường của bạn - cổng, tốc độ và loại thiết bị đầu cuối mặc định):

S1: 23: respawn: / sbin / getty ttyS1 DT9600 vt100 trong đó linux # init q

Tại thời điểm này, bạn sẽ thấy một dấu nhắc đăng nhập trên thiết bị đầu cuối của bạn. Bạn có thể phải nhấn trở lại để có được sự chú ý của thiết bị đầu cuối.

mgetty

Chữ "m" là viết tắt của modem. Chương trình này chủ yếu dành cho modem và vào giữa năm 2000, nó sẽ yêu cầu biên dịch lại để sử dụng cho thiết bị đầu cuối văn bản (trừ khi bạn sử dụng điều khiển lưu lượng phần cứng - và thường yêu cầu cáp làm bằng tay). Đối với tài liệu cho các thiết bị đầu cuối được kết nối trực tiếp, hãy xem phần "Trực tiếp" của hướng dẫn sử dụng: mgetty.texi.

Xem các dòng cuối cùng của /etc/mgetty/mgetty.config để biết ví dụ về cấu hình nó cho một thiết bị đầu cuối. Trừ khi bạn nói "toggle-dtr no" nó sẽ nghĩ rằng bạn có một modem và thả (phủ nhận) pin DTR tại PC trong một nỗ lực vô ích để thiết lập lại modem không tồn tại. Ngược lại với các gettys khác, mgetty sẽ không đính kèm chính nó vào một thiết bị đầu cuối cho đến khi ai đó nhấn bất kỳ phím nào của thiết bị đầu cuối đó để bạn sẽ thấy? cho thiết bị đầu cuối ở đầu hoặc ps cho đến khi điều này xảy ra. Các bản ghi trong / var / log / mgetty / có thể hiển thị một vài thông báo cảnh báo chỉ áp dụng cho các modem mà bạn có thể bỏ qua.

Dưới đây là ví dụ về dòng đơn giản mà bạn đưa vào / etc / inittab:

s1: 23: respawn: / sbin / mgetty -r ttyS1