1# Linux initrd integration 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 11import os 12import logging 13import tempfile 14 15from avocado_qemu import QemuSystemTest 16from avocado import skipUnless 17 18 19class LinuxInitrd(QemuSystemTest): 20 """ 21 Checks QEMU evaluates correctly the initrd file passed as -initrd option. 22 23 :avocado: tags=arch:x86_64 24 :avocado: tags=machine:pc 25 """ 26 27 timeout = 300 28 29 def test_with_2gib_file_should_exit_error_msg_with_linux_v3_6(self): 30 """ 31 Pretends to boot QEMU with an initrd file with size of 2GiB 32 and expect it exits with error message. 33 Fedora-18 shipped with linux-3.6 which have not supported xloadflags 34 cannot support more than 2GiB initrd. 35 """ 36 kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora/li' 37 'nux/releases/18/Fedora/x86_64/os/images/pxeboot/vmlinuz') 38 kernel_hash = '41464f68efe42b9991250bed86c7081d2ccdbb21' 39 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 40 max_size = 2 * (1024 ** 3) - 1 41 42 with tempfile.NamedTemporaryFile() as initrd: 43 initrd.seek(max_size) 44 initrd.write(b'\0') 45 initrd.flush() 46 self.vm.add_args('-kernel', kernel_path, '-initrd', initrd.name, 47 '-m', '4096') 48 self.vm.set_qmp_monitor(enabled=False) 49 self.vm.launch() 50 self.vm.wait() 51 self.assertEqual(self.vm.exitcode(), 1) 52 expected_msg = r'.*initrd is too large.*max: \d+, need %s.*' % ( 53 max_size + 1) 54 self.assertRegex(self.vm.get_log(), expected_msg) 55 56 @skipUnless(os.getenv('QEMU_TEST_FLAKY_TESTS'), 'Test is unstable on GitLab') 57 58 def test_with_2gib_file_should_work_with_linux_v4_16(self): 59 """ 60 :avocado: tags=flaky 61 62 QEMU has supported up to 4 GiB initrd for recent kernel 63 Expect guest can reach 'Unpacking initramfs...' 64 """ 65 kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora' 66 '/linux/releases/28/Everything/x86_64/os/images/pxeboot/' 67 'vmlinuz') 68 kernel_hash = '238e083e114c48200f80d889f7e32eeb2793e02a' 69 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 70 max_size = 2 * (1024 ** 3) + 1 71 72 with tempfile.NamedTemporaryFile() as initrd: 73 initrd.seek(max_size) 74 initrd.write(b'\0') 75 initrd.flush() 76 77 self.vm.set_console() 78 kernel_command_line = 'console=ttyS0' 79 self.vm.add_args('-kernel', kernel_path, 80 '-append', kernel_command_line, 81 '-initrd', initrd.name, 82 '-m', '5120') 83 self.vm.launch() 84 console = self.vm.console_socket.makefile() 85 console_logger = logging.getLogger('console') 86 while True: 87 msg = console.readline() 88 console_logger.debug(msg.strip()) 89 if 'Unpacking initramfs...' in msg: 90 break 91 if 'Kernel panic - not syncing' in msg: 92 self.fail("Kernel panic reached") 93