Product SiteDocumentation Site

5.4. معالجة الحزم باستخدام dpkg

dpkg هو الأمر الأساسي لمعالجة حزم دبيان في النظام. إذا كنت تملك حزم ‎.deb، فإن dpkg هو المسؤول عن تثبيتها أو تحليل محتوياتها. لكن رؤية هذا البرنامج لعالم دبيان جزئية: فهو يعرف ما هو مُثبَّت على النظام، وما يُعطَى له في سطر الأوامر، لكن لا يعرف شيئاً عن الحزم المتوفرة الأخرى. ولذلك فهو يفشل إذا لم تكن الاعتماديات محققة. أما الأدوات الأخرى مثل apt، من ناحية أخرى، سوف تنشئ قائمة بالاعتماديات لتثبيت كل شيء آلياً قدر المستطاع.

5.4.1. تثبيت الحزم

dpkg هي، وقبل كل شيء، أداة لتثبيت حزم دبيان المتوفرة مسبقاً (لأنها لا تنزل أي شيء من الشبكة). لتثبيت حزمة، نستخدم الخيار ‎-i أو ‎--install.

مثال 5.2. تثبيت حزمة باستخدام dpkg

# dpkg -i man-db_2.7.0.2-5_amd64.deb
(Reading database ... 86425 files and directories currently installed.)
Preparing to unpack man-db_2.7.0.2-5_amd64.deb ...
Unpacking man-db (2.7.0.2-5) over (2.7.0.2-4) ...
Setting up man-db (2.7.0.2-5) ...
Updating database of manual pages ...
Processing triggers for mime-support (3.58) ...
يمكننا أن نرى الخطوات المختلفة التي تجريها dpkg؛ وبذلك نعلم عند أي نقطة حدث الخطأ في حال حدوثه. يمكن أيضاً إجراء التثبيت على مرحلتين: أولاً فك الضغط، بعدها الإعداد. تستفيد apt-get من هذه النقطة، لتقليل عدد استدعاءات dpkg (بما أن كل استدعاء له كلفة، بسبب تحميل قاعدة البيانات إلى الذاكرة، خصوصاً لائحة الملفات المثبتة على النظام).

مثال 5.3. فك الضغط والإعداد على مرحلتين

# dpkg --unpack man-db_2.7.0.2-5_amd64.deb
(Reading database ... 86425 files and directories currently installed.)
Preparing to unpack man-db_2.7.0.2-5_amd64.deb ...
Unpacking man-db (2.7.0.2-5) over (2.7.0.2-5) ...
Processing triggers for mime-support (3.58) ...
# dpkg --configure man-db
Setting up man-db (2.7.0.2-5) ...
Updating database of manual pages ...
أحياناً يخفق dpkg في تثبيت الحزمة ويعيد خطأ؛ إذا طلب المستخدم منه تجاهل هذا الخطأ، سوف يصدر تحذيراً فقط؛ لهذا السبب تجد خيارات ‎--force-*‎‎ المختلفة. استدعاء الأمر dpkg --force-help، أو وثائق هذا الأمر، يعطيك قائمة كاملة بهذه الخيارات. أكثر الأخطاء تكراراً، والذي سيواجهك عاجلاً أو آجلاً، هو تضارب الملفات. عندما تحوي الحزمة ملفاً ثبّتته حزمة أخرى من قبل، يرفض dpkg تثبيت الحزمة. في تلك الحالة تظهر الرسائل التالية:
Unpacking libgdm (from .../libgdm_3.8.3-2_amd64.deb) ...
dpkg: error processing /var/cache/apt/archives/libgdm_3.8.3-2_amd64.deb (--unpack):
 trying to overwrite '/usr/bin/gdmflexiserver', which is also in package gdm3 3.4.1-9
