ฉันจะรันโปรแกรม 32- บิตบน Debian / Ubuntu 64 บิตได้อย่างไร


74

ฉันมีการติดตั้ง Debian หรือ Ubuntu 64-bit (amd64 aka x86_64) ฉันจำเป็นต้องเรียกใช้โปรแกรม 32 บิต (i386 / i686) เป็นครั้งคราวหรือเพื่อรวบรวมโปรแกรมสำหรับระบบ 32 บิต ฉันจะทำสิ่งนี้ด้วยความยุ่งยากน้อยที่สุดได้อย่างไร

โบนัส: จะเป็นอย่างไรถ้าฉันต้องการเรียกใช้หรือทดสอบด้วยการเผยแพร่รุ่นเก่าหรือใหม่กว่า


เป็นไปได้เหมือนกันในการถาม ubuntu: askubuntu.com/questions/359156/ …
Ciro Santilli 事件改造中心中心法轮功六四事件

คำตอบ:


52

การสนับสนุนพื้นเมือง

ตั้งแต่ Ubuntu 11.04 และ Debian wheezy (7.0) Debian และ Ubuntu มีการสนับสนุนหลายแบบ: คุณสามารถผสมแพ็คเกจ x86_32 (i386) และ x86_64 (amd64) ในระบบเดียวกันได้อย่างตรงไปตรงมา นี่เป็นที่รู้จักกันในชื่อmultiarch supportดูคำตอบของ warl0ckสำหรับรายละเอียดเพิ่มเติม

ในรุ่นเก่า Debian และ Ubuntu มาพร้อมกับไลบรารีจำนวน 32 บิตใน amd64 ติดตั้งแพคเกจเพื่อให้มีชุดพื้นฐานของไลบรารี 32 บิตและอาจเป็นแพ็คเกจอื่น ๆ ที่ขึ้นอยู่กับแพ็คเกจนี้ executables 32 บิตของคุณควรรันถ้าคุณมีไลบรารีที่จำเป็นทั้งหมด สำหรับการพัฒนาติดตั้งและอีกแพคเกจอื่น ๆ อาจจะว่าขึ้นอยู่กับมันเช่น คุณอาจพบว่ามีประโยชน์เช่นกันและใน Debian ผ่านตัวเลือกเพื่อ gcc เพื่อรวบรวมสำหรับ ix86ia32-libs ติดตั้ง ia32-libsgcc-multilib ติดตั้ง gcc-multilibg++-multilibbinutils-multiarch ติดตั้ง binutils-multiarchia32-libs-dev-m32

โปรดทราบว่าuname -mจะยังคงแสดงx64_64หากคุณใช้เคอร์เนล 64 บิตโดยไม่คำนึงถึงองค์ประกอบโหมดผู้ใช้แบบ 32 บิตที่คุณติดตั้งไว้ Schroot อธิบายไว้ด้านล่างดูแลเรื่องนี้

Schroot

ส่วนนี้เป็นแนวทางในการติดตั้งการแจกจ่ายแบบเดเบียน“ ข้างใน” การกระจาย Linux อื่น มันเป็นคำพูดในแง่ของการติดตั้ง Ubuntu แบบ 32 บิตภายใน Ubuntu แบบ 64 บิต แต่ควรใช้กับการปรับเปลี่ยนเล็กน้อยกับสถานการณ์อื่น ๆ เช่นการติดตั้ง Debian ไม่เสถียรภายใน Debian เสถียรหรือในทางกลับกัน

บทนำ

แนวคิดคือการติดตั้งการกระจายทางเลือกในทรีย่อยและเรียกใช้จากที่ คุณสามารถติดตั้งระบบ 32- บิตบนระบบ 64- บิตในแบบนั้นหรือรีลีสการกระจายของคุณที่แตกต่างกันหรือสภาพแวดล้อมการทดสอบที่ติดตั้งชุดแพ็กเกจต่างๆ

การเรียกใช้chrootคำสั่งและระบบเริ่มต้นกระบวนการด้วยมุมมองของระบบไฟล์ที่ถูก จำกัด ไว้ที่แผนผังย่อยของแผนผังไดเร็กทอรี schroot ของเดเบียนและอูบุนตูยูทิลิตีที่ล้อมรอบคุณสมบัตินี้เพื่อสร้างสภาพแวดล้อมย่อยที่สามารถใช้งานได้มากขึ้น

ติดตั้งschrootแพ็คเกจ ติดตั้ง schroot ( Debian ) และdebootstrapแพ็คเกจ ติดตั้ง debootstrap ( Debian ) Debootstrap จำเป็นสำหรับการติดตั้งการกระจายทางเลือกเท่านั้นและสามารถลบออกได้ในภายหลัง

