chrootで管理されたDebian armel
環境で本当に奇妙なものを見ています。
しかし、最初に、少し裏話があります...これは長いですが、質問は複雑であり、潜在的な助けはすべてのストーリーを知ることにかかっています。
Linuxを実行する組み込みARM SoCがありarmel
ます。具体的には、2.6.17カーネル上のDebian Lennyです。Debianディストリビューション自体は、後のバージョン(sudo apt-get dist-upgrade
)に簡単にアップグレードできるため、armel
バージョン、squeeze
またはバージョンに合わせ
て高速化できwheezy
ます。
問題は、カーネルがカスタムカーネルであるということです...問題のARM SoCはメインラインカーネルの一部ではないため、2.6.17でほぼ放棄されています。
LinuxとGLIBCがどのように機能するかを知っていれば、すでに問題を確認できます-GLIBCバージョンは、サポートされている最小カーネルバージョンでコンパイルされています... たとえば、Debianスクイーズにchrootしようとすると...
$ # 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)で動作するようにコンパイルされていないことを示すメッセージが表示されます。
同じ問題がwheezyでも発生します-squeezeよりも新しいためです-実際、GLIBCが2.6.17カーネルで動作しないため、これからDebianバージョンでも発生します。
最初はこれが契約違反だと思いました-しかし、理論的にはSoCが使用している古いカーネルで動作するようにGLIBCを再コンパイルできることに気付きました...しかし、libc6の構築に使用した環境と同じ環境が必要ですDebian squeezeなどのパッケージ。
GLIBCのコンパイルとlibc6_2.11.3-4.debファイルの準備は、Debians of Godsによって発明された自動クロスコンパイル機構を介して行われていると思います。
私は神ではありません...また、どのようにするかについてGoogleで何かを見つけることはできません-すなわち、Core i5をホストとして使用して、パッケージ版(Debian内squeeze
)とまったく同じ設定を使用してGLIBCをクロスコンパイルする方法使用しています。
だから私はそれをだましました-私はCore i5(qemu-arm
バイナリの静的バージョンを使用する技術)でDebianスクイーズのARMバージョンをセットアップする方法を見つけました。
のx86ホストバージョンでchrootすると、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時間後(Core i5-hosted chrootedバージョンの
Debian-armel-squeeze
ネイティブマシンよりもはるかに遅い...)私はlibc6 .debパッケージを手に入れました。SoCでこのビルドを行うにはおそらく3か月かかるので、文句は言いません。
実際のARM SoCに戻って、新しいパッケージのすべてのlibcファイル(.so)をsqueezeのデフォルトのファイルにコピーし、chrootを試みました...
# 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で一部のシステムコールが失敗しています。
それはコンパイルすることは不可能であるsqueeze
か、wheeze
2.6.17の下で実行するGLIBC?
私が何を間違えたのか、そして/またはどのように進めるのかについてのアイデア/ポインタは大歓迎です...