it-swarm-vi.com

Làm cách nào để chạy các chương trình 32 bit trên Debian / Ubuntu 64 bit?

Tôi có bản cài đặt Debian hoặc Ubuntu 64-bit (AMD64 a.k.a. x86_64). Thỉnh thoảng tôi cần chạy các chương trình 32 bit (i386/i686) hoặc biên dịch chương trình cho hệ thống 32 bit. Làm thế nào tôi có thể làm điều này với tối thiểu phiền phức?

Phần thưởng: điều gì xảy ra nếu tôi muốn chạy hoặc thử nghiệm với bản phát hành cũ hơn hoặc mới hơn của bản phân phối?

Hỗ trợ bản địa

Do Ubuntu 11.04 và Debian wheezy (7.0), Debian và Ubuntu có hỗ trợ đa nhóm: bạn có thể trộn các gói x86_32 (i386) và x86_64 (AMD64) trên cùng một hệ thống theo cách đơn giản. Điều này được gọi là hỗ trợ multiarch Xem câu trả lời của warl0ck để biết thêm chi tiết.

Trong các bản phát hành cũ hơn, Debian và Ubuntu có một số thư viện 32 bit trên AMD64. Cài đặt ia32-libsInstall ia32-libs gói để có một bộ thư viện 32 bit cơ bản và có thể các gói khác phụ thuộc vào gói này. Các tệp thực thi 32 bit của bạn chỉ cần chạy nếu bạn có tất cả các thư viện cần thiết. Để phát triển, hãy cài đặt gcc-multilibInstall gcc-multilib và một lần nữa có thể các gói khác phụ thuộc vào nó, chẳng hạn như g++-multilib. Bạn có thể tìm thấy binutils-multiarchInstall binutils-multiarch cũng hữu ích và ia32-libs-dev trên Debian. Truyền tùy chọn -m32 Cho gcc để biên dịch cho ix86.

Lưu ý rằng uname -m Vẫn sẽ hiển thị x64_64 Nếu bạn đang chạy kernel 64 bit, bất kể thành phần chế độ người dùng 32 bit nào bạn đã cài đặt. Schroot được mô tả dưới đây quan tâm đến điều này.

Schroot

Phần này là một hướng dẫn để cài đặt một bản phân phối giống như Debian bên trong một bản phân phối Linux khác. Nó được hiểu là về việc cài đặt Ubuntu 32 bit bên trong Ubuntu 64 bit, nhưng nên áp dụng với các sửa đổi nhỏ cho các tình huống khác, chẳng hạn như cài đặt Debian không ổn định trong Debian ổn định hoặc ngược lại.

Giới thiệu

Ý tưởng là cài đặt một bản phân phối thay thế trong một cây con và chạy từ đó. Bạn có thể cài đặt hệ thống 32 bit trên hệ thống 64 bit theo cách đó hoặc bản phát hành khác của bản phân phối hoặc môi trường thử nghiệm với các bộ gói khác nhau được cài đặt.

Lệnh chroot lệnh và hệ thống bắt đầu một quá trình với chế độ xem hệ thống tập tin bị giới hạn ở một cây con của cây thư mục. Debian và Ubuntu ship schroot , một tiện ích bao quanh tính năng này để tạo ra một môi trường phụ có thể sử dụng nhiều hơn.

Cài đặt gói schrootInstall schroot ( Debian ) và gói debootstrapInstall debootstrap ( Debian ). Debootstrap chỉ cần thiết cho việc cài đặt phân phối thay thế và có thể được gỡ bỏ sau đó.

Thiết lập schroot

Ví dụ này mô tả cách thiết lập môi trường thay thế Ubuntu 10.04LTS (lucid lynx) 32 bit. Một thiết lập tương tự sẽ hoạt động với các bản phát hành khác của Debian và Ubuntu. Tạo một tệp /etc/schroot/chroot.d/lucid32 Với các nội dung sau:

[lucid32]
description=Ubuntu 10.04LTS 32-bit
directory=/32
type=directory
personality=linux32
users=yourusername
groups=users,admin

Dòng directory=/32 Cho schroot biết nơi chúng tôi sẽ đặt các tệp của bản cài đặt 32 bit. Dòng username=yourusername Cho biết người dùng yourusername sẽ được phép sử dụng schroot. Dòng groups=users,admin Nói rằng người dùng trong một trong hai nhóm sẽ được phép sử dụng schroot; bạn cũng có thể đặt một lệnh users=….

Cài đặt bản phân phối mới

Tạo thư mục và bắt đầu điền nó với debootstrap. Debootstrap tải xuống và cài đặt một tập hợp các gói cốt lõi cho phân phối và kiến ​​trúc được chỉ định.

mkdir /32
debootstrap --Arch i386 lucid /32 http://archive.ubuntu.com/ubuntu

Bạn gần như đã có một hệ thống làm việc rồi; những gì sau đây là những cải tiến nhỏ. Schroot tự động ghi đè một số tệp trong /32/etc Khi bạn chạy nó, đặc biệt là cấu hình DNS trong /etc/resolv.conf Và cơ sở dữ liệu người dùng trong /etc/passwd Và các tệp khác (có thể bị ghi đè các tài liệu). Có một vài tệp bạn có thể muốn sao chép thủ công một lần và mãi mãi:

