Điểm:0

Ubuntu rõ ràng không sử dụng printf cho đầu ra khi khởi động? Nó có thể?

lá cờ ng

Câu hỏi này xảy ra với tôi khi tôi đang cố gắng để hệ điều hành Ubuntu khách hiển thị thông báo khởi động trong QEMU VM (như [ 2.34567890123] ... và [ OK ] ....). Ở đây tôi có một máy ảo QEMU, cả máy chủ và máy khách đều là Ubuntu 20.04. Để hiển thị thông báo khởi động của khách trong bảng điều khiển của Máy chủ (tức là dòng lệnh khởi động qemu), tôi đặt một số dòng của khách /etc/default/grub tập tin như sau:

GRUB_TIMEOUT_STYLE=thực đơn
GRUB_TIMEOUT=5
GRUB_TERMINAL_OUTPUT=bàn điều khiển
GRUB_CMDLINE_LINUX_DEFAULT=nomodeset

Sau đó, tôi bắt đầu khách bằng lệnh sau:

qemu-system-x86_64 -hda ubuntu.qcow -m 2000 -nographic -serial none

GRUB xuất TUI của nó bằng chế độ văn bản nối tiếp hoặc VGA. -nographic vô hiệu hóa đầu ra VGA và -serial không có vô hiệu hóa bảng điều khiển nối tiếp, vì vậy tôi không thể thấy bất kỳ GRUB TUI nào. Chỉ màn hình QEMU hiển thị trong bảng điều khiển. Theo tài liệu của -nographic (đây), "QEMU là một ứng dụng dòng lệnh đơn giản" trong trường hợp này. Giống như chương trình C/C++ bình thường, màn hình QEMU sử dụng bản inf (hoặc chức năng khác, nhưng vui lòng cho phép tôi sử dụng tên này như một phương tiện) để hiển thị các phiên bản, lời nhắc và các thông báo khác của nó. Sau 5 giây, hệ điều hành khách Ubuntu đang khởi động.Tuy nhiên, tôi không thể thấy bất kỳ thông báo khởi động nào được in trong bảng điều khiển. Các thử nghiệm trước đây của tôi cho thấy Ubuntu không sử dụng bảng điều khiển nối tiếp, Thay vào đó, nó sử dụng chế độ văn bản VGA cho đầu ra. Vì lý do này, tôi đoán, nếu Ubuntu có thể sử dụng bản inf chức năng xuất thông báo khởi động của nó, QEMU sẽ có thể hiển thị chúng trong bảng điều khiển (được kết hợp với màn hình QEMU), giống như cách xử lý đầu ra của màn hình QEMU. Dựa trên quan sát rằng bảng điều khiển chỉ có đầu ra của màn hình QEMU, câu hỏi của tôi là:

Ubuntu không sử dụng bản inf cho đầu ra khi khởi động, rõ ràng hoặc theo mặc định, có lẽ do xem xét hiệu suất? Nếu đó là hành vi mặc định, tôi có thể sử dụng tùy chọn khởi động nào để buộc Ubuntu sử dụng bản inf để xuất thông báo khởi động của nó (hoặc bất kỳ phương thức xuất nào mà QEMU moniter sử dụng), trái ngược với chế độ văn bản VGA? Như một lưu ý phụ, tôi đã googled nhưng không tìm thấy bất kỳ tài liệu trực tuyến nào về các tùy chọn khởi động Ubuntu như bộ định danh, vì vậy tôi không biết liệu có bất kỳ tùy chọn khởi động Ubuntu nào có thể chỉ định điều này hay không. Hãy chia sẻ liên kết của nó với tôi nếu bạn biết nó. Có rất nhiều công việc nên tôi không thể nói chắc chắn rằng tôi đã đề cập mọi thứ ở trên. Nếu tôi bỏ lỡ đề cập đến một cái gì đó trong câu hỏi, xin vui lòng cho tôi biết và tôi sẽ chỉnh sửa. Cảm ơn.

