بازگشت به وبلاگ‌ها
ساخت سیستم به‌روزرسانی OTA امن برای Linux جاسازی شده: مهندسی سیستم‌های عمیق

ساخت سیستم به‌روزرسانی OTA امن برای Linux جاسازی شده: مهندسی سیستم‌های عمیق

۱۴۰۴/۹/۲۷12 دقیقه
embeddedlinuxotasystemscsecurity

چالش

در Batna، وظیفه حل یکی از مهم‌ترین مشکلات در سیستم‌های جاسازی شده را داشتم: چگونه هزاران دستگاه در میدان را بدون دسترسی فیزیکی به‌صورت امن و قابل اعتماد به‌روزرسانی کنید؟ این فقط درباره push کردن کد نبود—درباره ساخت سیستمی بود که بتواند:

  • دستگاه‌ها را از طریق اتصالات شبکه غیرقابل اعتماد به‌روزرسانی کند

  • یکپارچگی داده را تضمین کند و از corruption جلوگیری کند

  • در صورت شکست به‌روزرسانی‌ها، به‌صورت ایمن rollback کند

  • downtime را در طول به‌روزرسانی‌ها به حداقل برساند

  • با منابع محدود (حافظه، CPU، ذخیره‌سازی) کار کند

  • با قطع برق به‌صورت graceful برخورد کند
  • درک نیازمندی‌ها

    محدودیت‌های دستگاه

    دستگاه‌های Linux جاسازی شده که با آن‌ها کار می‌کردیم داشتند:

  • RAM محدود (128-256MB)

  • ذخیره‌سازی محدود (2-4GB eMMC)

  • اتصال شبکه غیرقابل اعتماد

  • منبع تغذیه تضمین شده نیست

  • سخت‌افزار سفارشی با درایورهای تخصصی
  • نیازمندی‌های امنیتی

  • به‌روزرسانی‌ها باید به‌صورت رمزنگاری امضا شوند

  • هیچ تغییر غیرمجازی مجاز نیست

  • کانال‌های ارتباطی امن (TLS)

  • قابلیت rollback برای به‌روزرسانی‌های ناموفق

  • Audit trail برای تمام عملیات به‌روزرسانی
  • معماری سیستم

    یک معماری سه لایه طراحی کردم:

    ┌─────────────────────────────────────────┐
    │ سرور به‌روزرسانی (Cloud) │
    │ - تولید بسته │
    │ - مدیریت امضا │
    │ - توزیع به‌روزرسانی │
    │ - ردیابی دستگاه │
    └──────────────┬──────────────────────────┘
    │ HTTPS/TLS

    ┌─────────────────────────────────────────┐
    │ Agent به‌روزرسانی (دستگاه) │
    │ - بررسی به‌روزرسانی │
    │ - مدیریت دانلود │
    │ - تأیید │
    │ - هماهنگی نصب │
    └──────────────┬──────────────────────────┘


    ┌─────────────────────────────────────────┐
    │ لایه سیستم (Linux) │
    │ - پارتیشن‌های dual-boot │
    │ - یکپارچه‌سازی bootloader │
    │ - به‌روزرسانی kernel و rootfs │
    └─────────────────────────────────────────┘

    جزئیات پیاده‌سازی

    1. خط لوله تولید بسته

    یک خط لوله CI/CD مبتنی بر Jenkins ساختم که:

  • ساخت image سیستم

  • ایجاد بسته‌های به‌روزرسانی با به‌روزرسانی‌های delta

  • امضای بسته‌ها با RSA-2048

  • تولید metadata (نسخه، checksum، وابستگی‌ها)

  • آپلود به سرور توزیع
  • 2. Agent به‌روزرسانی (سمت کلاینت)

    Agent به‌روزرسانی به‌عنوان یک سرویس systemd روی هر دستگاه اجرا می‌شد.

    3. دانلود امن با Resume

    قطع شبکه‌ها رایج بود، بنابراین دانلودهای قابل ازسرگیری پیاده‌سازی کردم.

    4. تأیید امضا

    هر بسته به‌روزرسانی با RSA-2048 امضا می‌شد.

    5. استراتژی پارتیشن Dual-Boot

    برای فعال‌سازی rollback ایمن، یک طرح dual-boot partition پیاده‌سازی کردم.

    فرآیند به‌روزرسانی:

  • دانلود به‌روزرسانی به پارتیشن standby (B)

  • تأیید امضا و checksum

  • به‌روزرسانی bootloader برای اشاره به پارتیشن B

  • Reboot به پارتیشن B

  • در صورت موفقیت، علامت‌گذاری B به‌عنوان active

  • در صورت شکست، bootloader به‌صورت خودکار پارتیشن A را boot می‌کند
  • 6. بهینه‌سازی‌های Kernel

    بهینه‌سازی‌های عمیق kernel برای برآورده کردن نیازمندی‌های سخت‌افزاری انجام دادم.

    نتایج و تأثیر

    معیارها

  • نرخ موفقیت به‌روزرسانی: 99.2%

  • میانگین زمان به‌روزرسانی: 8-12 دقیقه (بسته به شبکه)

  • زمان Rollback: کمتر از 2 دقیقه

  • صفر از دست دادن داده: تمام به‌روزرسانی‌ها atomic

  • امنیت: صفر به‌روزرسانی غیرمجاز
  • درس‌های آموخته شده

  • عملیات atomic حیاتی هستند - به‌روزرسانی‌ها باید all-or-nothing باشند تا از corruption جلوگیری شود

  • مقاومت بر سرعت - بهتر است کند و قابل اعتماد باشیم تا سریع و شکننده

  • تست سناریوهای شکست - بیشتر باگ‌ها در موارد لبه ظاهر می‌شوند، نه مسیرهای happy

  • تنظیم kernel مهم است - بهینه‌سازی‌های کوچک می‌توانند تفاوت بین کار کردن و کار نکردن را ایجاد کنند
  • نتیجه‌گیری

    ساخت سیستم به‌روزرسانی OTA در Batna یک غوطه‌وری عمیق در مهندسی سیستم بود. نیاز به درک همه چیز از kernel داخلی تا پروتکل‌های شبکه، از امضاهای رمزنگاری تا مکانیک bootloader داشت. سیستمی که ساختم با موفقیت هزاران دستگاه در میدان را با نرخ موفقیت 99.2% و صفر از دست دادن داده به‌روزرسانی کرد.

    ---

    علاقه‌مند به سیستم‌های جاسازی شده، به‌روزرسانی‌های OTA، یا بهینه‌سازی kernel؟ بیایید ارتباط برقرار کنیم!