ตั้งค่า schroot

ตัวอย่างนี้อธิบายวิธีตั้งค่าสภาพแวดล้อมทางเลือก Ubuntu 10.04LTS (lucid lynx) 32 บิต การตั้งค่าที่คล้ายกันควรทำงานกับ Debian และ Ubuntu รุ่นอื่น ๆ สร้างไฟล์ที่/etc/schroot/chroot.d/lucid32มีเนื้อหาดังต่อไปนี้:

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

บรรทัดdirectory=/32บอก schroot ที่เราจะใส่ไฟล์ของการติดตั้ง 32- บิต บรรทัดusername=yourusernameบอกว่าผู้ใช้yourusernameจะได้รับอนุญาตให้ใช้ schroot บรรทัดgroups=users,adminบอกว่าผู้ใช้ในกลุ่มใดกลุ่มหนึ่งจะได้รับอนุญาตให้ใช้ schroot คุณยังสามารถใส่users=…คำสั่ง

ติดตั้งการกระจายใหม่

สร้างไดเรกทอรีและเริ่มการเติมด้วย debootstrap Debootstrap ดาวน์โหลดและติดตั้งชุดแพ็กเกจหลักสำหรับการแจกจ่ายและสถาปัตยกรรมที่ระบุ

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

คุณเกือบจะมีระบบการทำงานอยู่แล้ว สิ่งที่ตามมาคือการปรับปรุงเล็กน้อย Schroot เขียนทับไฟล์หลายไฟล์โดยอัตโนมัติ/32/etcเมื่อคุณเรียกใช้โดยเฉพาะอย่างยิ่งการกำหนดค่า DNS ใน/etc/resolv.confและฐานข้อมูลผู้ใช้ใน/etc/passwdและไฟล์อื่น ๆ (ซึ่งสามารถเขียนทับได้โปรดดูเอกสารประกอบ) มีไฟล์เพิ่มเติมอีกสองสามไฟล์ที่คุณอาจต้องการคัดลอกด้วยตนเองเพียงครั้งเดียวและสำหรับทั้งหมด:

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

จะไม่มีไฟล์/etc/mtabหรือ/etc/fstabใน chroot ฉันไม่แนะนำให้ใช้mountคำสั่งด้วยตนเองใน chroot ทำจากภายนอก แต่สร้างดีพอที่/etc/mtabจะทำให้คำสั่งเช่นdfทำงานอย่างมีเหตุผล

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

กับdirectoryชนิด schroot จะดำเนินม้าผูกของจำนวนของไดเรกทอรีเช่นไดเรกทอรีที่จะใช้ร่วมกันกับการติดตั้งผู้ปกครอง: /proc, /dev, ,/home/tmp

บริการใน chroot

ตามที่อธิบายไว้ที่นี่ schroot ไม่เหมาะสำหรับการเรียกใช้ daemons โปรแกรมใน schroot จะถูกฆ่าเมื่อคุณออกจาก schroot ใช้ schroot "ธรรมดา" แทน "ไดเรกทอรี" schroot ถ้าคุณต้องการให้มันถาวรมากขึ้นและตั้งค่าการเชื่อมโยงถาวรใน/etc/fstabการติดตั้งผู้ปกครอง

