سؤال كيف أقوم بإزالة إصدارات kernel القديمة لتنظيف قائمة التمهيد؟


في كل مرة أقوم بتثبيت نواة لينكس جديدة ، يتم تركها في grub_config ، مما يجعل قائمة التمهيد أطول في كل مرة.

أعلم أنه يمكنني البحث يدويًا عبر الحزم المثبتة وإزالتها.

هل يوفر Ubuntu أي طريقة أسهل لتنظيفها أو منعها من الظهور في قائمة التمهيد؟


658


الأصل


بالإضافة إلى إزالة الحبيبات القديمة ، قم بتعليق هذا الخط /etc/default/grub إذا كنت تريد التخلص من عناصر "الاسترداد" في القائمة: # GRUB_DISABLE_LINUX_RECOVERY = "true" - poolie
في الإصدارات الحديثة يخفي أوبونتو الألباب في القائمة الفرعية ل Grub ، لذا فهو ليس نافذًا. ومع ذلك ، قد يكون من الأفضل إزالة نواة إضافية لتوفير مساحة ، خاصةً إذا كان لديك قسم صغير / تمهيد منفصل. - jarno
هناك أمر ubuntu يطلق عليه اسم "purge-old-kernels" للقيام بهذه المهمة. انظر إجابة للمزيد من المعلومات. - jarno
sudo apt-get autoremove يجب أن تفعل الحيلة على Ubuntu 14.04+ - hobs
تراكم النواة القديمة هو علة ، مع الإصلاح في التقدم: bugs.launchpad.net/bugs/1357093 . عندما يتم إصدار الإصلاح ، سيتم تشغيل الحنفيات القديمة بشكل افتراضي. - user535733


الأجوبة:


16.04 والإصدارات الأحدث من Ubuntu

sudo apt autoremove

يزيل هذا الأمر الحزم التي تم تثبيتها تلقائيًا لحل تبعية ، ولكنها لم تعد تعتمد الآن على. يتضمن هذا الإصدارات القديمة من linux-headers-* و linux-image-*. (كما أنها ذكية حول هذه العملية ، تاركة نسخة احتياطية واحدة من النواة حولها كخلفية!)

11.10 وإصدارات أحدث من أوبونتو

GRUB2 وعرضه لجميع الألباب

أحدث إصدارات Grub2 مثبت في أوبونتو عرض أحدث النواة تلقائيًا وإخفاء النواة القديمة التي ربما تكون قد ثبتها.

GNU GRUB

إذا كنت لا ترى الخاص بك نكش - ثم تذكر أن تضغط تحول بينما تمهيد.

كما ترى ، يتم عرض أحدث نواة فقط.

إذا قمت بتحديد الخيار المعروض (اضغط على أدخل) تصبح جميع الحبات القديمة مرئية ومتاحة للتمهيد منها.

GNU GRUB Previous versions 

كيفية حذف الحواف القديمة بشكل دائم

التمهيد الأول مع أحدث النواة المتاحة.

هناك عدد من الطرق لحذف النواة القديمة. شخصيا ، لن أتطرق الكمبيوتر Janitor لأن من المسلم به أن كسر جهاز الكمبيوتر الخاص بك مع اقتراحاتها.

متشابك

البديل هو متشابك (sudo apt install synaptic)

البحث عن لينكس صورة، انقر بزر الماوس الأيمن على النواة واختر الإزالة الكاملة وانقر في النهاية على تطبيق زر لحذف النواة.

Synaptic Package Manager

كرر البحث ولكن هذه المرة لـ لينكس-رأس - يمكنك حذف الرؤوس المقترنة لصورة النواة التي تم اختيارها مسبقًا.

متشابك على الرغم من أنك لن تحاول التحقق مما تحاول إزالته ... يمكنك حذف أحدث نواة عن غير قصد - أو حتى حذف جميع النواة الخاصة بك عبر هذه الأداة مما يتركك مع غير قابل للتمهيد أوبونتو!.

تذكر التحقق من النواة التي تستخدمها النوع:

uname -r

ستكون النتيجة مشابهة لما يلي:

Terminal <uname -r>