في هذه الحالة، إذا كنت تعتقد أن استبدال الملف لن يكون خطراً على استقرار النظام (وهذه هي الحال عادة)، يمكنك استخدام الخيار ‎--force-overwrite، الذي يطلب من dpkg تجاهل هذا الخطأ واستبدال الملف.
مع أن هناك العديد من خيارات ‎--force-*‎‎، إلا أن ‎--force-overwrite هو الوحيد الذي يُحتَمل أن يستخدم بانتظام. هذه الخيارات موجودة فقط للحالات الاستثنائية، ومن الأفضل تركها وشأنها قدر المستطاع لاحترام القواعد التي يفرضها نظام الحزم. لا تنس، وضعت هذه القواعد لضمان تناسق واستقرار النظام.

5.4.2. إزالة حزمة

استدعاء dpkg مع الخيار ‎-r أو ‎--remove متبوعاً باسم الحزمة، يزيل تلك الحزمة. لكن هذه الإزالة غير كاملة: إذا تبقى جميع ملفات الضبط وسكربتات الإعداد وملفات السجلات (سجلات النظام) وغيرها من بيانات المستخدم التي تعالجها الحزمة. بهذه الطريقة يمكن تعطيل البرنامج بسهولة عبر إزالته، ومن الممكن إعادة تثبيته بسرعة باستخدام نفس الإعدادات. أما لإزالة كل شيء متعلق بالحزمة بشكل كامل، استخدام الخيار ‎-P أو ‎--purge، يليه اسم الحزمة.

مثال 5.4. إزالة وتطهير الحزمة debian-cd

# dpkg -r debian-cd
(Reading database ... 97747 files and directories currently installed.)
Removing debian-cd (3.1.17) ...
# dpkg -P debian-cd
(Reading database ... 97401 files and directories currently installed.)
Removing debian-cd (3.1.17) ...
Purging configuration files for debian-cd (3.1.17) ...

5.4.3. الاستعلام في قاعدة بيانات dpkg وفحص ملفات ‎.deb

قبل ختام هذا القسم، سوف ندرس خيارات dpkg التي تستعلم عن المعلومات في قاعدة بياناته الداخلية. سوف نأخذ أولاً الخيارات الطويلة وبعدها الخيارات القصيرة المقابلة لها (التي ستأخذ نفس المتغيرات). سوف نذكر ‎--listfiles package (أو ‎-L)، الذي يذكر الملفات التي ثبتتها الحزمة؛ ‎--search file (أو ‎-S)، الذي يبحث عن الحزمة (أو الحزم) التي تحوي الملف؛ ‎--status package (أو ‎-s)، الذي يعرض ترويسات الحزمة المثبتة؛ ‎--list (أو ‎-l)، الذي يعرض قائمة بالحزم المعروفة للنظام وحالة تثبيتها؛ ‎--contents file.deb (أو ‎-c)، الذي يسرد الملفات في حزمة دبيان المحددة، ‎--info file.deb (أو ‎-I)، الذي يعرض ترويسات حزمة دبيان هذه.

مثال 5.5. الاستعلامات المختلفة باستخدام dpkg