Sadaharu Wakisaka avatar
lá cờ pl
Chào mừng bạn đến với AskUbuntu, `echo` là lệnh thông thường để in nội dung nào đó trên màn hình, `printf` ban đầu là lệnh dành cho máy in và cần được bao gồm chức năng bởi trình bao. Tôi nghĩ `bash` có nó còn `sh` Bourne Shell thì không.
muru avatar
lá cờ us
Một số thông báo mà bạn nói đến thực sự sẽ được in bởi nhân và thông thường người ta sử dụng [`printk`](https://en.wikipedia.org/wiki/Printk) trong nhân. GRUB thậm chí còn xuất hiện trước kernel, ai biết nó dùng gì để hiển thị văn bản? Xét cho cùng, các chương trình sử dụng "`printf`" thường dựa vào một thứ khác để thực hiện kết xuất thực tế của đầu ra và trong trường hợp GRUB và kernel, không có thứ gì khác.
muru avatar
lá cờ us
Tôi nghĩ thay vì [vấn đề XY] khá phức tạp này(https://meta.stackexchange.com/q/66377/270345), bạn chỉ nên hỏi làm thế nào để đạt được những gì bạn muốn, có vẻ như là: "Tôi làm như thế nào QEMU hiển thị đầu ra bảng điều khiển của máy ảo khách trong thiết bị đầu cuối?"
lá cờ in
Không có cái gọi là `printf` mà kernel chỉ có thể gọi. Hạt nhân là thứ chịu trách nhiệm chuyển hướng các bản in đó đến nơi chúng cần đến, có thể là VGA, nối tiếp hoặc một nơi nào khác. Vì vậy, không có cách nào, một `printf` trong khách của bạn có thể xuất hiện một cách kỳ diệu trên máy chủ, trừ khi khách của bạn gửi những tin nhắn đó đến một nơi nào đó mà máy chủ của bạn nhìn thấy chúng.
Điểm:0
lá cờ ng

Sau hai ngày điều tra, tôi nghĩ rằng cuối cùng tôi cũng tìm ra chìa khóa của câu hỏi.

bản inf gửi đầu ra ở cả chế độ văn bản VGA (sao chép vào bộ nhớ đệm cho chế độ văn bản) và cổng nối tiếp. Một bằng chứng là xv6 được sử dụng trong nhiều khóa học OS. Các qemu-nox mục tiêu trong xv6's Makefile chỉ định -nographic. Nếu chúng ta thêm -serial không có, xv6 sẽ chỉ hiển thị màn hình QEMU (qemu).

Cả GRUB và ubuntu shell (ý tôi là shell khởi động xong) đều sử dụng bản inf chức năng. Tuy nhiên, sự khác biệt là: GRUB sử dụng nối tiếp nhưng ubuntu tắt nối tiếp theo mặc định. Chính vì vậy dưới -nographic, GRUB có thể hiển thị nhưng ubuntu shell thì không. Điều này cũng giải thích tại sao -lời nguyền có thể hiển thị cả hai.

Màn hình QEMU sử dụng bình thường bản inf quá. Tuy nhiên, Nó chạy trong máy chủ đã bật nối tiếp, vì vậy nó có thể xuất trong bảng điều khiển của máy chủ. Máy khách Ubuntu vô hiệu hóa nối tiếp trong hình ảnh iso, vì vậy nó không in ra bất cứ thứ gì bên dưới -nographic.

Giai đoạn khởi động Ubuntu chỉ sử dụng chế độ văn bản VGA. Không có nối tiếp ngay cả khi nó được kích hoạt. Vì vậy, thông báo khởi động (cũng như tắt máy) không thể hiển thị trong -nographic nhưng có thể được hiển thị dưới -lời nguyền. Tôi nghĩ đó là do xem xét hiệu suất vì bộ nhớ ghi trực tiếp (bộ đệm chế độ văn bản) nhanh hơn bản inf ngoài ra còn thực hiện các hoạt động nối tiếp.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.