Saya melihat sesuatu yang sangat aneh di dalam armel
lingkungan Debian yang chroot .
Tapi pertama-tama, sedikit cerita latar ... Ini panjang, tapi pertanyaannya kompleks dan bantuan potensial tergantung pada mengetahui cerita lengkapnya.
Saya memiliki SoC ARM tertanam yang menjalankan Linux - lebih khusus lagi, Debian armel
Lenny pada kernel 2.6.17. Distro Debian sendiri mudah di-upgrade ke versi yang lebih baru ( sudo apt-get dist-upgrade
) dan dengan demikian dapat dinaikkan ke kecepatan, ke armel
versi
squeeze
atau bahkan wheezy
.
Masalahnya adalah kernel tersebut adalah kernel kustom ... SoC ARM yang dimaksud bukan bagian dari kernel arus utama, sehingga kernel ini cukup banyak ditinggalkan pada 2.6.17.
Jika Anda tahu cara kerja Linux dan GLIBC, Anda sudah dapat melihat masalahnya - Versi GLIBC dikompilasi dengan versi kernel minimum yang didukung ... Yang telah melewati 2.6.17. Jadi jika kita mencoba misalnya chroot ke squeeze 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
... kami melihat pesan dari GLIBC dari squeeze
, yang memberi tahu kami bahwa itu tidak dikompilasi untuk bekerja dengan kernel lama ini (2.6.17).
Masalah yang sama terjadi pada wheezy, juga - karena ini lebih baru daripada memeras - dan sebenarnya akan terjadi dengan versi Debian mulai sekarang, karena GLIBC mereka tidak akan berfungsi pada kernel 2.6.17 saya.
Awalnya saya pikir ini adalah deal breaker - tetapi kemudian saya menyadari bahwa secara teori saya dapat mengkompilasi ulang GLIBC untuk bekerja dengan kernel lama yang digunakan oleh SoC saya ... Tapi saya membutuhkan lingkungan yang identik dengan apa yang digunakan untuk membangun libc6 paket dalam misalnya memeras Debian.
Saya menduga kompilasi GLIBC dan persiapan file libc6_2.11.3-4.deb dilakukan melalui mesin cross-compiling otomatis yang ditemukan oleh para Dewa Debian.
Saya bukan Tuhan ... saya juga tidak dapat menemukan apa pun di Google tentang cara menjadi satu - yaitu cara menggunakan Core i5 saya sebagai tuan rumah, untuk mengkompilasi silang GLIBC menggunakan pengaturan yang persis sama dengan versi paket (di dalam Debian squeeze
) menggunakan.
Jadi saya menipu - saya menemukan cara mensetup versi ARM dari Debian yang ditekan pada Core i5 saya (sebuah teknik yang menggunakan versi qemu-arm
biner yang statis ).
Setelah saya chroot dalam versi x86-host Debian-armel-squeeze
saya, saya dapat dengan mudah ...
$ 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
... dan setelah 3 jam (versi Core i5-host chroot
Debian-armel-squeeze
jauh lebih lambat daripada mesin asli ...) Saya mendapat paket libc6 .deb saya. Mungkin butuh 3 bulan untuk melakukan build ini di SoC saya, jadi saya tidak mengeluh.
Kembali ke dalam ARC SoC asli saya, saya menyalin semua file libc (.so) dari paket baru ke yang standar dari pemerasan dan mencoba chroot ...
# chroot squeeze/
root@ttsiodras:/#
Iya! Berhasil! (atau begitulah tampaknya)
Libre kustom saya dilaporkan dari dalam 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/>.
Hal-hal tampaknya berhasil - Saya menyalin file, memanggil ls
...
Tetapi ketika saya mencoba menggunakan apt-get
untuk menginstal beberapa aplikasi dari squeeze
, saya mulai mendapatkan ... beberapa kesalahan tak terduga:
# 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)
Oh-oh ... banyak Function not implemented
. Kedengarannya seperti pelaporan GLIBC bahwa hal-hal dasar tidak berfungsi ...
Saya berhasil strace (jangan tanya bagaimana) dan tahu bahwa semua -at
fungsi gagal: openat
, mkdirat
, renameat
, dll - mereka semua ENOSYS pelaporan.
Tampaknya saya hanya berhasil sebagian - beberapa panggilan sistem gagal pada GLIBC baru saya.
Apakah tidak mungkin untuk mengkompilasi squeeze
atau wheeze
GLIBC untuk dieksekusi di bawah 2.6.17?
Setiap ide / petunjuk tentang apa yang saya lakukan salah dan / atau bagaimana melanjutkan akan sangat dihargai ...