$ dpkg -L base-passwd
/.
/usr
/usr/sbin
/usr/sbin/update-passwd
/usr/share
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/base-passwd
/usr/share/doc-base
/usr/share/doc-base/users-and-groups
/usr/share/base-passwd
/usr/share/base-passwd/group.master
/usr/share/base-passwd/passwd.master
/usr/share/man
/usr/share/man/pl
/usr/share/man/pl/man8
/usr/share/man/pl/man8/update-passwd.8.gz
/usr/share/man/ru
/usr/share/man/ru/man8
/usr/share/man/ru/man8/update-passwd.8.gz
/usr/share/man/ja
/usr/share/man/ja/man8
/usr/share/man/ja/man8/update-passwd.8.gz
/usr/share/man/fr
/usr/share/man/fr/man8
/usr/share/man/fr/man8/update-passwd.8.gz
/usr/share/man/es
/usr/share/man/es/man8
/usr/share/man/es/man8/update-passwd.8.gz
/usr/share/man/de
/usr/share/man/de/man8
/usr/share/man/de/man8/update-passwd.8.gz
/usr/share/man/man8
/usr/share/man/man8/update-passwd.8.gz
/usr/share/doc
/usr/share/doc/base-passwd
/usr/share/doc/base-passwd/users-and-groups.txt.gz
/usr/share/doc/base-passwd/changelog.gz
/usr/share/doc/base-passwd/copyright
/usr/share/doc/base-passwd/README
/usr/share/doc/base-passwd/users-and-groups.html
$ dpkg -S /bin/date
coreutils: /bin/date
$ dpkg -s coreutils
Package: coreutils
Essential: yes
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 13855
Maintainer: Michael Stone <mstone@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 8.23-3
Replaces: mktemp، realpath، timeout
Pre-Depends: libacl1 (>= 2.2.51-8)، libattr1 (>= 1:2.4.46-8)، libc6 (>= 2.17)، libselinux1 (>= 2.1.13)
Conflicts: timeout
Description: GNU core utilities
 This package contains the basic file، shell and text manipulation
 utilities which are expected to exist on every operating system.
 .
 Specifically، this package includes:
 arch base64 basename cat chcon chgrp chmod chown chroot cksum comm cp
 csplit cut date dd df dir dircolors dirname du echo env expand expr
 factor false flock fmt fold groups head hostid id install join link ln
 logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup nproc numfmt
 od paste pathchk pinky pr printenv printf ptx pwd readlink realpath rm
 rmdir runcon sha*sum seq shred sleep sort split stat stty sum sync tac
 tail tee test timeout touch tr true truncate tsort tty uname unexpand
 uniq unlink users vdir wc who whoami yes
Homepage: http://gnu.org/software/coreutils
$ dpkg -l 'b*'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err؟=(none)/Reinst-required (Status،Err: uppercase=bad)
||/ Name                    Version          Architecture     Description
+++-=======================-================-================-====================================================
un  backupninja             <none>           <none>           (no description available)
ii  backuppc                3.3.0-2          amd64            high-performance، enterprise-grade system for backin
un  base                    <none>           <none>           (no description available)
un  base-config             <none>           <none>           (no description available)
ii  base-files              8                amd64            Debian base system miscellaneous files
ii  base-passwd             3.5.37           amd64            Debian base system master password and group files
[...]
$ dpkg -c /var/cache/apt/archives/gnupg_1.4.18-6_amd64.deb
drwxr-xr-x root/root         0 2014-12-04 23:03 ./
drwxr-xr-x root/root         0 2014-12-04 23:03 ./lib/
drwxr-xr-x root/root         0 2014-12-04 23:03 ./lib/udev/
drwxr-xr-x root/root         0 2014-12-04 23:03 ./lib/udev/rules.d/
-rw-r--r-- root/root      2711 2014-12-04 23:03 ./lib/udev/rules.d/60-gnupg.rules
drwxr-xr-x root/root         0 2014-12-04 23:03 ./usr/
drwxr-xr-x root/root         0 2014-12-04 23:03 ./usr/lib/
drwxr-xr-x root/root         0 2014-12-04 23:03 ./usr/lib/gnupg/
-rwxr-xr-x root/root     39328 2014-12-04 23:03 ./usr/lib/gnupg/gpgkeys_ldap
-rwxr-xr-x root/root     92872 2014-12-04 23:03 ./usr/lib/gnupg/gpgkeys_hkp
-rwxr-xr-x root/root     47576 2014-12-04 23:03 ./usr/lib/gnupg/gpgkeys_finger
-rwxr-xr-x root/root     84648 2014-12-04 23:03 ./usr/lib/gnupg/gpgkeys_curl
-rwxr-xr-x root/root      3499 2014-12-04 23:03 ./usr/lib/gnupg/gpgkeys_mailto
drwxr-xr-x root/root         0 2014-12-04 23:03 ./usr/bin/
-rwxr-xr-x root/root     60128 2014-12-04 23:03 ./usr/bin/gpgsplit
-rwxr-xr-x root/root   1012688 2014-12-04 23:03 ./usr/bin/gpg
[...]
$ dpkg -I /var/cache/apt/archives/gnupg_1.4.18-6_amd64.deb
 new debian package، version 2.0.
 size 1148362 bytes: control archive=3422 bytes.
    1264 bytes،    26 lines      control              
    4521 bytes،    65 lines      md5sums              
     479 bytes،    13 lines   *  postinst             #!/bin/sh
     473 bytes،    13 lines   *  preinst              #!/bin/sh
 Package: gnupg
 Version: 1.4.18-6
 Architecture: amd64
 Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
 Installed-Size: 4888
 Depends: gpgv، libbz2-1.0، libc6 (>= 2.15)، libreadline6 (>= 6.0)، libusb-0.1-4 (>= 2:0.1.12)، zlib1g (>= 1:1.1.4)
 Recommends: gnupg-curl، libldap-2.4-2 (>= 2.4.7)
 Suggests: gnupg-doc، libpcsclite1، parcimonie، xloadimage | imagemagick | eog
 Section: utils
 Priority: important
 Multi-Arch: foreign
 Homepage: http://www.gnupg.org
 Description: GNU privacy guard - a free PGP replacement
  GnuPG is GNU's tool for secure communication and data storage.
  It can be used to encrypt data and to create digital signatures.
  It includes an advanced key management facility and is compliant
  with the proposed OpenPGP Internet standard as described in RFC 4880.
