ฉันเห็นบางสิ่งที่แปลกจริง ๆ ในarmel
สภาพแวดล้อมDebian chroot-ed
แต่ก่อนอื่น backstory นิดหน่อย ... นี่มันนาน แต่คำถามมันซับซ้อนและความช่วยเหลือที่อาจเกิดขึ้นได้นั้นขึ้นอยู่กับการรู้เรื่องราวทั้งหมด
ฉันมี ARM SoC ในตัวที่รัน Linux - โดยเฉพาะ Debian armel
Lenny บนเคอร์เนล 2.6.17 Debian distro ตัวเองเป็นได้อย่างง่ายดายอัพเกรดเป็นรุ่นที่ใหม่กว่า ( sudo apt-get dist-upgrade
) ดังนั้นจึงสามารถนำขึ้นไปความเร็วกับarmel
รุ่น
หรือแม้กระทั่งsqueeze
wheezy
ปัญหาคือเคอร์เนลเป็นแบบกำหนดเอง ... ARM SoC ที่เป็นปัญหาไม่ได้เป็นส่วนหนึ่งของเคอร์เนล mainline ดังนั้นมันจึงถูกละทิ้งที่ 2.6.17
หากคุณรู้ว่า Linux และ GLIBC ทำงานอย่างไรคุณสามารถเห็นปัญหาได้แล้ว - เวอร์ชั่น GLIBC นั้นได้รับการคอมไพล์ด้วยเคอร์เนลเวอร์ชันต่ำสุดที่สนับสนุน ... ซึ่งได้ย้ายไปแล้ว 2.6.17 ดังนั้นถ้าเราพยายามที่จะเช่น chroot เพื่อบีบ Debian ...
$ # From inside the little ARM machine running Debian Lenny
$ sudo debootstrap --arch armel squeeze /squeeze \
http://ftp.whateverCountry.debian.org/debian
$ sudo -i
# mount -t proc none /squeeze/proc
# mount -t sysfs none /squeeze/sys
# mount -t devpts none /squeeze/dev/pts
# chroot /squeeze
Fatal: Kernel too old
... เราเห็นข้อความจาก GLIBC ของsqueeze
บอกเราว่ามันไม่ได้ถูกคอมไพล์ให้ทำงานกับเคอร์เนลเก่านี้ (2.6.17)
ปัญหาเดียวกันนี้เกิดขึ้นกับเสียงฮืด ๆ เหมือนกัน - เพราะมันใหม่กว่าบีบ - และในความเป็นจริงจะเกิดขึ้นกับ Debian เวอร์ชันใด ๆ นับจากนี้เป็นต้นไปเนื่องจาก GLIBC ของพวกเขาจะไม่ทำงานบนเคอร์เนล 2.6.17 ของฉัน
ตอนแรกฉันคิดว่านี่เป็นตัวจัดการข้อตกลง - แต่แล้วฉันก็รู้ว่าในทางทฤษฎีฉันสามารถรวบรวม GLIBC เพื่อทำงานกับเคอร์เนลรุ่นเก่าที่ SoC ของฉันใช้อยู่ ... แต่ฉันต้องการสภาพแวดล้อมที่เหมือนกันกับสิ่งที่เคยสร้าง libc6 แพคเกจในตัวอย่างเช่น Debian บีบ
ฉันคาดเดาการรวบรวม GLIBC และการจัดทำไฟล์ libc6_2.11.3-4.deb เสร็จแล้วผ่านเครื่องจักรรวบรวมข้ามอัตโนมัติที่คิดค้นโดย Gods of Debian
ผมไม่มีพระเจ้า ... ไม่ฉันสามารถหาอะไรใน Google เกี่ยวกับวิธีที่จะกลายเป็นหนึ่ง - คือวิธีการใช้รุ่น Core i5 ของฉันในฐานะเจ้าภาพเพื่อข้ามรวบรวม glibc ใช้การตั้งค่าเดียวกันแน่นอนว่ารุ่นแพคเกจ (ภายใน Debian squeeze
) เป็น การใช้
ดังนั้นฉันจึงหลอก - ฉันคิดวิธีตั้งค่ารุ่น ARM ของ Debian บีบบน Core i5 ของฉัน (เทคนิคที่ใช้qemu-arm
ไบนารีคงที่รุ่น)
เมื่อฉัน chrooted ในรุ่น x86 ที่โฮสต์ของDebian-armel-squeeze
ฉันฉันก็สามารถ ...
$ cd /var/tmp
$ apt-get source libc6
...
$ # edit this in - compile for my kernel...
$ vi eglibc-2.11.3/debian/sysdeps/linux.mk
...
MIN_KERNEL_SUPPORTED := 2.6.17
...
$ export DEB_BUILD_OPTS="nocheck parallel=1"
$ cd eglibc-2.11.3
$ dpkg-buildpackage -b -d -us -uc
... และหลังจาก 3 ชั่วโมง (รุ่น chrooted Core i5 โฮสต์
Debian-armel-squeeze
เป็นช้ากว่าเครื่องพื้นเมือง ... ) ฉันได้รับแพคเกจ libc6 .deb ของฉัน อาจใช้เวลา 3 เดือนในการสร้างสิ่งนี้ใน SoC ของฉันดังนั้นฉันจึงไม่บ่น
ย้อนกลับไปด้านใน ARM SoC ตัวจริงของฉันฉันได้คัดลอกไฟล์ libc (.so) ทั้งหมดของแพคเกจใหม่ไปที่ไฟล์บีบอัดเริ่มต้นและพยายามบีบอัดไฟล์ ...
# chroot squeeze/
root@ttsiodras:/#
ใช่ มันได้ผล! (หรือดังนั้นมันดูเหมือน)
libc ที่กำหนดเองของฉันรายงานจากภายใน chroot:
# /lib/libc.so.6
GNU C Library (Debian EGLIBC 2.11.3-4) stable release version 2.11.3, by Roland McGrath et al.
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.4.5.
Compiled on a Linux 2.6.26 system on 2014-10-23.
Available extensions:
crypt add-on version 2.1 by Michael Glad and others
GNU Libidn by Simon Josefsson
Native POSIX Threads Library by Ulrich Drepper et al
Support for some architectures added on, not maintained in glibc core.
BIND-8.2.3-T5B
For bug reporting instructions, please see:
<http://www.debian.org/Bugs/>.
สิ่งที่ดูเหมือนจะใช้งานได้ - ฉันคัดลอกไฟล์ถูกเรียกใช้ls
...
แต่เมื่อฉันพยายามที่apt-get
จะติดตั้งแอพบางตัวsqueeze
ฉันก็เริ่มได้รับ ... มีข้อผิดพลาดที่ไม่คาดคิด:
# apt-get install indent
Reading package lists... Done
Building dependency tree... Done
The following NEW packages will be installed:
indent
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 110 kB of archives.
After this operation, 516 kB of additional disk space will be used.
Get:1 http://ftp.gr.debian.org/debian/ squeeze/main indent armel 2.2.11-1 [110 kB]
Fetched 110 kB in 0s (236 kB/s)
tar: ./control: Cannot utime: Function not implemented
tar: ./md5sums: Cannot utime: Function not implemented
tar: .: Cannot utime: Function not implemented
tar: Exiting with failure status due to previous errors
dpkg-deb: subprocess tar returned error exit status 2
dpkg: error processing /var/cache/apt/archives/indent_2.2.11-1_armel.deb (--unpack):
subprocess dpkg-deb --control returned error exit status 2
configured to not write apport reports
rm: cannot remove `/var/lib/dpkg/tmp.ci': Function not implemented
dpkg: error while cleaning up:
subprocess rm cleanup returned error exit status 1
Errors were encountered while processing:
/var/cache/apt/archives/indent_2.2.11-1_armel.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
โอ้ ... กลุ่มFunction not implemented
หนึ่ง ดูเหมือนว่าการรายงานของ GLIBC ว่าสิ่งพื้นฐานไม่ทำงาน ...
ฉันจัดการเพื่อ strace (ไม่ขอวิธีการ) และคิดว่าทุกคนที่-at
ฟังก์ชั่นมีความล้มเหลว: openat
, mkdirat
, renameat
ฯลฯ - พวกเขาทั้งหมด ENOSYS รายงาน
ดูเหมือนว่าฉันจะประสบความสำเร็จเพียงบางส่วนเท่านั้น - การเรียกใช้ระบบบางอย่างล้มเหลวใน GLIBC ใหม่ของฉัน
เป็นไปไม่ได้ที่จะรวบรวม a squeeze
หรือwheeze
GLIBC เพื่อดำเนินการภายใต้ 2.6.17?
ความคิดใด ๆ / ตัวชี้ในสิ่งที่ฉันทำผิดและ / หรือวิธีการดำเนินการจะได้รับการชื่นชมมาก ...