تذكر النتيجة والرقم - تأكد من أنك لا تحذف الصورة أو الرأس المقابل.

توصية

توصيلي هو الاحتفاظ بنوعين على الأقل أو يفضل ثلاث حبات بما في ذلك الأحدث. والسبب في هذه التوصية هو أنه سيكون لديك على الأقل حبة أخرى أو اثنتان آخرتان تستخدمان التمهيد ، إذا كان السبب في ذلك هو النواة الأخيرة التي لا تستطيع التمهيد بها أو تقديم إمكانية تراجعها مثل الاتصال اللاسلكي المكسور.


569



إزالة الحزم القديمة "linux-image *" باستخدام synaptic ، عملت بشكل جيد مع 10.04 أيضًا. (أذكر ذلك لأن العنوان يشير إلى أنه قد يكون فقط 11.10 وأكثر) - mivk
ال -y التبديل في نهاية apt-get الخط ضروري ، خلاف ذلك تلجأ فقط للحصول على تأكيد ، وبما أن الإدخال هو أنبوب ، فإنه مجرد إحباط. لذلك يجب أن ينتهي بـ: | xargs sudo apt-get purge -y - Josh
إزالة حوالي 20 نسخة من العمر linux-image و linux-headers حرر 4.5 غيغابايت من المساحة على جهازي. - Andrew Mao
تعمل هذه الطريقة بشكل جيد ، ولكن يؤدي حذف كل نواة إلى إعادة إنعاش grub.cfg بشكل مفرط ، الأمر الذي يستغرق وقتًا. هل هناك أي طريقة لتعطيل هذا لحذف الحزم ، ثم إعادة إنشائه مرة واحدة؟ - spacediver
أنا ثاني السؤال منspacediver - هذه هي عملية بطيئة مجنون عندما يكون لديك 38 حبات غير الضرورية ، حيث أنه يتم إزالة كل واحد من خلال كل ما تبقى منها مع توليد grub.cfg جديدة. هذا هو ما نسميه عملية N ^ 2 - تعالج نواة حوالي (38 ^ 2/2) = 722 مرة ، وهي بطيئة جدًا. بالتأكيد يمكن لأوبونتو أن يأتي بشيء أفضل .... - nealmcb


أولاً ، أعد تشغيل النظام للتأكد من أنه يستخدم أحدث نواة. ثم افتح الطرفية وتحقق من النواة الحالية:

uname -r 

لا تقم بإزالة هذا KERNEL!

بعد ذلك ، اكتب الأمر أدناه لعرض / سرد جميع النواة المثبتة على نظامك.

dpkg --list | grep linux-image 

العثور على جميع النواة التي هي أقل من النواة الحالية. عندما تعرف أي نواة يجب إزالتها ، تابع أدناه لإزالتها. قم بتشغيل الأوامر أدناه لإزالة النواة التي حددتها.

sudo apt-get purge linux-image-x.x.x-x-generic 

أخيرا ، قم بتشغيل الأوامر أدناه لتحديث grub2

sudo update-grub2 

إعادة تشغيل النظام الخاص بك.


366



عند القيام بذلك في 10.04 و 12.04 ، وجدت أن التحديث-grub تم تشغيله تلقائيًا أثناء عملية التطهير. - aidan
وباش توسيع الدعامة يمكن استخدامها ، على سبيل المثال sudo apt-get purge linux-image-3.2.0-3{0..5}-generic (يزيل 30 ، 31 ، .. ، 35) - ajo
لا حاجة لإعادة تشغيل النظام بعد ذلك. في الواقع ، يجب إعادة تمهيد النظام قبل تنفيذ هذه الخطوات ، لضمان استخدامك لأحدث إصدار kernel الذي ربما قمت بتنزيله وتثبيته (قمت بتحديث apt-get & & apt-get upgrade before this، right ؟؟) - Ricket
قد ترغب أيضًا في إلغاء تثبيت linux-signed-image الحزم التي يمكن تثبيتها في أنظمة UEFI: sudo apt-get purge linux-signed-image-3.11.0-{12,14,24}-generic التي من شأنها إزالة 12 و 14 و 24 - devius
jarno لا أعرف ما إذا كنت أستخدم نواة موقعة أم لا ، ولكن uname -r ليس لديه اي signed سلسلة على نظام بلدي. يبدو لي أن هناك صورة موقعة مثبتة ومخرجات ذلك ls الأمر هو: /boot/vmlinuz-3.19.0-16-generic.efi.signed. - devius


