]>
Commit | Line | Data |
---|---|---|
82d4c923 WSM |
1 | # Linux initrd acceptance test. |
2 | # | |
3 | # Copyright (c) 2018 Red Hat, Inc. | |
4 | # | |
5 | # Author: | |
6 | # Wainer dos Santos Moschetta <wainersm@redhat.com> | |
7 | # | |
8 | # This work is licensed under the terms of the GNU GPL, version 2 or | |
9 | # later. See the COPYING file in the top-level directory. | |
10 | ||
8f1c89ec | 11 | import logging |
82d4c923 WSM |
12 | import tempfile |
13 | from avocado.utils.process import run | |
14 | ||
15 | from avocado_qemu import Test | |
16 | ||
17 | ||
18 | class LinuxInitrd(Test): | |
19 | """ | |
20 | Checks QEMU evaluates correctly the initrd file passed as -initrd option. | |
21 | ||
b194713f | 22 | :avocado: tags=arch:x86_64 |
82d4c923 WSM |
23 | """ |
24 | ||
8f1c89ec | 25 | timeout = 300 |
82d4c923 | 26 | |
3c7156fd | 27 | def test_with_2gib_file_should_exit_error_msg_with_linux_v3_6(self): |
82d4c923 WSM |
28 | """ |
29 | Pretends to boot QEMU with an initrd file with size of 2GiB | |
30 | and expect it exits with error message. | |
3c7156fd LZ |
31 | Fedora-18 shipped with linux-3.6 which have not supported xloadflags |
32 | cannot support more than 2GiB initrd. | |
82d4c923 | 33 | """ |
3c7156fd LZ |
34 | kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora/li' |
35 | 'nux/releases/18/Fedora/x86_64/os/images/pxeboot/vmlinuz') | |
36 | kernel_hash = '41464f68efe42b9991250bed86c7081d2ccdbb21' | |
82d4c923 WSM |
37 | kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) |
38 | max_size = 2 * (1024 ** 3) - 1 | |
39 | ||
40 | with tempfile.NamedTemporaryFile() as initrd: | |
41 | initrd.seek(max_size) | |
42 | initrd.write(b'\0') | |
43 | initrd.flush() | |
3c7156fd LZ |
44 | cmd = "%s -kernel %s -initrd %s -m 4096" % ( |
45 | self.qemu_bin, kernel_path, initrd.name) | |
82d4c923 WSM |
46 | res = run(cmd, ignore_status=True) |
47 | self.assertEqual(res.exit_status, 1) | |
48 | expected_msg = r'.*initrd is too large.*max: \d+, need %s.*' % ( | |
49 | max_size + 1) | |
50 | self.assertRegex(res.stderr_text, expected_msg) | |
8f1c89ec LZ |
51 | |
52 | def test_with_2gib_file_should_work_with_linux_v4_16(self): | |
53 | """ | |
54 | QEMU has supported up to 4 GiB initrd for recent kernel | |
55 | Expect guest can reach 'Unpacking initramfs...' | |
56 | """ | |
57 | kernel_url = ('https://mirrors.kernel.org/fedora/releases/28/' | |
58 | 'Everything/x86_64/os/images/pxeboot/vmlinuz') | |
59 | kernel_hash = '238e083e114c48200f80d889f7e32eeb2793e02a' | |
60 | kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) | |
61 | max_size = 2 * (1024 ** 3) + 1 | |
62 | ||
63 | with tempfile.NamedTemporaryFile() as initrd: | |
64 | initrd.seek(max_size) | |
65 | initrd.write(b'\0') | |
66 | initrd.flush() | |
67 | ||
68 | self.vm.set_machine('pc') | |
69 | self.vm.set_console() | |
70 | kernel_command_line = 'console=ttyS0' | |
71 | self.vm.add_args('-kernel', kernel_path, | |
72 | '-append', kernel_command_line, | |
73 | '-initrd', initrd.name, | |
74 | '-m', '5120') | |
75 | self.vm.launch() | |
76 | console = self.vm.console_socket.makefile() | |
77 | console_logger = logging.getLogger('console') | |
78 | while True: | |
79 | msg = console.readline() | |
80 | console_logger.debug(msg.strip()) | |
81 | if 'Unpacking initramfs...' in msg: | |
82 | break | |
83 | if 'Kernel panic - not syncing' in msg: | |
84 | self.fail("Kernel panic reached") |