[...]

5.4.4. سجلات dpkg

يحتفظ dpkg بسجل يحفظ جميع أعماله في ‎‎/var/log/dpkg.log. هذا السجل طويل جداً، لأنه يُفصّل كل مرحلة من المراحل التي تمر بها الحزم التي يعالجها dpkg. بالإضافة إلى إمكانية تتبع سلوك dpkg عبر هذه السجلات، يمكنها أن تساعد – قبل كل شيء – في متابعة تاريخ تطور النظام: حيث يمكن العثور على اللحظات الدقيقة التي تم فيها تثبيت أو تحديث كل حزمة، ويمكن أن تكون فائدة هذه المعلومات عظيمة لفهم التغيرات الحديثة في سلوك النظام. كما تُسجَّل جميع أرقام الإصدارات، وبالتالي يسهل مقارنة المعلومات مع ملف changelog.Debian.gz للحزمة المطلوبة، أو حتى مع تقارير العلل على الإنترنت.

5.4.5. دعم تعدد المعماريات

تحوي جميع حزم دبيان حقل Architecture في معلومات التحكم. إما أن يحوي هذا الحقل القيمة ”all“ (للحزم المستقلة عن معمارية النظام) أو اسم المعمارية التي تستهدفها (مثل ”amd64“، أو ”armhf“، …). في الحالة الثانية، يقبل dpkg – افتراضياً – تثبيت الحزم ذات المعمارية التي تطابق معمارية النظام التي يمكن الحصول عليها باستدعاء الأمر dpkg --print-architecture.
يضمن هذا القيد أن لا ينتهي الحال بالمستخدمين مع ملفات ثنائية مترجمة لمعمارية خاطئة. كان كل شيء مثالياً لولا أن (بعض) الحواسيب تستطيع تشغيل ملفات ثنائية لأكثر من معمارية، سواء بشكل مباشر (نظام بمعمارية ”amd64“ يستطيع تشغيل ملفات ”i386“ الثنائية) أو عبر محاكيات.

5.4.5.1. تفعيل تعدد المعماريات

يسمح تعدد المعماريات في dpkg للمستخدمين بتعريف ”معماريات أجنبية“ يمكن تثبيت ملفاتها الثنائية على النظام. يتم هذا بسهولة عبر الأمر dpkg --add-architecture كما في المثال التالي. هناك أمر مقابل لإسقاط دعم معمارية أجنبية هو dpkg --remove-architecture، لكن لا يمكن استخدامه إلا عندما لا تبقى أي حزمة من حزم تلك المعمارية على النظام.
# dpkg --print-architecture
amd64
# dpkg --print-foreign-architectures
# dpkg -i gcc-4.9-base_4.9.1-19_armhf.deb
dpkg: error processing archive gcc-4.9-base_4.9.1-19_armhf.deb (--install):
 package architecture (armhf) does not match system (amd64)
