انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: چطور کرنل رو پچ کنم (حل شد)  (دفعات بازدید: 4135 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین مجتبی باغبان

  • Hero Member
  • *
  • ارسال: 780
  • جنسیت : پسر
چطور کرنل رو پچ کنم (حل شد)
« : 27 بهمن 1401، 05:37 ب‌ظ »
لپ‌تاپم بعد از بیدار شدن از حالت sleep هنگ می‌کنه که توی ویکی آرچ لینوکس مشکل و راه حلش رو توضیح داده که باید کرنل رو پچ کنم و بلد نیسنم. متن ویکی آرچ رو اینجا میذارم.
Freeze after wake from sleep/suspend with Alder Lake-P
Users with Alder Lake-P 12th gen mobile processor laptops from various vendors experienced freeze and black-screen after waking up from suspending. It is because many laptop vendors ship an incorrect VBT (Video BIOS Table) that wrongly describe the actual ports connected to the iGPU. Considering most vendors will not publish a BIOS update for a laptop with a properly working Windows OS, Linux users could only address the issue on the kernel side. You can mitigate the issue by patching and rebuilding the kernel as a temporary remedy:
drivers/gpu/drm/i915/display/intel_display.c.patch
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -8835,7 +8835,7 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv)
                intel_ddi_init(dev_priv, PORT_TC1);
        } else if (IS_ALDERLAKE_P(dev_priv)) {
                intel_ddi_init(dev_priv, PORT_A);
-               intel_ddi_init(dev_priv, PORT_B);
+               // intel_ddi_init(dev_priv, PORT_B);
                intel_ddi_init(dev_priv, PORT_TC1);
                intel_ddi_init(dev_priv, PORT_TC2);
                intel_ddi_init(dev_priv, PORT_TC3);
البته من از مانجارو با کرنل 6.1.12-1-MANJARO استفاده می‌کنم
« آخرین ویرایش: 05 اسفند 1401، 04:32 ق‌ظ توسط مجتبی باغبان »

آفلاین مجتبی باغبان

  • Hero Member
  • *
  • ارسال: 780
  • جنسیت : پسر
پاسخ : چطور کرنل رو پچ کنم
« پاسخ #1 : 28 بهمن 1401، 03:52 ب‌ظ »
ممنون میشم اگه کسی بلد است راهنماییم کنه.

آفلاین saleh143

  • Full Member
  • *
  • ارسال: 198
پاسخ : چطور کرنل رو پچ کنم
« پاسخ #2 : 28 بهمن 1401، 04:23 ب‌ظ »
من شبیه این مشکلو داشتم نمیدونم بدرد شما بخوره یا نه
اینجا توضیحاتش هست :
https://forum.ubuntu-ir.org/index.php?topic=155240

آفلاین مجتبی باغبان

  • Hero Member
  • *
  • ارسال: 780
  • جنسیت : پسر
پاسخ : چطور کرنل رو پچ کنم
« پاسخ #3 : 28 بهمن 1401، 06:00 ب‌ظ »
مشکل ربطی به میزکار یا توزیع نداره. مشکل دقیقا همون چیزی است که ویکی آرچ توضیح داده.

آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5124
  • جنسیت : پسر
پاسخ : چطور کرنل رو پچ کنم
« پاسخ #4 : 29 بهمن 1401، 05:42 ب‌ظ »
به نظر میاد این پچ فقط یه سری تغییر توی ماژول i915 (که در واقع درایور گرافیک‌های اینتل هست) میده.

به همین دلیل به نظرم بهتره به جای اینکه کل کرنل رو دوباره کامپایل کنید، فقط ماژول i915 رو پچ و دوباره کامپایل کنید.

البته گزینه اصولی اینه که این پچ توسط خود توسعه‌دهنده‌های کرنل انجام بشه. ولی تا اون موقع می‌تونید با یه نسخه پچ شده ماژول i915 مشکل رو حل کنید.
میدونید که زکات علم نشر آن است

آفلاین مجتبی باغبان

  • Hero Member
  • *
  • ارسال: 780
  • جنسیت : پسر
پاسخ : چطور کرنل رو پچ کنم
« پاسخ #5 : 29 بهمن 1401، 06:07 ب‌ظ »
ممنون از پاسختون. می‌تونید بگید روش کار چطوریه یا لینکی معرفی کنید که خودم مطالعه کنم؟

آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5124
  • جنسیت : پسر
پاسخ : چطور کرنل رو پچ کنم
« پاسخ #6 : 30 بهمن 1401، 08:30 ب‌ظ »
مرحله اول این هست که کد منبع کرنل فعلی رو دریافت کنید.
توی دبیان که یه بسته به اسم kernel-source وجود داره که با نصب اون، همیشه کد منبع آخرین کرنل موجود توی مخازن دریافت میشه. (به صورت فشرده)
توی مانجارو چنین بسته‌ای وجود داره؟
« آخرین ویرایش: 30 بهمن 1401، 08:33 ب‌ظ توسط Dragon- »
میدونید که زکات علم نشر آن است

آفلاین مجتبی باغبان

  • Hero Member
  • *
  • ارسال: 780
  • جنسیت : پسر
پاسخ : چطور کرنل رو پچ کنم
« پاسخ #7 : 30 بهمن 1401، 09:35 ب‌ظ »
همچین بسته‌ای نه گشتم نبود. احتمالا باید توی فروم مانجارو پست بذارم ببینم بقیه چیکار کردن

آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5124
  • جنسیت : پسر
پاسخ : چطور کرنل رو پچ کنم
« پاسخ #8 : 01 اسفند 1401، 02:26 ق‌ظ »
یکم گشتم و آخر کار به اینجا رسیدم:
https://gitlab.manjaro.org/packages/core/linux61

با خوندن PKGBUILD فکر کنم باید این شکلی پیش برید:

اول این بسته‌ها رو نصب کنید:
base-devel bc libelf pahole git inetutils wget

بعد یه دایرکتوری بسازید که کار‌ها رو داخل اون انجام بدید. برای مثال یه دایرکتوری به اسم kernelbuild توی هوم خودتون بسازید:
mkdir ~/kernelbuild

حالا برید داخل دایرکتوری kernelbuild
cd ~/kernelbuild

این مخزن رو با git کلون کنید:
https://gitlab.manjaro.org/packages/core/linux61

git clone https://gitlab.manjaro.org/packages/core/linux61.git

الان باید یه دایرکتوری به اسم linux61 داشته باشید. واردش بشید:
cd linux61

یه فایل به اسم intel-vbt.patch بسازید و همون محتوای پچ که توی ارسال اول گذاشتید رو داخلش کپی کنید.

الان باید یکم فایل PKGBUILD رو ویرایش کنید تا درست کار بده.
با هر ویرایشگر متن که می‌دونید، فایل رو باز کنید.

قبل از تابع ()prepare و بعد از آرایه sha256sums دوتا تابع به اسم‌های msg و msg2 به این شکل تعریف کنید تا مشکلی ایجاد نشه:
msg() {
      echo "$@"
}

msg2() {
      msg "$@"
}

خود تابع ()prepare رو هم باید کمی ویرایش کنید.
توی تابع ()prepare، خط زیر رو پیدا کنید:
patch --ignore-whitespace --fuzz 3 -p1 < "../0999-acs.gitpatch"

پایین اون خط، این عبارت رو بنویسید:
patch -p1 -i ../intel-vbt.patch

یه پردازش جدید از bash با محیط تازه باز کنید تا توی اون، فایل PKGBUILD رو سورس کنید.
env bash

فایل PKGBUILD رو توی پوسته فعلی source کنید.
source PKGBUILD

حالا باید کد منبع کرنل رو دریافت کنید:
wget https://git.kernel.org/torvalds/t/linux-${_basekernel}.tar.gz
اینکار ممکنه یکم طول بکشه.

بعد که دانلود انجام شد، اون رو استخراج کنید
tar -xvf linux-${_basekernel}.tar.gz

حالا باید یه دایرکتوری جدید با اسم linux-6.1 ساخته شده باشه.

الان پچ مربوط به نسخه 6.1.12 کرنل رو دریافت کنید:
wget https://www.kernel.org/pub/linux/kernel/v6.x/patch-${pkgver}.xz

اون رو استخراج کنید:
unxz -k patch-${pkgver}.xz

باید یه فایل به اسم patch-6.1.12 داشته باشید.

الان باید همه چیز‌ها آماده باشه. prepare رو بزنید تا کار پچ کردن و تنظیم پیکربندی‌های کرنل شروع بشه:
prepare

اگه مرحله قبل با موفقیت انجام شد، ماژول i915 رو بسازید:
make LOCALVERSION= M=drivers/gpu/drm/i915
بین LOCALVERSION و M فاصله هست. غلط املایی وجود نداره.

بعد از این مرحله، ماژول جدید i915 باید توی دایرکتوری زیر موجود باشه:
~/kernelbuild/linux61/linux-6.1/drivers/gpu/drm/i915

تا اینجا رو انجام بدید تا بقیش رو بگم.
« آخرین ویرایش: 05 اسفند 1401، 05:26 ب‌ظ توسط Dragon- »
میدونید که زکات علم نشر آن است

آفلاین مجتبی باغبان

  • Hero Member
  • *
  • ارسال: 780
  • جنسیت : پسر
پاسخ : چطور کرنل رو پچ کنم
« پاسخ #9 : 01 اسفند 1401، 03:02 ب‌ظ »
ممنون بابت این همه زمانی که گذاشتید. توی مرحله prepare این خطا رو داد.
patching file drivers/pci/quirks.c
Hunk #1 succeeded at 194 (offset 1 line).
Hunk #2 succeeded at 5081 (offset 30 lines).
can't find file to patch at input line 4
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|drivers/gpu/drm/i915/display/intel_display.c.patch
|--- a/drivers/gpu/drm/i915/display/intel_display.c
|+++ b/drivers/gpu/drm/i915/display/intel_display.c
--------------------------
File to patch:

آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5124
  • جنسیت : پسر
پاسخ : چطور کرنل رو پچ کنم
« پاسخ #10 : 01 اسفند 1401، 09:09 ب‌ظ »
اونجا که عبارت patch -p0 -i ../intel_vbt.patch اضافه کردید رو تغییر بدید.
باید جلوی p-، عدد 0 رو به 1 تغییر بدید.

یه بار دیگه فایل PKGBUILD رو باید ویرایش کنید. این بار توی تابع prepare هر جا دستور patch دیدید، یه آپشن N- هم بهش اضافه کنید.
البته دومین دستور patch که توی یه حلقه for هست، نیازی نداره. چون خود یه N- داره.

بعد پوسته رو ببندید و دوباره برید توی دایرکتوری linux61
اونجا دوباره یه پوسته جدید با محیط تازه باز کنید که کار‌ها رو داخلش انجام بدید:
env bash

بعد فایل PKGBUILD رو دوباره source کنید:
source PKGBUILD

و در نهایت prepare رو بزنید:
prepare

اگه با موفقیت انجام شد، ادامه مراحل رو برید.
میدونید که زکات علم نشر آن است

آفلاین مجتبی باغبان

  • Hero Member
  • *
  • ارسال: 780
  • جنسیت : پسر
پاسخ : چطور کرنل رو پچ کنم
« پاسخ #11 : 01 اسفند 1401، 10:15 ب‌ظ »
این کارهایی که گفتید رو کردم ولی این بار توی مرحله پچ کردن خطا میداد که با این دو کار رفع شد. یکی اینکه توی فایل پچ عدد ۸۸۳۵ رو به ۷۹۱۱ تعییر دادم و یکی اینکه محتوای پچ رو از خود فایل intel_dispaly.c کپی کردم که مشکلات فاصله و تب باعث شکست خوردن عمل پچ نشه. حالا دستور بعدی که make است رو زدم و این خطا رو داده:
MODPOST drivers/gpu/drm/i915/Module.symvers
WARNING: Module.symvers is missing.
         Modules may not have dependencies or modversions.
         You may get many unresolved symbol warnings.
WARNING: modpost: "vga_switcheroo_client_probe_defer" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "ttm_bo_vm_dummy_page" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "drm_mode_is_420_also" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "drm_dp_downstream_max_dotclock" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "xa_erase" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "drm_dp_mst_topology_mgr_set_mst" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "drm_atomic_state_init" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "drm_atomic_set_fb_for_plane" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "drm_dp_channel_eq_ok" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "sysfs_create_link" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: suppressed 1342 unresolved symbol warnings because there were too many)
  CC [M]  drivers/gpu/drm/i915/i915.mod.o
