Một vài tuần trước, tôi đã viết một bài viết về Làm thế nào để chạy nhiều X phiên mà không ảo hóa, trong đó chứng minh làm thế nào bạn có thể chạy nhiều môi trường máy tính để bàn cùng một lúc trên cùng một máy tính, và chuyển đổi giữa chúng chỉ bằng cách nhấn một nút. Tôi thừa nhận, đây là một phần của sự khởi động cho chương trình thực - cách chạy nhiều bản phân phối Linux cùng một lúc mà không phải đối phó với những hạn chế của phần mềm ảo hóa.

Hôm nay, chúng ta sẽ sử dụng chroot để xử lý một số phần của hệ thống tập tin Linux của bạn như (gần như) các hệ thống hoàn toàn bị cô lập. Điều này có thể cho phép bạn thực hiện tất cả những thứ thú vị, như chạy một hệ thống Gentoo đầy đủ từ bên trong hệ thống Ubuntu của bạn với ít hoặc không mất hiệu năng.

Làm thế nào nó hoạt động

Trước khi chúng tôi bắt đầu, sẽ là một ý tưởng hay để xem xét chính xác những gì chúng tôi đang làm và cách thức hoạt động của nó. Khi bạn khởi động máy tính Linux, bạn phải thực hiện một loạt các bước để khởi động. GRUB, bộ nạp khởi động của bạn, nạp hạt nhân được chỉ định trong tệp cấu hình của GRUB, gắn nó vào phân vùng gốc của bạn và chạy các tập lệnh init được lưu trữ ở đó. Từ đó trở đi, hệ thống của bạn đang chạy từ bên trong phân vùng gốc đó.

Chúng ta sẽ sử dụng một hệ thống Linux host (tôi sẽ thực hiện nó từ Debian nhưng các bước phải giống hệt nhau bất kể phân phối) đi qua quá trình khởi động bình thường đó, nhưng sau đó xử lý một phần nào đó trong hệ thống tập tin của bạn ( như / mnt / guest) là cài đặt riêng biệt. Hệ thống khách đó sẽ không thực hiện quá trình khởi động, sẽ không nạp hạt nhân, và sẽ không chạy init script. Bạn sẽ chỉ cần nói với máy chủ của bạn "kết nối với thư mục này như thể nó là phân vùng gốc mới". Sơ đồ dưới đây sẽ giúp chứng minh điều tôi muốn nói.

Đây là khoảng cách các tệp sẽ được đặt trên hệ thống của bạn, chỉ cần ngồi ở đó như các tệp bình thường trên phân vùng bình thường, được xử lý giống như bất kỳ tệp nào khác cho đến khi chúng tôi sử dụng "chroot" để biến chúng thành một thứ gì đó đặc biệt.

Nhưng một khi chúng ta sử dụng chroot (CHange ROOT) và trỏ nó đến / mnt / guest (hoặc bất cứ nơi nào chúng ta đặt các file trong bước tiếp theo), thư mục đó bây giờ là hệ thống tập tin gốc của chính nó. Nó trở nên hoàn toàn không biết gì về hệ thống máy chủ. Tất cả các chương trình và lệnh chạy từ bên trong thư mục gốc mới đều được chạy dựa trên phần mềm bên trong nhánh mới đó.

Ví dụ, nếu bạn bị chroot vào / mnt / guest và gõ “ls”, nó đọc lệnh “ls” từ bên trong môi trường chroot đó, hoàn toàn không biết lệnh “ls” trên hệ thống host. Nếu bạn gõ "firefox", nó chạy Firefox từ bên trong thư mục gốc mới, cho dù bạn có cài đặt Firefox trên máy chủ hay không.

Bắt và sử dụng Distro Guest

Để thực hiện công việc này, bạn chỉ cần hệ thống tập tin cơ sở của một bản phân phối Linux, bất kỳ bản phân phối nào có thể. Debian có một công cụ tuyệt vời cho mục đích này gọi là debbootstrap để tải xuống các tệp cơ sở và đặt chúng ở bất cứ đâu bạn muốn. Để giữ cho mọi thứ thú vị và để chứng minh chroot có thể làm gì, chúng tôi sẽ sử dụng hệ thống tập tin Gentoo cho khách của chúng tôi. Để giữ cho mọi thứ đơn giản và trực tiếp, tôi sẽ bao gồm việc tải xuống tarball là một trong các bước chúng tôi sẽ thực hiện ở dòng lệnh.