بلدي واحد الخطوط الملاحية المنتظمة لإزالة الحواف القديمة (وهذا أيضا يحرر مساحة القرص)

dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p' | xargs sudo apt-get -y purge

شرح (تذكر ، | يستخدم إخراج الأمر السابق كمدخل إلى التالي)

  • dpkg --list يسرد جميع الحزم المثبتة
  • grep linux-image يبحث عن صور لينكس المثبتة
  • awk '{ print $2 }' فقط يخرج العمود الثاني (وهو اسم الحزمة)
  • sort -V يضع العناصر بالترتيب حسب رقم الإصدار
  • sed -n '/'`uname -r`'/q;p' يطبع الخطوط قبل النواة الحالية
  • xargs sudo apt-get -y purge تطهر النوى الموجودة

تفكيك sed استدعاء:

  • -n يروي sed كن مهذبا
  • `uname -r` إخراج إصدار kernel المثبت حاليًا - يتم تضمينه في backticks بحيث يتم تضمين الإخراج كجزء من الأمر (قد ترى أيضًا هذا $(uname -r) 
  • /something/q يقول توقف عندما تتطابق مع "شيء ما" (في هذه الحالة ، شيء ما هو الناتج uname -r) - ال / تحيط تعبير العادية
  • p هي الطباعة
  • ال ; هو الأمر separtor ، لذلك /something/q;p يقول استقال عند مطابقة شيء ، آخر الطباعة

تماما، sed -n '/'`uname -r`'/q;p' تتم طباعة الخطوط حتى تتطابق مع اسم kernel الحالي.

إذا كنت بجنون العظمة (مثلي) ، يمكنك جعل الجزء الأخير xargs echo sudo apt-get -y purge بحيث تتم طباعة الأمر لتطهير الحواف القديمة ، يمكنك التحقق من عدم تضمين أي شيء غير متوقع قبل تشغيله.


نسخة معدلة لإزالة الرؤوس:

dpkg --list | grep 'linux-image' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge
dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge

لاحظ ال sed يتم تعديل الاحتجاج. "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")" يستخرج الإصدار فقط (على سبيل المثال "3.2.0-44") ، بدون "-generic" أو ما شابه من uname -r


نسخة الكل في واحد لإزالة الصور والرؤوس (يجمع بين النسختين أعلاه):

echo $(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p') $(dpkg --list | grep linux-headers | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p') | xargs sudo apt-get -y purge

262