Errors were encountered while processing:
 gcc-4.9-base_4.9.1-19_armhf.deb
# dpkg --add-architecture armhf
# dpkg --add-architecture armel
# dpkg --print-foreign-architectures
armhf
armel
# dpkg -i gcc-4.9-base_4.9.1-19_armhf.deb
Selecting previously unselected package gcc-4.9-base:armhf.
(Reading database ... 86425 files and directories currently installed.)
Preparing to unpack gcc-4.9-base_4.9.1-19_armhf.deb ...
Unpacking gcc-4.9-base:armhf (4.9.1-19) ...
Setting up gcc-4.9-base:armhf (4.9.1-19) ...
# dpkg --remove-architecture armhf
dpkg: error: cannot remove architecture 'armhf' currently in use by the database
# dpkg --remove-architecture armel
# dpkg --print-foreign-architectures
armhf

5.4.5.2. التعديلات المتعلقة بتعدد المعماريات

للاستفادة فعلاً من تعدد المعماريات، يجب إعادة تحزيم المكتبات ونقلها إلى مجلد خاص بالمعمارية بحيث يمكن تثبيت عدة نسخ من المكتبة نفسها (كل نسخة تستهدف معمارية مختلفة) بجوار بعضها. هذه الحزم المحدّثة تحوي حقل ”Multi-Arch: same“ في ترويستها لإعلام نظام الحزم أنه يمكن تثبيت المعماريات المختلفة من الحزمة مع بعضها بأمان (وأن هذه الحزم يمكن أن تلبي اعتماديات الحزم من المعمارية نفسها فقط). بما أن الظهور الأول لتعدد المعماريات كان في دبيان ويزي، فلم تُحوَّل جميع المكتبات بعد.
$ dpkg -s gcc-4.9-base
dpkg-query: error: --status needs a valid package name but 'gcc-4.9-base' is not: ambiguous package name 'gcc-4.9-base' with more than one installed instance

Use --help for help about querying packages.
$ dpkg -s gcc-4.9-base:amd64 gcc-4.9-base:armhf | grep ^Multi
Multi-Arch: same
Multi-Arch: same
$ dpkg -L libgcc1:amd64 |grep .so
/lib/x86_64-linux-gnu/libgcc_s.so.1
$ dpkg -S /usr/share/doc/gcc-4.9-base/copyright
gcc-4.9-base:amd64, gcc-4.9-base:armhf: /usr/share/doc/gcc-4.9-base/copyright
يجدر بالملاحظة أن أسماء حزم Multi-Arch: same يجب أن توسم بمعماريتها حتى يتم التعرف عليها دون التباس. كما يمكن لها أن تشترك بالملفات مع النسخ الأخرى من الحزمة نفسها؛ يضمن dpkg أن جميع الملفات المشتركة بين الحزم متطابقة بت مع بت. وأخيراً وليس آخراً، يجب أن يكون إصدار جميع نسخ الحزمة متطابقاً. أي يجب تحديث جميع النسخ معاً.
كما يُسبِّب تعدد المعماريات أيضاً بعض التحدّيات الملفتة في مجال إدارة الاعتماديات. لتلبية اعتمادية يجب تثبيت الحزمة عليها علامة ”Multi-Arch: foreign“ أو حزمة تطابق معماريتها معمارية الحزمة التي تصرح عن الاعتمادية (في عملية حل الاعتماديات هذه، تعتبر معمارية الحزم المستقلة عن المعماريات مطابقة لمعمارية النظام). يمكن أيضاً تضعيف الاعتمادية للسماح لأي معمارية بتلبيتها، باستخدام الصيغة package:any، لكن لا تستطيع الحزم الأجنبية تلبية هذه الاعتمادية إلا إذا كانت تحوي علامة ”Multi-Arch: allowed“.