Các bước này sẽ tải xuống tất cả các tệp cơ sở cho hệ thống Gentoo, trích xuất chúng vào thư mục đích của chúng tôi (tôi sẽ sử dụng / mnt / guest nhưng bạn có thể sử dụng bất kỳ thứ gì bạn thích) và sau đó chroot vào thư mục đó để nó được coi là thư mục gốc mới (/). Bạn có thể cần quyền root (sudo) cho một số lệnh sau đây.

 mkdir / mnt / khách cd / mnt / khách wget http://distfiles.gentoo.org/releases/x86/2008.0/stages/stage3-x86-2008.0.tar.bz2 tar -jxvf stage3-x86-2008.0.tar.bz2 chroot / mnt / khách 

Các lệnh này thực hiện các bước sau, theo thứ tự của số dòng:

  1. Tạo không gian cho hệ thống khách của chúng tôi để phát trực tiếp
  2. Chuyển vào không gian đó
  3. Tải xuống các tệp hệ thống Gentoo
  4. Giải nén chúng
  5. Xử lý không gian mới này làm thư mục gốc (/)

Ảnh chụp màn hình sau đây sẽ giúp chứng minh rằng một khi chúng ta đã sử dụng chroot để kết nối thư mục mới của chúng ta với tư cách là root, nó bây giờ được phân lập từ các nhánh trước đó trong cây hệ thống tập tin.

Để giải thích ảnh chụp màn hình, chúng tôi đang bắt đầu tại dấu nhắc lệnh bình thường trên hệ thống máy chủ. Tôi đang sử dụng pwd để hiển thị thư mục hiện tại của mình, nơi tất cả các tệp của Gentoo đều được đặt dưới dạng tệp cũ đơn giản không có ý nghĩa đặc biệt. Sau đó, tôi sử dụng chroot để coi thư mục này là root mới, và bây giờ bạn có thể nhìn thấy trực quan rằng dấu nhắc của tôi đã thay đổi vì dòng lệnh hiện đang lấy tất cả thông tin của nó (bao gồm cách vẽ dấu nhắc) từ trong môi trường gốc của Gentoo. Tất cả các lệnh và hành động tôi thực hiện trong khi chroot phụ thuộc vào các lệnh hiện có trong cây tệp mới đó. Khi tôi gõ pwd một lần nữa, nó không còn nói / mnt / guest, bởi vì theo như vỏ đó biết, không có gì tồn tại khác với những gì nó nhìn thấy bên trong cây đó.

Những điều cần lưu ý

Như tôi đã nói ở trên, đây không phải là 100% bị cô lập khỏi hệ thống máy chủ. Môi trường chroot không bao giờ được "khởi động", vì vậy nó không bao giờ nạp hạt nhân riêng của nó, và không bao giờ chạy các init script riêng của nó. Trong ví dụ của chúng tôi, chúng tôi đã có Gentoo chạy trên hạt nhân mà máy chủ lưu trữ (trong trường hợp Debian của tôi) được khởi động cùng.

Phương pháp này chắc chắn không phải là một thay thế cho ảo hóa, và không thể làm tất cả mọi thứ phần mềm VM có thể làm. Hệ thống khách không bao giờ thực sự "khởi động" hoặc chạy init script, và nó có thể hệ điều hành khách của bạn có thể yêu cầu một số tính năng hạt nhân máy chủ của bạn không cung cấp.

Để làm gì?

Trong những lần tôi đã đề cập đến kỹ thuật này cho những người trong quá khứ, họ thường nói điều gì đó dọc theo dòng chữ “Thật tuyệt, nhưng bạn sẽ sử dụng nó để làm gì?”. Cá nhân tôi đã tìm thấy một số sử dụng cho chroot :

  • Thử nghiệm phát triển phần mềm trong môi trường nguyên sơ
  • Chạy phần mềm có nghĩa là cho một phân phối khác
  • Chạy phần mềm yêu cầu phiên bản cũ hơn hoặc mới hơn của bản phân phối hiện tại của bạn
  • Truy cập cài đặt Linux trên một phân vùng khác mà không phải khởi động lại
  • Khởi động CD trực tiếp và sử dụng chroot để sửa chữa cài đặt của bạn hoặc GRUB
  • Truy cập ổ đĩa mà bạn quên người dùng / mật khẩu
  • Chạy ứng dụng 32 bit trong môi trường 64 bit

Và tôi chắc chắn có rất nhiều thứ mà tôi chưa bao giờ nghĩ tới. Bạn đã từng sử dụng chroot để chạy nhiều bản phân phối chưa? Làm thế nào về để sửa chữa một hệ thống Linux từ một đĩa CD Live? Hãy cho chúng tôi biết trong phần bình luận.