لاحظ أنه من الخطير أن تطابق إصدار النواة الحالي كتعبير عادي مثل: النقاط تطابق أي حرف و 3.1.2-23 يتطابق مع 3.1.2-2 (أو هو بطريقة أخرى). انظر أيضا بلدي إجابة. - jarno
إليك إصدار all-in-one مضبوط: sudo apt-get purge $(for tag in "linux-image" "linux-headers"; do dpkg-query -W -f'${Package}\n' "$tag-[0-9]*.[0-9]*.[0-9]*" | sort -V | awk 'index($0,c){exit} //' c=$(uname -r | cut -d- -f1,2); done) انظر أيضا بلدي إجابة. - jarno
jarno التي ساعدتني على تمديد كبير جدا ... مجد لبطانة واحدة - Clain Dsilva
بسبب تبعيات غير ملباة ، كنت بحاجة لاستخدامها مع dkpg -Pفي حين أن. هنا هو النسخة الكاملة: dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo dpkg -P - Sebastian Sastre
لا تفعل هذا! "يبدو هذا الخط الجانبي خطيرًا بعض الشيء ، ولكن من المؤكد أن 220 شخصًا لا يمكن أن يكونوا مخطئين!" فكرت في نفسي ونسخت بشكل أعمى. إعادة تمهيد ، مباشرة إلى GRUB. هذا الأمر مسحت كل حبيبي ، بما في ذلك تلك التي كنت أستخدمها. ربما كنت أدير نواة حقيقية ، لا أتذكر حتى. تبحث حاليا في جميع أنحاء منزلي عن عصا USB لتثبيت Ubuntu Live CD على :( - Andreas Jansson


Ubuntu 16.04+:

$ sudo apt autoremove
...
The following packages will be REMOVED:
  linux-headers-4.4.0-57 linux-headers-4.4.0-57-generic linux-image-4.4.0-57-generic linux-image-extra-4.4.0-57-generic linux-tools-4.4.0-57 linux-tools-4.4.0-57-generic

أوبونتو 15.10 وأدناه:

أجد أن هذا هو أسهل وأسرع طريقة. يحافظ على أحدث النواة بالإضافة إلى اثنين آخرين:

sudo apt-get install bikeshed
sudo purge-old-kernels

لتغيير عدد النواة الإضافية التي يتم الاحتفاظ بها:

sudo purge-old-kernels --keep 3

55



هذا الأمر هو نص برمجي ، موقع يمكنك العثور عليه which purge-old-kernels. - jarno
سعيد أنها جعلت هذا أسهل كثيرا في 16.04! آمل أن تستمر هذه الإجابة في التقدم ... - Toby J
على أوبونتو 16.04 لدي purge-old-kernels بدون بيكيشيدأدوات مفيدة عشوائية لا تملك حتى الآن منزل دائم) حزمة أو أي واحد معين. تجنب استخدام apt-get -y الخيار ، هو مثل إغلاق العينين وتأمل كل شيء سيكون على ما يرام. أيضا هنا هكذا autoremove يقرر عدد الحبيبات القديمة للحفاظ عليها. - Pablo Bianchi
في 16.04 يتم توفير حواف تطهير القديمة من قبل حزمة byobu (تلميح: apt-file search purge-old-kernels). وافق على apt-get -y، سأزيلها. - bmaupin
Dan منذ أن كنت لا تستخدم إصدارات غير LTS لم أكن متأكدة بالضبط عندما بدأت. ولكن يمكنني أن أقول على وجه اليقين ذلك sudo apt-get autoremove لا يزيل الحبيبات في 14.04. لا تتردد في تحديث الإجابة بالإصدار المحدد إذا كنت تعرف ما هو! - bmaupin


إزالة الإدخالات من Grub 2 يجب إزالة الإدخالات عن طريق تحرير أو إزالة الملفات في المجلد /etc/grub.d. الملف /boot/grub/grub.cfg للقراءة فقط ولا يتطلب تحريره عادةً.

حشرات كثيرة جدا؟ 

  • إذا لم تكن متأكدًا من النواة التي تستخدمها حاليًا ، في نوع المحطة الطرفية uname -r.

  • ستقوم Kernels التي تمت إزالتها عبر APT (Synaptic ، "apt-get remove" ، إلخ) بتحديث grub.cfg تلقائيًا ولا يلزم إجراء المستخدم.

  • أداة رائعة لإزالة النواة (وإدخالات القائمة) هي Ubuntu-Tweak ، وهو تطبيق GUI آمن وسهل الاستخدام.

  • تثبيت قرص أوبونتو

  • سيكون Ubuntu-Tweak متاحًا تحت التطبيقات> أدوات النظام.

إزالة إدخالات Kernel الأقدم

  • حدد "حزمة الأنظف" على اليسار و "Clean Kernel" من اللوحة اليمنى.

  • اضغط على زر "إلغاء القفل" في الجزء السفلي الأيمن ، أدخل كلمة المرور الخاصة بك.

  • اختر من القائمة المعروضة الصور والرؤوس النواة التي ترغب في إزالتها. النواة المستخدمة غير مدرجة.

  • اضغط على الزر "تنظيف" في الجزء السفلي الأيمن لإزالة الصور والرؤوس kernel المحددة.