make[1]: *** No rule to make target 'scripts/module.lds', needed by 'drivers/gpu/drm/i915/i915.ko'.  Stop.
make: *** [Makefile:1922: modules] Error 2

آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5124
  • جنسیت : پسر
پاسخ : چطور کرنل رو پچ کنم
« پاسخ #12 : 02 اسفند 1401، 12:10 ق‌ظ »
برید داخل دایرکتوری linux61 و بعد linux-6.1
اونجا یه make clean بزنید تا فایل‌هایی که از کامپایل نا موفق قبل باقی موندن پاک بشن.

الان اینها رو به ترتیب بزنید
make scripts
make modules_prepare

در نهایت دوباره سعی کنید ماژول i915 رو کامپایل کنید:
make LOCALVERSION= M=drivers/gpu/drm/i915

دیگه لازم نیست فایل PKGBUILD رو source کنید.
میدونید که زکات علم نشر آن است

آفلاین مجتبی باغبان

  • Hero Member
  • *
  • ارسال: 780
  • جنسیت : پسر
پاسخ : چطور کرنل رو پچ کنم
« پاسخ #13 : 02 اسفند 1401، 12:18 ق‌ظ »
انجام دادم. آخرش این هشدارها رو داد و تموم شد.
  MODPOST drivers/gpu/drm/i915/Module.symvers
