![Cách để các tập lệnh Linux phát hiện chúng đang chạy trong máy ảo Cách để các tập lệnh Linux phát hiện chúng đang chạy trong máy ảo](https://www.howtogeek.com/wp-content/uploads/2022/05/shutterstock_1164968740.png?width=1198&trim=1,1&bg-color=000&pad=1,1)
Máy ảo thực sự cố gắng thuyết phục hệ điều hành của chúng rằng chúng đang chạy trên phần cứng vật lý. Vì vậy, bạn có thể biết từ dòng lệnh Linux nếu máy tính là vật lý hay ảo?
Máy ảo và người giám sát
Một máy tính truyền thống là một đối tượng vật lý. Đó là một tập hợp các phần cứng khác nhau được cắm và bắt vít với nhau để bạn có thể tải hệ điều hành, cài đặt ứng dụng, khởi chạy chúng và sử dụng chúng.
Phần cứng đắt tiền. Bị giới hạn ở một hệ điều hành cho mỗi máy tính vật lý có nghĩa là chi phí chạy một số hệ điều hành sẽ sớm trở nên cao ngất ngưởng. Một giải pháp tốt hơn sẽ là cho phép một máy tính vật lý duy nhất chạy một số hệ điều hành cùng một lúc, với mỗi người nghĩ rằng nó đang chạy trong phần cứng độc nhất của riêng nó.
Một hypervisor làm cho điều này trở nên khả thi. Hypervisor — còn được gọi là trình quản lý máy ảo hoặc giám sát máy ảo — là phần mềm cho phép bạn tạo các máy ảo. Chúng hoạt động như thể chúng là các máy tính vật lý, riêng lẻ mặc dù chúng chạy trên cùng một máy chủ vật lý, chia sẻ không gian ổ cứng, bộ nhớ và lõi CPU của nó.
Tất nhiên, máy tính chủ phải đủ mạnh để đáp ứng nhu cầu của bộ sưu tập máy ảo, nhưng, được cung cấp đủ RAM và sức mạnh xử lý trong máy chủ, các máy ảo có thể chạy ở tốc độ gần như kim loại.
Kể từ khi phát hành hạt nhân 2.6.20 vào năm 2007, Linux đã có Kdựa trên sai lầm Vkhông bình thường Mhỗ trợ achine được tích hợp ngay. Linux có sẵn một số trình giám sát, chẳng hạn như VirtualBox, GNOME Boxes và QEMU-KVM. Họ sử dụng khả năng KVM bản địa của Linux, xây dựng dựa trên chức năng hạt nhân gốc bằng cách thêm các giao diện người dùng và chức năng chẳng hạn như có thể chụp nhanh một máy ảo.
Máy ảo tiết kiệm chi phí, hiệu quả, đơn giản hóa triển khai và — được cung cấp một cách chính xác — lợi ích bảo mật. Chúng cũng tạo điều kiện cho khả năng mở rộng. Các máy chủ mới có thể được tự động chạy khi nhu cầu về dịch vụ tăng lên và ngừng hoạt động khi nhu cầu giảm xuống. Điều này làm cho chúng cực kỳ phổ biến cả trên đám mây và cơ sở hạ tầng tại chỗ.
Có lẽ bạn đang quản trị từ xa một máy chủ Linux và bạn cần biết đó là máy ảo hay hộp vật lý. Hoặc bạn có một tập lệnh cần biết loại nền tảng mà nó đang thực thi. Dưới đây là một số cách bạn có thể phát hiện xem máy tính bạn đang làm việc là thực hay ảo.
Lệnh dmidecode
Các dmidecode
lệnh hỗ trợ một số lượng lớn các tùy chọn và bổ ngữ. Nó thẩm vấn các bảng Giao diện Quản lý Máy tính để bàn (DMI) và in thông tin trong cửa sổ đầu cuối.
Chúng tôi sẽ sử dụng nó với -s
(hiển thị một chuỗi đơn) và hỏi tên sản phẩm hệ thống. Lưu ý rằng chúng ta phải sử dụng sudo
.
Chúng tôi sẽ chạy lệnh trên máy ảo VirtualBox chạy Ubuntu 22.04.
sudo dmidecode -s system-product-name
Nền tảng được xác định chính xác là VirtualBox.
Trên máy ảo QEMU-KVM chạy Fedora 35, chúng tôi nhận được kết quả đầu ra này.
sudo dmidecode -s system-product-name
Mặc dù đây được báo cáo là một PC tiêu chuẩn, nhưng nó là một PC ảo QEMU tiêu chuẩn, thuộc loại Q35. Vì vậy, nền tảng được công nhận một cách chính xác là một máy ảo.
Nếu chúng tôi chạy cùng một lệnh trên máy tính vật lý, chúng tôi sẽ nhận được một số thông tin về nhà sản xuất.
sudo dmidecode -s system-product-name
Máy tính này là bản dựng tùy chỉnh dựa trên bo mạch chủ của Công ty TNHH Quốc tế Micro-Star, với mã sản phẩm là MS-7B86.
Lệnh lshw
Các lshw
lệnh liệt kê các chi tiết cho nhiều loại phần cứng máy tính. Chúng tôi có thể chọn loại phần cứng mà chúng tôi muốn lshw
để báo cáo về.
Chúng tôi sẽ sử dụng -class
tùy chọn với system
bổ nghĩa. Sử dụng sudo
với lệnh này đảm bảo chúng ta nhìn thấy tất cả các chi tiết.
Chúng tôi sẽ chạy lệnh này trên máy ảo Ubuntu VirtualBox của chúng tôi.
sudo lshw -class system
- Trường “mô tả” có mục nhập chung là “máy tính”.
- Trường “sản phẩm” cho chúng ta biết đây là một máy ảo đang chạy trong VirtualBox.
- Trường “nhà cung cấp” chứa tên của công ty Đức đã tạo ra VirtualBox, Innotek GmbH. Innotek được Tập đoàn Oracle mua lại vào năm 2010 như một phần của thương vụ mua lại Sun Microsystems, Inc.
Chúng tôi đã phải cài đặt lshw
trên Fedora.
sudo dnf install lshw
Hãy thử lệnh đó trong máy ảo Fedora của chúng tôi đang chạy trong Hộp GNOME.
sudo lshw -class system
- Một lần nữa, trường “mô tả” có một mục nhập chung là “máy tính”.
- Trường “sản phẩm” cung cấp cho chúng tôi thông tin QEMU PC tiêu chuẩn giống như thông tin mà chúng tôi đã thấy với
dmidecode
yêu cầu. - Trường “nhà cung cấp” chứa “QEMU” cho biết khá rõ ràng đây là một máy ảo.
Đây là kết quả của việc chạy cùng một lệnh trên máy tính vật lý của chúng tôi.
sudo lshw -class system
Chúng ta có thể thấy rằng đây là một máy tính phần cứng, với bo mạch chủ Micro-Star.
- Phần cứng được xác định là một máy tính để bàn.
- Trường “sản phẩm” cung cấp cho chúng ta loại bo mạch chủ, MS-7B86.
- Trường “nhà cung cấp” chứa tên nhà sản xuất.
Lệnh hostnamectl
Lệnh này có lợi thế mà bạn không cần phải có sudo
đặc quyền để chạy nó. Tuy nhiên, nó chỉ có sẵn trên systemd
-các bản phân phối được kích hoạt. Phần lớn các bản phân phối hiện đại sử dụng systemd
.
Đây là phản hồi từ việc chạy lệnh trên máy ảo Ubuntu VirtualBox của chúng tôi.
hostnamectl
- Trường “icon-name” có thêm “-vm” vào nó.
- Trường “Chassis” chứa “vm.”
- Trường “Ảo hóa” chứa “oracle.”
- Trường “Nhà cung cấp phần cứng” chứa “innotek GmbH”.
- Trường “Mô hình phần cứng” chứa “VirtualBox”.
Đầu ra trên Fedora VM bên trong Hộp GNOME của chúng tôi rất giống nhau.
hostnamectl
- Trường “icon-name” có thêm “-vm” vào nó.
- Trường “Chassis” chứa “vm.”
- Trường “Ảo hóa” chứa “kvm.”
- Trường “Nhà cung cấp phần cứng” chứa “QEMU”
- Trường “Mô hình phần cứng” chứa “PC tiêu chuẩn (Q35 + ICH9, 2009).”
Nếu chúng tôi sử dụng lệnh hostnamectl trên màn hình thực của mình, thì đầu ra không chứa dòng “Ảo hóa”.
hostnamectl
Nếu không có trường “Ảo hóa”, bạn phải chạy trên kim loại trần.
Lệnh systemd-Det-Virt
Nếu bạn muốn nhận được câu trả lời càng ngắn càng tốt, systemd-detect-virt
có lẽ là những gì bạn đang tìm kiếm. Một lần nữa, điều này yêu cầu một systemd
-phân phối yêu cầu, nhưng nó không yêu cầu sudo
các đặc quyền. Điều này – và đầu ra ngắn gọn của nó – làm cho nó rất phù hợp để sử dụng trong các tập lệnh.
Đây là kết quả của việc chạy lệnh trên máy ảo Ubuntu VirtualBox của chúng tôi.
systemd-detect-virt
Bản sao Fedora của chúng tôi đang chạy trong GNOME Boxes được báo cáo là sử dụng ảo hóa KVM.
systemd-detect-virt
Đang chạy systemd-detect-virt
trên máy phần cứng của chúng tôi dẫn đến “không có” được in ra thiết bị đầu cuối.
systemd-detect-virt
Tập lệnh nhạy cảm với nền tảng
Để cung cấp cho tập lệnh khả năng phát hiện xem nó đang chạy trong môi trường ảo hóa hay trên phần cứng vật lý, chúng ta có thể sử dụng systemd-detect-virt
ra lệnh và sử dụng Bash case
các câu lệnh để xử lý các tùy chọn.
Đây là tập lệnh mà chúng tôi sẽ sử dụng. Sao chép văn bản này và lưu vào tệp có tên “platform.sh”.
#!/bin/bash shopt -s nocasematch case $(systemd-detect-virt) in none) echo "Physical Hardware" ;; *) echo "Virtual Machine" ;; esac
Tập lệnh sử dụng shopt
để chọn đối sánh không phân biệt chữ hoa chữ thường. Các systemd-detect-virt
lệnh được sử dụng trong case
bản tường trình. Đầu ra từ lệnh này được so sánh với mỗi case
mệnh đề trong phần thân của case
tuyên bố cho đến khi một kết quả phù hợp được tìm thấy. Bất kỳ thứ gì không phù hợp sẽ được ghi lại bởi mệnh đề mặc định “*)”.
Cách đơn giản nhất là kiểm tra xem phản hồi từ systemd-detect-virt
là “không.” Nếu đúng như vậy, tập lệnh đang chạy trên phần cứng vật lý. Đối với tất cả các trường hợp khác, tập lệnh phải chạy trên máy ảo.
Trước khi có thể chạy tập lệnh, chúng ta phải làm cho nó có thể thực thi được bằng cách sử dụng chmod
.
chmod +x platform.sh
Nó xác định chính xác máy ảo Ubuntu VirtualBox của chúng tôi là một máy ảo.
./platform.sh
Nó cũng phát hiện chính xác máy ảo GNOME Boxes đang chạy Fedora.
./platform.sh
Tập lệnh cũng phát hiện chính xác khi nào nó đang chạy trên một máy vật lý.
./platform.sh
Khác nhau case
mệnh đề có thể đặt các biến đã được kiểm tra ở nơi khác trong tập lệnh để thực hiện các kiểu xử lý khác nhau hoặc chúng có thể gọi các hàm cụ thể trong tập lệnh của bạn.
Nếu tập lệnh của bạn cần để phát hiện và điều chỉnh các loại môi trường ảo khác nhau, bạn có thể thêm case
mệnh đề, tìm kiếm các chuỗi khác nhau systemd-detect-virt
có thể trở lại. Chúng tôi có thể xem danh sách đầy đủ các câu trả lời có thể có bằng cách sử dụng --list
quyền mua. Để giúp bạn dễ dàng xem tất cả chúng cùng một lúc, chúng tôi sẽ chuyển đầu ra thông qua column
yêu cầu.
systemd-detect-virt --list | column
Uống thuốc đỏ
Các kỹ thuật này cho phép các tập lệnh của bạn biết khi nào chúng đang chạy trên phần cứng trần và khi chúng ở bên trong một máy ảo.
Giống như Neo trong Ma trận, họ sẽ biết đâu là thật và đâu là giả.