บน Debian และ Ubuntu บริการจะเริ่มโดยอัตโนมัติเมื่อทำการติดตั้ง เพื่อหลีกเลี่ยงปัญหานี้ (ซึ่งอาจรบกวนบริการที่ทำงานนอก chroot โดยเฉพาะอย่างยิ่งเพราะมีการแชร์พอร์ตเครือข่าย) ให้สร้างนโยบายที่ไม่ให้บริการใน chroot วางสคริปต์ต่อไปนี้เป็น/32/usr/sbin/policy-rc.dและทำให้เป็นไฟล์เรียกทำงาน ( 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

เติมระบบใหม่

ตอนนี้เราสามารถเริ่มใช้ chroot คุณจะต้องติดตั้งแพ็กเกจเพิ่มเติมอีกสองสามรายการ ณ จุดนี้

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

คุณอาจต้องสร้างสถานที่บางแห่งเช่น

locale-gen en_US en_US.utf8

หาก schroot สำหรับ Ubuntu รุ่นเก่าเช่น 8.04 (hardy) โปรดทราบว่าแพ็คเกจ ubuntu-standard pulls ใน MTA เลือกnullmailerแทนที่จะเป็นค่าเริ่มต้นpostfix(คุณอาจต้องการให้ chroot ส่งอีเมล แต่คุณไม่ต้องการรับมันอย่างแน่นอน)

ก้าวต่อไป

สำหรับข้อมูลเพิ่มเติมโปรดดูที่schrootคู่มือการschroot คำถามที่พบบ่อยและ คู่มือschroot.conf Schroot เป็นส่วนหนึ่งของautobuilder (buildd) โครงการ อาจจะมีเคล็ดลับที่เป็นประโยชน์เพิ่มเติมในเพจชุมชนเกี่ยวกับอูบุนตู debootstrap

เครื่องเสมือน

หากคุณจำเป็นต้องแยกสมบูรณ์ของสภาพแวดล้อมอื่นใช้เครื่องเสมือนเช่นKVM ( qemu-KVM ติดตั้ง qemu-kvm ) หรือVirtualBox


@Gilles คุณสามารถเพิ่มคำอธิบายว่า[ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]เงื่อนไขทำอะไรได้บ้าง?
Faheem Mitha

1
@FaheemMitha มันทดสอบว่าสคริปต์ทำงานใน chrootหรือไม่ มีเพื่อสนับสนุนการบูทการติดตั้ง chroot เป็นระบบแบบสแตนด์อโลน
Gilles

ฉันขอแนะนำให้เพิ่มบรรทัดตามusers=faheemตัวอย่างของคุณ อย่างน้อยที่สุดฉันเป็นสมาชิกของกลุ่มผู้ใช้ ฉันคาดว่าจะเป็นอย่างไร
Faheem Mitha

25

ตั้งแต่Ubuntu 11.04 (natty) และDebian 7.0 ( wheezy ) เปิดตัวการสนับสนุนมัลติชาร์ตไลบรารีแบบ 32 บิตและ 64 บิตสามารถอยู่ร่วมกันได้ในระบบเดียว ในการติดตั้งไลบรารี 32 บิต libXX ขั้นแรกให้เพิ่มสถาปัตยกรรม 32 บิตที่จำเป็นลงในระบบของคุณ:

สำหรับ Ubuntu:

sudo dpkg --foreign-architecture i386

และสำหรับ Debian:

sudo dpkg --add-architecture i386

จากนั้นติดตั้งไลบรารี 32 บิต:

sudo apt-get install libXX:i386

แพ็คเกจ ia32-libs ในฐานะที่เป็น Ubuntu 12.04 ที่แม่นยำมันไม่ได้มีห้องสมุดใด ๆ อีกต่อไปมันดึงเฉพาะในlibXX:i386แพคเกจเป็นการอ้างอิง

ส่วนการคอมไพล์นั้นค่อนข้างง่ายสำหรับโปรแกรม C และ C ++, เพิ่ม-m32ไปยังCFLAGหรือCXXFLAG, ซึ่งจะสร้างโปรแกรม 32 บิตเช่น

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

ใช้งานได้กับโครงการที่ใช้ไฟล์สร้างเช่นกัน


2
apt-get install ia32-libsทำงานให้ฉัน (13.04)!
Étienne

1
สำหรับ Ubuntu 14.04 เป็น "sudo dpkg --add-architecture i386"
diyism

ตัวอย่างเช่นบน Debian Jessie: dpkg --add-architecture i386; apt-get update; apt-get install libstdc ++ 5: i386 libpam0g: i386
Jonathan Ben-Avraham

0

หากคุณมีไบนารีแบบ 32 บิตที่คุณต้องการใช้กับระบบ Debian / Ubuntu รุ่น 64 บิตที่ทันสมัยให้ทำดังนี้:

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

สิ่งนี้ได้รับการทดสอบใน Debian 9


1
ฉันยังต้องการsudo apt-get install lib32z1สำหรับปฏิบัติการแบบ 32 บิตโดยเฉพาะหากสิ่งนั้นช่วยได้ ข้อผิดพลาดคือ: sqlite3: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory. ใช่มันเป็นปี 2019 และฉันไม่พบไคลเอ็นต์ sqlite3 แบบ 64 บิตที่คอมไพล์แล้วที่สนับสนุนโดยโปรเจ็กต์ sqlite :( ฉันค่อนข้าง จำกัด ในสิ่งที่ฉันได้รับอนุญาตให้ติดตั้งบนทรัพยากรที่ใช้ร่วมกันนี้ดังนั้นฉันจึงต้องดึงแพคเกจ โชคดีที่ฉันสามารถติดตั้งlib32z1ได้
harperville
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.