WARNING: Module.symvers is missing.
         Modules may not have dependencies or modversions.
         You may get many unresolved symbol warnings.
WARNING: modpost: "vga_switcheroo_client_probe_defer" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "ttm_bo_vm_dummy_page" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "drm_mode_is_420_also" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "drm_dp_downstream_max_dotclock" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "xa_erase" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "drm_dp_mst_topology_mgr_set_mst" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "drm_atomic_state_init" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "drm_atomic_set_fb_for_plane" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "drm_dp_channel_eq_ok" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: "sysfs_create_link" [drivers/gpu/drm/i915/i915.ko] undefined!
WARNING: modpost: suppressed 1342 unresolved symbol warnings because there were too many)
  CC [M]  drivers/gpu/drm/i915/i915.mod.o
  LD [M]  drivers/gpu/drm/i915/i915.ko
  BTF [M] drivers/gpu/drm/i915/i915.ko
Skipping BTF generation for drivers/gpu/drm/i915/i915.ko due to unavailability of vmlinux
  CC [M]  drivers/gpu/drm/i915/kvmgt.mod.o
  LD [M]  drivers/gpu/drm/i915/kvmgt.ko
  BTF [M] drivers/gpu/drm/i915/kvmgt.ko
Skipping BTF generation for drivers/gpu/drm/i915/kvmgt.ko due to unavailability of vmlinux

آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5124
  • جنسیت : پسر
پاسخ : چطور کرنل رو پچ کنم
« پاسخ #14 : 02 اسفند 1401، 11:05 ق‌ظ »
کامپایل با موفقیت انجام شده.
اون اخطار‌ها رو نادیده بگیرید. دلیلش این هست که نمی‌تونه بیشتر توابعی که توی کد درایور استفاده شده رو پیدا کنه. دلیلش هم این هست که فقط یه قسمت کرنل رو دارید کامپایل می‌کنید، نه همه اون رو. اگه همه کرنل رو کامپایل کنید، این اخطار‌ها رو هم نمی‌گیرید.

علاوه بر ماژول i915، یه ماژول دیگه به اسم kvmgt هم ساخته شده. انگار اون مربوط این هست که یه گرافیک مجازی به ماشین‌های مجازی بدید. فکر نکنم به درد شما بخوره.
هر چند این ماژول هنوز از گرافیک شما پشتیبانی نمی‌کنه. (حداکثر از گرافیک‌هایی که همراه پردازنده‌های نسل ۱۰ هستند پشتیبانی می‌کنه.)

الان باید ماژول رو کپی کنید توی جای درست.
البته قبلش ببینید ماژول‌های همراه کرنل فشرده هستند یا نه. اگه فشرده هستند، لازم هست شما هم ماژول رو فشرده کنید. تا جایی که یادمه، ماژول‌های کرنل آرچ لینوکس فشرده هستند. پیکربندی این کرنل رو دیدم، ماژول‌های اون با zstd فشرده میشن.

خروجی این دستور رو بذارید
ls -l /lib/modules/$(uname -r)/kernel/drivers/gpu/drm/i915
میدونید که زکات علم نشر آن است