انتشار تازه را با نیاز نگهداری تطبیق دهید

یادداشت رسمی اوبونتو، انتشار نسخهٔ ۲۶٫۱۰ را در ۱۵ اکتبر ۲۰۲۶ و دورهٔ پشتیبانی آن را نه ماه، تا ژوئیهٔ ۲۰۲۷ اعلام می‌کند. در بازبینی ۲۷ اکتبر، این اطلاعات مبنای مقاله است. تازه‌بودن شمارهٔ نسخه به‌تنهایی دلیل مهاجرت یک سرور پایدار نیست. پیش از تصمیم، عمر پشتیبانی مورد نیاز، سخت‌افزار، نرم‌افزارهای نصب‌شده و پنجرهٔ نگهداری سازمان را مشخص کنید.

نسخهٔ میان‌دوره‌ای و نسخهٔ دارای پشتیبانی بلندمدت، نقش یکسانی در برنامهٔ نگهداری ندارند. ممکن است یک تیم برای آزمودن سخت‌افزار یا تغییرات تازه به محیط میان‌دوره‌ای نیاز داشته باشد، در حالی که سرویس اصلی برنامهٔ دیگری بخواهد. این مقاله فهرست همهٔ قابلیت‌های نسخه نیست و ادعا نمی‌کند هر ماشین باید ارتقا پیدا کند. تمرکز بر ثبت وضعیت واقعی و آماده‌کردن شواهد تصمیم است.

موجودی واقعی و سیاست تاریخ‌دار

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

چهار فایل را کنار هم ذخیره و python -m unittest test_inventory.py را اجرا کنید. آزمون با متن نمونه، نقل‌قول‌ها، توزیع نامرتبط و پایان مهلت بازبینی کار می‌کند. روی محیط اوبونتوی آزمایش، python demo_inventory.py /etc/os-release را اجرا کنید. روی ویندوز می‌توانید مسیر یک فایل موجودیِ منتقل‌شده از محیط مجاز را بدهید؛ این کار به معنی اجرای خود اوبونتو یا آزمون ارتقای سیستم در ویندوز نیست.

گزارش باید نام توزیع، نسخه و تصمیم سیاست را نشان دهد و هیچ بسته‌ای نصب یا حذف نمی‌کند. پس از گرفتن موجودی، فهرست سرویس‌ها، مخزن‌های بسته، درایورها و وابستگی‌های برنامه را جدا ثبت کنید. مسیر بازیابی را با پشتیبان قابل بازگردانی آزمایش کنید و پیش از تغییر سرور اصلی، ورود، شبکه، ذخیره‌سازی و سرویس‌های زمان‌بندی‌شده را روی نسخهٔ هدف در محیط جدا بسنجید. نتیجهٔ یک آزمون واحد، پوشش همهٔ این موارد نیست.

فایل‌های کامل و قابل اجرا

چهار فایل زیر کامل‌اند؛ پیش‌نیاز، ترتیب اجرا و روش بررسی در متن آمده است. کدها خلاصه یا پنهان نشده‌اند.

1. فایل کامل os_inventory.py

این فایل را با همین نام و بدون حذف سطرها کنار بقیهٔ فایل‌ها ذخیره کنید.

import shlex


def parse_os_release(source):
    values = {}
    for line in source.splitlines():
        if not line.strip() or line.lstrip().startswith('#'):
            continue
        key, separator, raw = line.partition('=')
        if separator and key in {'ID', 'VERSION_ID', 'PRETTY_NAME'}:
            parts = shlex.split(raw)
            if len(parts) != 1:
                raise ValueError('Unexpected os-release value')
            values[key] = parts[0]
    if values.get('ID') != 'ubuntu' or not values.get('VERSION_ID'):
        raise ValueError('Expected an Ubuntu os-release inventory')
    return values

دستور اجرا، نتیجهٔ مورد انتظار و محدودیت این فایل در بخش اجرای مقاله توضیح داده شده است.

2. فایل کامل release_policy.json