cp -p /etc/apt/apt.conf /32/etc/apt/      # for proxy settings
cp -p /etc/apt/sources.list /32/etc/apt/  # for universe, security, etc
cp -p /etc/environment /32/etc/           # for proxy and locale settings
cp -p /etc/sudoers /32/etc/               # for custom Sudo settings

Sẽ không có tệp /etc/mtab Hoặc /etc/fstab Trong chroot. Tôi không khuyên bạn nên sử dụng lệnh mount theo cách thủ công trong chroot, hãy thực hiện từ bên ngoài. Nhưng hãy tạo một /etc/mtab Đủ tốt để làm cho các lệnh như df hoạt động hợp lý.

ln -s /proc/mounts /32/etc/mtab

Với loại directory, schroot sẽ thực hiện liên kết gắn kết của một số thư mục, tức là các thư mục đó sẽ được chia sẻ với cài đặt gốc: /proc, /dev, /home, /tmp.

Dịch vụ trong chroot

Như được mô tả ở đây, một schroot không phù hợp để chạy daemon. Các chương trình trong schroot sẽ bị giết khi bạn thoát schroot. Sử dụng một schroot đơn giản và thay vì một thư mục của Google schroot nếu bạn muốn nó lâu dài hơn và thiết lập các liên kết gắn kết vĩnh viễn trong /etc/fstab Trên cài đặt gốc.

Trên Debian và Ubuntu, các dịch vụ bắt đầu tự động khi cài đặt. Để tránh điều này (có thể làm gián đoạn các dịch vụ chạy bên ngoài chroot, đặc biệt vì các cổng mạng được chia sẻ), hãy thiết lập chính sách về việc không chạy các dịch vụ trong chroot. Đặt tập lệnh sau dưới dạng /32/usr/sbin/policy-rc.d và làm cho tập lệnh thực thi (chmod a+rx /32/usr/sbin/policy-rc.d).

#!/bin/sh
## Don't start any service if running in a chroot.
## See /usr/share/doc/sysv-rc/README.policy-rc.d.gz
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
  exit 101
fi

Xây dựng hệ thống mới

Bây giờ chúng ta có thể bắt đầu sử dụng chroot. Bạn sẽ muốn cài đặt thêm một vài gói vào thời điểm này.

schroot -c lucid32
Sudo apt-get update
apt-get install lsb-core nano
...

Bạn có thể cần tạo một vài địa phương, ví dụ:.

locale-gen en_US en_US.utf8

Nếu schroot dành cho một bản phát hành cũ hơn của Ubuntu, chẳng hạn như 8.04 (hardy), hãy lưu ý rằng gói tiêu chuẩn ub Ubuntu kéo theo một MTA. Chọn nullmailer thay vì mặc định postfix (bạn có thể muốn chroot của mình gửi thư nhưng bạn chắc chắn không muốn nhận bất kỳ thư nào).

Đi xa hơn

Để biết thêm thông tin, hãy xem hướng dẫn schroot , schroot FAQ và hướng dẫn schroot.conf . Schroot là một phần của dự án Debian autobuilder (buildd) . Có thể có thêm các mẹo hữu ích trên trang cộng đồng Ubuntu về debootstrap .

Máy ảo

Nếu bạn cần cách ly hoàn toàn với môi trường thay thế, hãy sử dụng máy ảo như KVM ( qemu-kvmInstall qemu-kvm ) hoặc VirtualBox .

bunt 11.04 (natty) và Debian 7.0 (wheezy) được giới thiệu multiarch hỗ trợ, các thư viện 32 bit và 64 bit có thể cùng tồn tại trên một hệ thống . Để cài đặt thư viện libXX 32 bit, trước tiên hãy thêm kiến ​​trúc 32 bit cần thiết vào hệ thống của bạn:

Đối với Ubuntu:

Sudo dpkg --foreign-architecture i386

Và đối với Debian:

Sudo dpkg --add-architecture i386

Sau đó cài đặt thư viện 32 bit:

Sudo apt-get install libXX:i386

Gói ia32-libs. Kể từ Ubuntu 12.04 chính xác, nó không còn chứa bất kỳ thư viện nào nữa, nó chỉ kéo vào libXX:i386 gói như phụ thuộc.

Phần biên dịch khá dễ dàng cho các chương trình C và C++, thêm -m32 đến CFLAG hoặc CXXFLAG, sẽ tạo chương trình được tạo 32 bit, ví dụ:

export CFLAGS="-m32"
gcc main.c -o main

Điều này làm việc cho các dự án dựa trên makefile là tốt.

27
daisy

Nếu bạn chỉ có tệp nhị phân 32 bit mà bạn muốn chạy trên hệ thống Debian/Ubuntu 64 bit hiện đại, hãy làm như sau:

dpkg --add-architecture i386
apt update
apt install libc6-i386

Điều này đã được thử nghiệm trên Debian 9.

2
cjs