kexec_load(2) - wariua/manpages-ko GitHub Wiki
kexec_load, kexec_file_load - ํ์ ์คํํ ์ ์ปค๋ ์ ์ฌํ๊ธฐ
#include <linux/kexec.h>
long kexec_load(unsigned long entry, unsigned long nr_segments,
struct kexec_segment *segments, unsigned long flags);
long kexec_file_load(int kernel_fd, int initrd_fd,
unsigned long cmdline_len, const char *cmdline,
unsigned long flags);
์ฃผ์: ์ด ์์คํ ํธ์ถ์ ๋ํ glibc ๋ํผ๊ฐ ์๋ค. NOTES ์ฐธ๊ณ .
kexec_load()
์์คํ
ํธ์ถ์ ํ์ reboot(2)๋ก ์คํํ ์ ์๋ ์ ์ปค๋์ ์ ์ฌํ๋ค.
flags
์ธ์๋ ํธ์ถ์ ๋์์ ์ ์ดํ๋ ๋นํธ ๋ง์คํฌ์ด๋ค. flags
์ ๋ค์ ๊ฐ๋ค์ ์ง์ ํ ์ ์๋ค.
-
KEXEC_ON_CRASH
(๋ฆฌ๋ ์ค 2.6.13๋ถํฐ) - ์์คํ
ํฌ๋์ ๋ฐ์ ์ ์ ์ปค๋์ ์๋์ผ๋ก ์คํํ๋ค. ์ด "ํฌ๋์ ์ปค๋"์ ๋ถํ
๋ ์ปค๋ ๋ช
๋ นํ ๋งค๊ฐ๋ณ์
crashkernel
๋ก ์ ํ ์์ฝ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก ์ ์ฌํ๋ค. ๊ทธ ์์ฝ ๋ฉ๋ชจ๋ฆฌ์ ์์น๋/proc/iomem
ํ์ผ์ "Crash kernel"์ด๋ผ๋ ํญ๋ชฉ์ ํตํด ์ฌ์ฉ์ ๊ณต๊ฐ์ผ๋ก ๋ ธ์ถ๋๋ค. ์ฌ์ฉ์ ๊ณต๊ฐ ์์ฉ์์ ๊ทธ ํ์ผ์ ํ์ฑ ํด์ ์์ฝ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ชฉ์ ์ง๋ก ํ๋ ์ธ๊ทธ๋จผํธ ๋ชฉ๋ก(์๋ ์ฐธ๊ณ )์ ์ค๋นํ ์ ์๋ค. ์ด ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ฉด ์ปค๋์์๋segments
์ ์ง์ ํ ๋์ ์ธ๊ทธ๋จผํธ๋ค์ด ๊ทธ ์์ฝ ์์ญ ์์ ์๋์ง ํ์ธํ๋ค. -
KEXEC_PRESERVE_CONTEXT
(๋ฆฌ๋ ์ค 2.6.27๋ถํฐ) - ์ ์ปค๋์ ์คํํ๊ธฐ ์ ์ ์์คํ
ํ๋์จ์ด ๋ฐ ์ํํธ์จ์ด ์ํ๋ฅผ ๋ณด์กดํ๋ค. ์์คํ
์ผ์ ์ ์ง์ ์ธ ์ ์์ ๊ฒ์ด๋ค. ์ปค๋์ด
CONFIG_KEXEC_JUMP
๋ก ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ์๋ง ์ด ํ๋๊ทธ๋ฅผ ์ธ ์ ์์ผ๋ฉฐ,nr_segments
๊ฐ 0๋ณด๋ค ํฐ ๊ฒฝ์ฐ์๋ง ํจ๋ ฅ์ด ์๋ค.
flags
์ (๋ง์คํฌ 0xffff0000์ ํด๋นํ๋) ์์ ๋นํธ๋ค์ ์คํํ ์ปค๋์ ์ํคํ
์ฒ๋ฅผ ๋ด๋๋ค. ํ์ฌ ์ํคํ
์ฒ๋ฅผ ์ฐ๋ ค๋ฉด ์์ KEXEC_ARCH_DEFAULT
๋ฅผ, ์๋๋ฉด ์ํคํ
์ฒ ์์ KEXEC_ARCH_386
, KEXEC_ARCH_68K
, KEXEC_ARCH_X86_64
, KEXEC_ARCH_PPC
, KEXEC_ARCH_PPC64
, KEXEC_ARCH_IA_64
, KEXEC_ARCH_ARM
, KEXEC_ARCH_S390
, KEXEC_ARCH_SH
, KEXEC_ARCH_MIPS
, KEXEC_ARCH_MIPS_LE
์ค ํ๋๋ฅผ ์ง์ (OR)ํ๋ฉด ๋๋ค. ์์คํ
์ CPU ์์์ ์คํ ๊ฐ๋ฅํ ์ํคํ
์ฒ์ฌ์ผ ํ๋ค.
entry
์ธ์๋ ์ปค๋ ์ด๋ฏธ์ง ๋ด ์ง์
์ ์ ๋ฌผ๋ฆฌ ์ฃผ์์ด๋ค. nr_segments
์ธ์๋ segments
ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ธ๊ทธ๋จผํธ๋ค์ ์์ด๋ค. ์ปค๋์์ ์ธ๊ทธ๋จผํธ ๊ฐ์๋ฅผ (์์์ ์ผ๋ก) 16๊ฐ๋ก ์ ํํ๋ค. segments
์ธ์๋ ์ปค๋ ๋ฐฐ์น๋ฅผ ๊ท์ ํ๋ kexec_segment
๊ตฌ์กฐ์ฒด์ ๋ฐฐ์ด์ด๋ค.
struct kexec_segment {
void *buf; /* ์ฌ์ฉ์ ๊ณต๊ฐ์ ๋ฒํผ */
size_t bufsz; /* ์ฌ์ฉ์ ๊ณต๊ฐ์ ๋ฒํผ ๊ธธ์ด */
void *mem; /* ์ปค๋์ ๋ฌผ๋ฆฌ ์ฃผ์ */
size_t memsz; /* ๋ฌผ๋ฆฌ ์ฃผ์ ๊ธธ์ด */
};
segments
๋ก ์ง์ ํ ์ปค๋ ์ด๋ฏธ์ง๋ ํธ์ถ ํ๋ก์ธ์ค๋ก๋ถํฐ ์ปค๋์ ์ ๊ท ๋ฉ๋ชจ๋ฆฌ๋ (KEXEC_ON_CRASH
๊ฐ ์ค์ ๋ผ ์์ผ๋ฉด) ์์ฝ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌ๋๋ค. ์ปค๋์์๋ ๋จผ์ segments
๋ก ๋ฐ์ ์ ๋ณด์ ๋ํด ๋ค์ํ ๊ฒ์ฌ๋ฅผ ์ํํ๋ค. ๊ทธ ๊ฒ์ฌ๋ค์ ํต๊ณผํ๋ฉด ์ธ๊ทธ๋จผํธ ๋ฐ์ดํฐ๋ฅผ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌํ๋ค. segments
์ ์ง์ ํ ๊ฐ ์ธ๊ทธ๋จผํธ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ณต์ฌํ๋ค.
-
buf
๋ฐbufsz
๋ ๋ณต์ฌ ์ถ๋ฐ์ง์ด๋ฉฐ ํธ์ถ์ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ ๋ด ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ํ๋ธ๋ค.bufsz
์ ๊ฐ์ดmemsz
ํ๋์ ๊ฐ์ ์ด๊ณผํ ์ ์๋ค. -
mem
๋ฐmemsz
๋ ๋ณต์ฌ ๋ชฉ์ ์ง์ด๋ฉฐ ๋ฌผ๋ฆฌ ์ฃผ์ ๋ฒ์๋ฅผ ๋ํ๋ธ๋ค. ๋ ํ๋ ๋ชจ๋ ๊ฐ์ด ์์คํ ํ์ด์ง ํฌ๊ธฐ์ ๋ฐฐ์์ฌ์ผ ํ๋ค. -
์ถ๋ฐ ๋ฒํผ์์ ๋์ ์ปค๋ ๋ฒํผ๋ก
bufsz
๋ฐ์ดํธ๋ฅผ ๋ณต์ฌํ๋ค.bufsz
๊ฐmemsz
๋ณด๋ค ์์ ๊ฒฝ์ฐ์๋ ์ปค๋ ๋ฒํผ์ ๋จ๋ ๋ฐ์ดํธ๋ค์ 0์ผ๋ก ์ฑ์ด๋ค.
์ผ๋ฐ kexec์์๋ (์ฆ KEXEC_ON_CRASH
ํ๋๊ทธ๊ฐ ์ค์ ๋ผ ์์ง ์์ ๋๋) ์ฌ์ฉ ๊ฐ๋ฅํ ์ ๋นํ ๋ฉ๋ชจ๋ฆฌ๋ก ์ธ๊ทธ๋จผํธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฌํ๋ค๊ฐ kexec ์ฌ๋ถํ
์์ ์ (์ฆ kexec(8)
๋ช
๋ น์ -e
์ต์
์ผ๋ก ์คํํ ๋) ์ต์ข
๋ชฉ์ ์ง๋ก ์ฎ๊ธด๋ค.
ํจ๋ kexec์์๋ (์ฆ KEXEC_ON_CRASH
ํ๋๊ทธ๊ฐ ์ค์ ๋ผ ์์ ๋๋) ํธ์ถ ์์ ์ ์์ฝ ๋ฉ๋ชจ๋ฆฌ๋ก ์ธ๊ทธ๋จผํธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฌํ๋ฉฐ ํฌ๋์ ํ์ kexec ๋ฉ์ปค๋์ฆ์์ ๊ทธ๋๋ก ๊ทธ ์ปค๋๋ก ์ ์ด๋ฅผ ๋๊ธด๋ค.
์ปค๋์ด CONFIG_KEXEC
๋ก ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ์๋ง kexec_load()
์์คํ
ํธ์ถ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
kexec_file_load()
์์คํ
ํธ์ถ์ kexec_load()
์ ๋น์ทํ๋ ๋ฐ๋ ์ธ์๋ค์ด ๋ค๋ฅด๋ค. ํ์ผ ๋์คํฌ๋ฆฝํฐ kernel_fd
๊ฐ ๊ฐ๋ฆฌํค๋ ํ์ผ์์ ์ ์ฌํ ์ปค๋์ ์ฝ์ด ๋ค์ด๊ณ ํ์ผ ๋์คํฌ๋ฆฝํฐ initrd_fd
๊ฐ ๊ฐ๋ฆฌํค๋ ํ์ผ์์ ์ ์ฌํ initrd(์ต์ด ๋จ ๋์คํฌ)๋ฅผ ์ฝ์ด ๋ค์ธ๋ค. cmdline
์ธ์๋ ์ ์ปค๋์ ์ํ ๋ช
๋ นํ์ ๋ด์ ๋ฒํผ์ ๋ํ ํฌ์ธํฐ์ด๋ค. cmdline_len
์ธ์๋ ๊ทธ ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ธ๋ค. ๋ฒํผ์ ๋ง์ง๋ง ๋ฐ์ดํธ๊ฐ ๋ ๋ฐ์ดํธ('\0')์ฌ์ผ ํ๋ค.
flags
์ธ์๋ ํธ์ถ์ ๋์ ๋ฐฉ์์ ๋ณ๊ฒฝํ๋ ๋นํธ ๋ง์คํฌ์ด๋ค. flags
์ ๋ค์ ๊ฐ๋ค์ ์ง์ ํ ์ ์๋ค.
KEXEC_FILE_UNLOAD
- ํ์ฌ ์ ์ฌ๋ ์ปค๋์ ๋ด๋ฆฐ๋ค.
KEXEC_FILE_ON_CRASH
- (
KEXEC_ON_CRASH
์ฒ๋ผ) ํฌ๋์ ์ปค๋์ ์ํด ์์ฝ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ์ปค๋์ ์ ์ฌํ๋ค. ํ์ฌ ๋๊ณ ์๋ ์ปค๋์ด ์ฃฝ์ผ๋ฉด ์ด ์ปค๋๋ก ๋ถํ ํ๋ค. KEXEC_FILE_NO_INITRAMFS
- initrd/initramfs ์ ์ฌ๋ ์ ํ์ ์ด๋ค. initramfs๋ฅผ ์ ์ฌํ์ง ์์ ๊ฒฝ์ฐ ์ด ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ฉด ๋๋ค. ์ด ํ๋๊ทธ๊ฐ ์ค์ ๋ผ ์์ผ๋ฉด
initrd_fd
๊ฐ์ ๋ฌด์ํ๋ค.
kexec_file_load()
์์คํ
ํธ์ถ์ ์๋ช
๋ ์ปค๋๋ค๋ง "kexec" ์ ์ฌ๋ฅผ ํ๋๋ก ํ์ ํด์ผ ํ๋ ์์คํ
์ ์ํด ์ถ๊ฐ๋ ๊ฒ์ด๋ค. ์ปค๋์ด CONFIG_KEXEC_FILE
๋ก ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ์๋ง ์ด ์์คํ
ํธ์ถ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์ฑ๊ณต ์ ์ด ์์คํ
ํธ์ถ๋ค์ 0์ ๋ฐํํ๋ค. ์ค๋ฅ ์ -1์ ๋ฐํํ๋ฉฐ ์ค๋ฅ๋ฅผ ๋ํ๋ด๋๋ก errno
๋ฅผ ์ค์ ํ๋ค.
EADDRNOTAVAIL
-
KEXEC_ON_CRASH
ํ๋๊ทธ๋ฅผ ์ง์ ํ๋๋ฐsegments
ํญ๋ชฉ๋ค ์ค ํ๋์mem
๋ฐmemsz
ํ๋๋ก ์ง์ ํ ์์ญ์ด ํฌ๋์ ์ปค๋์ ์ํด ์์ฝ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ ๋ฐ์ ์๋ค. EADDRNOTAVAIL
-
segments
ํญ๋ชฉ๋ค ์ค ํ๋์์mem
์ด๋memsz
ํ๋ ๊ฐ์ด ์์คํ ํ์ด์ง ํฌ๊ธฐ์ ๋ฐฐ์๊ฐ ์๋๋ค. EBADF
-
kernel_fd
๋initrd_fd
๊ฐ ์ ํจํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์๋๋ค. EBUSY
- ๋ค๋ฅธ ํฌ๋์ ์ปค๋์ด ์ด๋ฏธ ์ ์ฌ๋ผ ์๊ฑฐ๋ ์ด๋ฏธ ํฌ๋์ ์ปค๋์ ์ฐ๊ณ ์๋ค.
EINVAL
-
flags
๊ฐ ์ ํจํ์ง ์๋ค. EINVAL
-
segments
ํญ๋ชฉ๋ค ์ค ํ๋์์bufsz
ํ๋์ ๊ฐ์ด ๋์ํ๋memsz
ํ๋ ๊ฐ์ ์ด๊ณผํ๋ค. EINVAL
-
nr_segments
๊ฐKEXEC_SEGMENT_MAX
(16)๋ฅผ ์ด๊ณผํ๋ค. EINVAL
- ๋ ์ด์์ ์ปค๋ ๋์ ๋ฒํผ๊ฐ ๊ฒน์น๋ค.
EINVAL
-
cmdline[cmdline_len-1]
์ ๊ฐ์ด '\0
'์ด ์๋๋ค. EINVAL
-
kernel_fd
๋initrd_fd
๊ฐ ๊ฐ๋ฆฌํค๋ ํ์ผ์ด ๋น์ด ์๋ค (๊ธธ์ด๊ฐ 0์ด๋ค). ENOEXEC
-
kernel_fd
๊ฐ ์ด๋ฆฐ ํ์ผ์ ๊ฐ๋ฆฌํค๊ณ ์์ง ์๊ฑฐ๋ ์ปค๋์์ ๊ทธ ํ์ผ์ ์ ์ฌํ ์ ์๋ค. ํ์ฌ ๊ทธ ํ์ผ์ bzImage์ฌ์ผ ํ๊ณ ๋ฉ๋ชจ๋ฆฌ์ 4GiB ์์ ์ ์ฌ ๊ฐ๋ฅํ x86 ์ปค๋์ ๋ด๊ณ ์์ด์ผ ํ๋ค. (์ปค๋ ์์ค ํ์ผDocumentation/x86/boot.txt
์ฐธ๊ณ .) ENOMEM
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์๋ค.
EPERM
- ํธ์ถ์๊ฐ
CAP_SYS_BOOT
์ญ๋ฅ์ ๊ฐ์ง๊ณ ์์ง ์๋ค.
๋ฆฌ๋
์ค 2.6.13์์ kexec_load()
์์คํ
ํธ์ถ์ด ์ฒ์ ๋ฑ์ฅํ๋ค. ๋ฆฌ๋
์ค 3.17์์ kexec_file_load()
์์คํ
ํธ์ถ์ด ์ฒ์ ๋ฑ์ฅํ๋ค.
์ด ์์คํ ํธ์ถ๋ค์ ๋ฆฌ๋ ์ค ์ ์ฉ์ด๋ค.
ํ์ฌ ์ด ์์คํ ํธ์ถ๋ค์ ๋ํ glibc ์ง์์ด ์๋ค. syscall(2)์ ์ด์ฉํด ํธ์ถํด์ผ ํ๋ค.
reboot(2), syscall(2), kexec(8)
์ปค๋ ์์ค ํ์ผ Documentation/kdump/kdump.txt
๋ฐ Documentation/admin-guide/kernel-parameters.txt
2019-03-06