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


74

Tôi có bản cài đặt Debian hoặc Ubuntu 64-bit (amd64 aka 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?


Câu trả lời:


52

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 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, cài đặt 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ư . Bạn cũng có thể thấy hữu ích và trên Debian. Vượt qua tùy chọn để gcc để biên dịch cho ix86.ia32-libs Cài đặt ia32-libsgcc-multilib Cài đặt gcc-multilibg++-multilibbinutils-multiarch Cài đặt binutils-multiarchia32-libs-dev-m32

Lưu ý rằng uname -mvẫn sẽ hiển thị x64_64nế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 dùng để 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.

Các chrootlệnh và hệ thống gọi bắt đầu một quá trình với một cái nhìn của hệ thống tập tin được giới hạn trong một cây con của cây thư mục. Debian và Ubuntu gửi 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 schrootgói Cài đặt schroot ( Debian ) và debootstrapgói Cài đặt 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/lucid32có nội dung sau:

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

Dòng này directory=/32cho schroot biết nơi chúng ta sẽ đặt các tệp của bản cài đặt 32 bit. Dòng username=yourusernamecho biết người dùng yourusernamesẽ được phép sử dụng schroot. Dòng groups=users,adminnó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 users=…chỉ thị.

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 bộ 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 /32/etckhi bạn chạy nó, đặc biệt là cấu hình DNS trong /etc/resolv.confvà cơ sở dữ liệu người dùng /etc/passwdvà các tệp khác (điều này có thể được ghi đè, xem 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ó một tập tin /etc/mtabhoặc /etc/fstabtrong chroot. Tôi không khuyên bạn nên sử dụng mountlệnh thủ công trong chroot, hãy thực hiện từ bên ngoài. Nhưng hãy tạo ra một thứ đủ tốt /etc/mtabđể thực hiện các lệnh như dflàm việc hợp lý.

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

Với directoryloại, schroot sẽ thực hiện gắn kết ràng buộc của một số thư mục, tức là những thư mục sẽ được chia sẻ với quá trình cài đặt cha mẹ: /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 khỏi 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/fstabcà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 không chạy các dịch vụ trong chroot. Đặt đoạn script sau đây /32/usr/sbin/policy-rc.dvà làm cho nó có thể thực thi được ( 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, vd

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 nullmailerthay 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 nó).

Đi xa hơn

Để biết thêm thông tin, xem schroothướng dẫn , Câu hỏi thường gặp schrootschroot.confhướng dẫn . Schroot là một phần của dự án autobuilder (buildd) của Debian . 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-kvm Cài đặt qemu-kvm ) hoặc VirtualBox .


@Gilles Bạn có thể thêm một lời giải thích về những gì [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]điều kiện không?
Faheem Mitha

1
@FaheemMitha Nó kiểm tra xem tập lệnh có chạy trong chroot không . Nó ở đó để hỗ trợ khởi động cài đặt chroot như một hệ thống độc lập.
Gilles

Tôi đề nghị thêm một dòng như users=faheemví dụ của bạn. Theo mặc định, đối với tôi ít nhất, tôi không phải là thành viên của nhóm người dùng. Tôi đã dự kiến ​​sẽ được, tuy nhiên.
Faheem Mitha

25

Do Ubuntu 11.04 (natty) và Debian 7.0 ( wheezy ) đã giới thiệu hỗ trợ multiarch , 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ỉ lấy libXX:i386các gói dưới dạng 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 -m32vào CFLAGhoặc CXXFLAG, điều này sẽ tạo ra 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.


2
apt-get install ia32-libslàm việc cho tôi (13.04)!
Étienne

1
đối với Ubuntu 14.04, đó là "sudo dpkg --add-architecture i386"
nghĩa tự làm

Ví dụ: trên Debian Jessie: dpkg --add-architecture i386; cập nhật apt-get; apt-get cài đặt libstdc ++ 5: i386 libpam0g: i386
Jonathan Ben-Avraham

0

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.


1
Tôi cũng cần sudo apt-get install lib32z1cho thực thi 32 bit cụ thể của mình, nếu điều đó có ích. Lỗi là : sqlite3: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory. Vâng, đó là năm 2019 và tôi không thể tìm thấy ứng dụng khách sqlite3 64 bit được biên dịch sẵn được hỗ trợ bởi dự án sqlite :( Tôi khá hạn chế trong những gì tôi được phép cài đặt trên tài nguyên được chia sẻ này vì vậy tôi phải kéo xuống các gói sqlite được biên dịch trước. Rất may tôi có thể cài đặt lib32z1.
harperville
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.