обновление ядра без перезагрузки


В отличие от Windows, Linux не надо перезагружать после каждого чиха.

Исключением является только обновление ядра. Но сообщество кропотливо работает над улучшением инфраструктуры и ядра Linux, поэтому есть технологии, позволяющие обновить ядро без фактической перезагрузки компьютера.

Ksplice

Представляет собой приложение, которое «замораживает» ядро и заменяет его функции, данные и структуры в памяти обновленными. Приложение должно знать, какой исходный код у текущего ядра и что изменилось с выходом обновлений безопасности, делает унифицированный diff и применяет его к ядру в памяти.

Запущенные приложения продолжат свою работу сразу после обновления. Если какой-то из потоков ядра занят, то обновление может не пройти, такое иногда бывает.

Разработан Ksplice в студентами MIT, которые под руководством Джефри Арнольда основали одноименную компанию. Получив 100000\$ инвестирований они быстро развивались, пока их не выкупила Oracle. Теперь Ksplice представил проект Uptrack, который распространяется на платной основе для Oracle Linux, RedHat и прочих, кроме Ubuntu и Fedora.

Также существует и открытое приложение ksplice, для которого нужно указывать директорию с исходниками запущенного ядра, конфиг, с которым оно собрано и патчи.

Т.к. у нас на блоге стоит дистрибутивное ядро Ubuntu, то мне было лень собирать его из исходников и делать патчи самостоятельно, тем более, что для Ubuntu доступен Uptrack.

Расскажу, как я обновлял ядро на этом сервере (Ubuntu 12.04)

Сначала добавим ключ будущего репозитория:

sudo apt-key adv --keyserver keyserver.ubuntu.com  --recv-keys F7CA6265B6D4038E

Затем добавим сам репозиторий:

sudo cat > /etc/apt/sources.list.d/ksplice.list << EOF
deb http://www.ksplice.com/apt precise ksplice
deb-src http://www.ksplice.com/apt precise ksplice
EOF

Для корректной работы приложения нам понадобится API ключ, который бесплатно вышлют по почте, если попросить по этой ссылке:

https://www.ksplice.com/uptrack/key

Обновим базу и установим приложение:

sudo apt-get update
sudo apt-get install -y uptrack

Теперь нужно обновить патчи uptrack, подтянув изменения из его репозитория:

sudo uptrack-upgrade -n

Вы увидите список, вроде следующего:

Effective kernel version is 3.2.0-38.61
The following steps will be taken:
Install [i5n87bea] Denial of service in Xen PVM.
Install [fvy26jfm] Kernel panic on 802.11 driver unload.
Install [96a6ud9d] NULL pointer dereference in ACPI with cpuidle disabled.
Install [sz48wfii] Denial-of-service in Extended Verification Module.
Install [5jkhgf22] Race condition in USB UHCI during initialization.
Install [lv1gnnm5] Memory leak in CIFS referral mount handling.
Install [evgfv6vb] Use-after-free in XFS AIO handling.
Install [l6i9led9] CVE-2013-1772: Buffer overflow when writing to /dev/kmsg.
Install [ncl9d8lt] CVE-2013-0217: Denial of server in Xen backend driver.
Install [pqjx0bsn] CVE-2013-0216: Memory leak in Xen net backend driver.
Install [lwbnpxyy] Memory leak in xHCI USB host request handler.
Install [38304qwm] Fix stack overflow in kernel resource allocation.
Install [lukdv6ka] Use-after-free in IP loopback transmission handling.
Install [321w6wxa] Memory leak in memory mapped AF_PACKET transmission.
Install [tcjgaw3j] SCTP key leak in shared secret key setup.
Install [nbbtyhi6] CVE-2013-0914: Information leak in signal handlers.
Install [jkw3f4kc] CVE-2013-1767: Use-after-free in tmpfs mempolicy remount.
Install [okgj27q7] CVE-2013-1792: Denial-of-service in user keyring management.
Install [sungspwp] CVE-2013-2546, 2547, 2548: Information leaks in crypto report API.
Install [wotv312r] Use-after-free in ext4 AIO handling.
Install [szyuvdcb] Memory corruption in ext4 block preallocation.
Install [ss2ka0i5] Memory leak in NFS client destruction.
Install [i2c9b7jt] Kernel page mapping information leak in dmesg.
Install [sulkrex6] Denial-of-service in nanosleep implementation.
Install [eunu41sv] CVE-2013-1848: Format string vulnerability in ext3 mounting.
Install [0h3dl30x] Memory leak in keyctl instantiation.
Install [cte9qfn9] Kernel crash when closing TUN/TAP device.
Install [5wfz9xfp] CVE-2013-1873: Information leaks in networking.
Install [l4vwjdgt] Information leak in ISO9660 filesystem exported over NFS.
Install [4tx20gnf] Kernel crash in SCTP protocol handler.
Install [evsivtqq] Use after free in generic journaling layer (JBD2).
Install [vxkn3gfm] Kernel hang when unmounting ext4 filesystems mounted in 'journal' mode.
Install [fejak906] CVE-2013-2094: Out-of-bounds memory write in perf_event_open() system call.
Install [89gog6dh] Btrfs filesystem reports no free space when there is.
Install [15qdwwxr] Denial-of-service in kernel key instantiation.
Install [z0hc8mwm] Race condition in network device unregistration.
Install [fgnc536t] Invalid free in CAN networking.
Install [dimcehgs] CVE-2013-3301: NULL pointer dereference in tracing sysfs files.
Install [xxknelmd] Use-after-free in kernel module loading.
Install [y1dgmvsz] Information leak in tkill() and tgkill() system calls.
Install [3t9j5x9t] CVE-2013-1979: Privilege escalation with UNIX socket credentials.
Install [1ihhkp2u] CVE-2013-3076: Kernel stack information leak in userspace crypto API.
Install [m737hvan] CVE-2013-3223: Kernel stack information leak in amateur radio drivers.
Install [kb976g45] CVE-2013-3235: Kernel stack information leak in TIPC protocol.
Install [4a66bgx7] Kernel panic on removal of the network bonding device module.
Install [qezlg4vq] Information leak in SCTP keys.
Install [887zz6g6] CVE-2013-3228: Kernel stack information leak in IRDA sockets.
Install [7n4trrse] CVE-2013-3231: Kernel stack information leak in LLC sockets.
Install [1t8vkpe5] Kernel stack leak when receiving Netrom packets when message name isn't set.
Install [dol370di] CVE-2013-3232: Kernel stack information leak in amateur radio NET/ROM driver.
Install [6s1nbuf6] Memory leak in tree auditing subsystem.
Install [oyd4n83s] NULL pointer dereference in usermodehelper.
Install [iornqg3f] Heap buffer overflow in btrfs tree search ioctl.
Install [tpjb0u6d] Kernel crash in IP virtual server SIP persistence engine.
Install [0yk5lqfv] Kernel crash in performance monitoring system.
Install [ja7jqf5y] Denial-of-service in CIFS inode handling.
Install [0sd3ytxk] Denial-of-service in md buffered I/O interface.
Install [i3vi1r6t] Kernel panic in mm pagewalk.
Install [ktwc44h3] Kernel crash on Wireless P2P device connection.
Install [6wh5gt4v] Buffer overflow in CIFS options handling.
Install [7m4totdz] Kernel crash when unregistering VLAN interfaces.
Install [5789msg7] Privilege escalation in XFS file truncation.
Install [k6dabqew] XHCI raise a Kernel panic due to unitialised list head.
Install [g40n63sb] Race condition on Swap while waiting on discard I/O completion.
Install [ux0esjln] Kernel crash on IPv6 cork release.
Install [pr21xscr] Kernel crash on ip_tunnel due to garbage data on IPCB.
Install [pwg9kn4t] Kernel oops when using MSG_CMSG_COMPAT in socket interfaces.
Install [3houbhol] NULL pointer dereference in SCTP socket destruction.
Install [63virtjo] Information leak in AF_PACKET getname() call.
Install [s08e0a4c] CVE-2013-2148: Kernel information leak in file system notifications.

Это значит, что есть обновления для установки, выполнив:

sudo uptrack-upgrade -y

и подождав немного, вы увидите, что версия ядра изменилась без перезагрузки. Изменения применились и ядро стало свежее.

Напомню, что изменения применились только к оперативной памяти, поэтому рекомендую все же установить ядро по-старинке, чтобы, когда вы все-таки решитесь перезагрузиться, оно уже обновилось полностью.

Чтобы откатиться на старое ядро, выполните

sudo uptrack-remove --all

Есть еще команды uptrack-show, uptrack-uname и uptrack-install, которые показывают доступные/установленные обновления, версию ядра и устанавливают патчи выборочно.

Напомню, что на работе сервера обновление ядра никак не сказалось, аптайм остался прежним.

kexec

Kexec — это механизм ядра, позволяющий загрузить ядро Linux из работающего ядра.

Таким образом мы избегаем перезагрузки железа, инициализации BIOS и всех вытекающих прелестей, но система по сути грузится с нуля, что не позволит сохранить uptime и работающие приложения.

Кстати, ядро должно быть собрано с поддержкой kexec.

grep -i kexec /boot/config-3.11.0-rc3+
CONFIG_KEXEC=y
CONFIG_KEXEC_JUMP=y

Для использования kexec нужно установить пакет kexec-tools. Он есть в репозиториях большинства дистрибутивов.

sudo apt-get -y install kexec-tools

Теперь, имея новое ядро и initrd, можно «перезагрузиться». Внимание, все текущие приложения будут закрыты, как при обычной перезагрузке.

sudo kexec -l /boot/vmlinuz-new --initrd=/boot/initrd.img-new
--command-line="$(cat /proc/cmdline)"

Вот как это выглядит.

[video:http://www.youtube.com/watch?v=AwpqefvQDRg]

Для того, чтобы перезагрузиться обратно в старое ядро, выполните

sudo kexec -e

Для меня более интересным является Ksplice, но т.к. он развивается под крылом Oracle, то ждать чего-то хорошего не стоит, надеюсь, что будут еще аналоги.

comments powered by Disqus