قم بإزالة أنظمة التشغيل من قائمة Grub

  • سيتم أيضًا إزالة أنظمة التشغيل الأخرى التي تمت إزالتها من الكمبيوتر من القائمة بمجرد تشغيل "grub التحديث" كجذر.

  • يتم وضع عناصر القائمة في قائمة Grub2 بواسطة البرامج النصية. إذا كنت لا تريد إدخال أنظمة تشغيل أخرى في القائمة ، فقم بتعطيل /etc/grub.d/30_osprober

  • قم بتشغيل هذا الأمر لإيقاف تشغيل البرنامج النصي
    sudo chmod -x /etc/grub.d/30_os-prober 

  • DISABLE_30_OS-PROBER = 'true' في / etc / default / grub

قم بإزالة Memtest86 + من قائمة Grub
sudo chmod -x /etc/grub.d/20_memtest86+

  • قم بتشغيل الأمر update-grub للسماح بتضمين التغييرات في grub.cfg

مصدر 

ملحوظة: بعد تحديث kernel ، يتم إضافة إدخال جديد إلى قائمة GRUB. يمكنك إزالة القائمة القديمة إذا كنت ترغب في ذلك. ومع ذلك ، فإن معظم المستخدمين ذوي الخبرة سوف ينصحون بالاحتفاظ بعلبة إدخال واحدة على الأقل في حالة حدوث خطأ ما أثناء الترقية ، وتحتاج إلى تشغيل إصدار kernel قديم لأغراض استكشاف الأخطاء وإصلاحها.

طريقة بديلة لإزالة إدخالات النواة (قبل 10.04) 

لـ GRUB وليس GRUB2

مدير بدء التشغيل  Install startupmanager

يمكنك العثور عليها ضمن نظام >> الإدارة >> alt text
alt text
ترى في الصورة الثانية يمكنك تحديد عدد الحبيبات لإظهار؟ عموما أنا فقط احتفظ بها في 1 ، ولكن عندما أحصل على ترقية kernel ، أقوم دائمًا بتغييرها إلى 2 قبل إعادة التشغيل حتى أتمكن من تحديد النواة القديمة إذا كانت النواة الجديدة تعاني من مشاكل في جهازي. بمجرد أن أعرف أن النواة الجديدة تعمل بشكل جيد أقوم بتغييرها إلى 1.


41



في الواقع ، dentupmanager dint أعطني نافذة مثل هذا على Ubuntu 10.04 ، بدلا من ذلك أعطى مجرد نافذة مع اثنين من علامات التبويب -> خيارات التمهيد والمتقدمة .. وفي وقت متقدم أنه لديك خيار للحد من عدد الحبات. لذا يرجى تحديث الإجابة على Ubuntu 10.04. (وهذا هو السبب في أني صوتت بهذا ..) - Sen
يمكن تعريف أي فكرة كيف يمكن تحديد "عدد النواة للحفاظ على" على الجهاز الذي ليس لديه واجهة المستخدم الرسومية المثبتة (الخادم)؟ - sylvainulg
startupmanager قديم. نرى GRUP-مخصص - muhasturk


سطر أوامر محض ، سيؤدي هذا إلى إزالة كل ما عدا التيار الحالي والثاني (عبر "-2" في الأمر الرئيسي أدناه):

OLD=$(ls -tr /boot/vmlinuz-* | head -n -2 | cut -d- -f2- |
    awk '{print "linux-image-" $0 " linux-headers-" $0}' )
if [ -n "$OLD" ]; then
    apt-get -qy remove --purge $OLD
fi
apt-get -qy autoremove --purge

38



واحد من الخطوط هناك: dpkg -l linux-* | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | xargs sudo apt-get -y purge - Dmitry Verkhoturov
DmitryPaskal ، يجب إضافة هذا كإجابة جديدة. - saji89
DmitryPaskal كما هو الحال دائمًا ، لا تنسخ هذه العناصر دون فهمها. على جهازي تتطابق هذه البطانة linux-libc-dev:amd64 التي لا ينبغي إزالتها. - jamesadney
Kees كوك ، ألا يجب أن تكون حجة awk محاطًا بعلامات اقتباس مفردة؟ إذا كان هدفك هو إرفاق "linux-image-" بشكل مسبق بالخطوط التي تم توصيلها بالأنابيب ، فإن هذا يبدو أنه يعمل فقط إذا كنت تستخدم awk '{print "linux-image-" $0}'. - Mark
هذا لا يعمل بالنسبة لي ، ويشمل النواة المثبتة المخصصة الخاصة بي (أوبونتو 14.04 مع 3.17) - Alex R