این فایل را با همین نام و بدون حذف سطرها کنار بقیهٔ فایل‌ها ذخیره کنید.

{
  "reviewed": "2026-10-27",
  "reviewBy": "2026-11-10",
  "version": "26.10",
  "released": "2026-10-15",
  "supportUntilMonth": "2027-07",
  "releaseType": "interim",
  "source": "https://documentation.ubuntu.com/release-notes/26.10/"
}

دستور اجرا، نتیجهٔ مورد انتظار و محدودیت این فایل در بخش اجرای مقاله توضیح داده شده است.

3. فایل کامل demo_inventory.py

این فایل را با همین نام و بدون حذف سطرها کنار بقیهٔ فایل‌ها ذخیره کنید.

from datetime import date
import json
from pathlib import Path
import sys
from os_inventory import parse_os_release


def assess(inventory, policy, today):
    if not date.fromisoformat(policy['reviewed']) <= today <= date.fromisoformat(policy['reviewBy']):
        return 'review-policy-date'
    if inventory['VERSION_ID'] != policy['version']:
        return 'review-this-release-separately'
    return 'interim-release-plan-next-maintenance-window'


if __name__ == '__main__':
    inventory = parse_os_release(Path(sys.argv[1] if len(sys.argv) > 1 else '/etc/os-release').read_text(encoding='utf-8'))
    policy = json.loads(Path(__file__).with_name('release_policy.json').read_text())
    print(json.dumps({'inventory': inventory, 'assessment': assess(inventory, policy, date.today()), 'supportUntilMonth': policy['supportUntilMonth']}))

دستور اجرا، نتیجهٔ مورد انتظار و محدودیت این فایل در بخش اجرای مقاله توضیح داده شده است.

4. فایل کامل test_inventory.py

این فایل را با همین نام و بدون حذف سطرها کنار بقیهٔ فایل‌ها ذخیره کنید.

from datetime import date
import json
from pathlib import Path
import unittest
from os_inventory import parse_os_release
from demo_inventory import assess


class UbuntuTests(unittest.TestCase):
    def test_quoted_inventory(self):
        inventory = parse_os_release('ID=ubuntu\nVERSION_ID="26.10"\nPRETTY_NAME="Ubuntu 26.10"')
        policy = json.loads(Path(__file__).with_name('release_policy.json').read_text())
        self.assertIn('interim-release', assess(inventory, policy, date(2026, 10, 27)))
        self.assertEqual(assess(inventory, policy, date(2026, 11, 11)), 'review-policy-date')

    def test_other_distribution_is_not_guessed(self):
        with self.assertRaises(ValueError): parse_os_release('ID=debian\nVERSION_ID=13')


if __name__ == '__main__': unittest.main()

دستور اجرا، نتیجهٔ مورد انتظار و محدودیت این فایل در بخش اجرای مقاله توضیح داده شده است.

اجرای ابزار خواندنی و آماده‌کردن آزمون ارتقا

راهنمای رسمی ارتقا و محدودیت‌های همان نوع نصب را در روز تصمیم دوباره بخوانید؛ وضعیت مسیر ارتقا می‌تواند در طول چرخهٔ نسخه تغییر کند. به‌خصوص اگر رمزگذاری دیسک یا سخت‌افزار ویژه دارید، از اجرای کورکورانهٔ دستور عمومی خودداری کنید. انتشار موفق نیازمند معیار بازگشت، زمان‌بندی و کنترل سرویس پس از تغییر است. هدف این ابزار، جلوگیری از حدس‌زدن وضعیت و مستندسازی تصمیم است، نه صدور مجوز خودکار ارتقا.

چک‌لیست اجرای عملی

  • میان‌دوره‌ای بودن نسخه در تصمیم لحاظ شود.
  • موجودی از همان ماشین هدف گرفته شود.
  • تاریخ سیاست و راهنمای ارتقا دوباره بررسی شوند.
  • پشتیبان و معیار بازگشت پیش از تغییر آماده باشند.

منابع

تدوین و راهنمای عملی: دانشنامه لیان.