تحديث: purge-old-kernels هو إهمال الوقت الحاضر.

لقد صنعت سيناريو لتطهير الحبيبات حتى في ظروف صعبة. تسمى linux-purge ويمكنك العثور عليها هنا.

إذا كنت ترغب فقط في تطهير النواة (والحزم ذات الصلة) والتي تكون أقدم من النواة المستخدمة حاليًا ، عندما لا يتم كسر النظام ، يمكنك استخدام هذا البرنامج النصي.

هناك أيضا صفحة وثائق Ubuntu التي ساهمت فيها فيما يتعلق بإزالة الحبيبات القديمة هنا.


34



يشبه purge-old-kernels ليس في النسخة الدقيقة (1.22) من bikeshed. هل هناك طريقة معقولة / آمنة للحصول على أحدث bikeshed لدقيقة؟ أو سيكون من الأسهل / الأكثر أمانا تثبيت البرنامج النصي فقط؟ أفضل استخدام repo على الرغم من قائمة طويلة من التبعيات .. - drevicko
drevicko انظر هنا. - jarno
سؤال واحد أكثر عرضية بشكل طفيف: عدم الذهاب إلى المصدر ، هل هناك طريقة لتحديد الأوامر التي تصبح متاحة عند تثبيت bikeshed؟ - drevicko
drevicko ، بالتأكيد ، dlocate -lsbin bikeshed - jarno
drevicko ، انظر أيضًا سؤال آخر - jarno


يمكنك اتباع باستخدام قسم حزمة "الترقيات غير المراقب" من تحديثات تلقائية للأمان مقالة حول Ubuntu Wiki للقيام بذلك.

يجب عليك تغيير السطر التالي في /etc/apt/apt.conf.d/50unattended-upgrades ملف؛

//Unattended-Upgrade::Remove-Unused-Dependencies "false";

مع

Unattended-Upgrade::Remove-Unused-Dependencies "true";

لإزالة الحزم القديمة تلقائيًا ، بما في ذلك الحِبار.

أيضا إزالة أو تعليق الخط

"^linux-image.*"; 

في قسم "NeverAutoRemove" بالملف /etc/apt/apt.conf.d/01autoremove.


29



لقد فعلت هذا ولكن كان لا يزال يجمع 3+ حبات قديمة تستهلك 100 من MBs. لذلك أضفت apt-get autoremove إلى وظيفتي كرون اليومية التي تقوم بالفعل بالترقيات ، لأنها لا تمر دائمًا عبر مدير التحديث المدمج. - Marcos
أعتقد أن هذا يعمل في Trusty فقط للنواة التي تم تثبيتها تلقائيًا. - jarno
هذا شيء عظيم لمنع تراكم الحواف القديمة عند حزم الترقية التلقائية ، على سبيل المثال ، مع ترقيات غير المراقب. ومع ذلك ، إذا لم تقم بإعادة التشغيل ، فقد تجد أن الحزمة الخاصة بـ تعمل حاليا النواةتم إلغاء تثبيته! هناك مشكلة واحدة يمكن أن يتسبب بها هذا الأمر: قد لا تعمل الأجهزة الجديدة التي تقوم بتوصيلها ، لأن الوحدة النمطية الخاصة بهم لا يمكن تحميلها بسرعة ، لأنها لم تعد موجودة على القرص. (حل سريع لهذا فقط لتثبيت حزمة kernel مرة أخرى ، ومن ثم افصل الجهاز وإعادة تركيبه.) - joeytwiddle
صنعت حل تلقائي إلى القضية المذكورة أعلاه. إذا كنت تعتقد أن هذا نهج جيد ، فلا تتردد في إضافته إلى إجابة Qwerty. - joeytwiddle