1#!/usr/bin/env python3 2# 3# Linux initrd integration test. 4# 5# Copyright (c) 2018 Red Hat, Inc. 6# 7# Author: 8# Wainer dos Santos Moschetta <wainersm@redhat.com> 9# 10# This work is licensed under the terms of the GNU GPL, version 2 or 11# later. See the COPYING file in the top-level directory. 12 13import logging 14import tempfile 15 16from qemu_test import QemuSystemTest, Asset, skipFlakyTest 17 18 19class LinuxInitrd(QemuSystemTest): 20 """ 21 Checks QEMU evaluates correctly the initrd file passed as -initrd option. 22 """ 23 24 timeout = 300 25 26 ASSET_F18_KERNEL = Asset( 27 ('https://archives.fedoraproject.org/pub/archive/fedora/linux/' 28 'releases/18/Fedora/x86_64/os/images/pxeboot/vmlinuz'), 29 '1a27cb42559ce29237ac186699d063556ad69c8349d732bb1bd8d614e5a8cc2e') 30 31 ASSET_F28_KERNEL = Asset( 32 ('https://archives.fedoraproject.org/pub/archive/fedora/linux/' 33 'releases/28/Everything/x86_64/os/images/pxeboot/vmlinuz'), 34 'd05909c9d4a742a6fcc84dcc0361009e4611769619cc187a07107579a035f24e') 35 36 def test_with_2gib_file_should_exit_error_msg_with_linux_v3_6(self): 37 """ 38 Pretends to boot QEMU with an initrd file with size of 2GiB 39 and expect it exits with error message. 40 Fedora-18 shipped with linux-3.6 which have not supported xloadflags 41 cannot support more than 2GiB initrd. 42 """ 43 self.set_machine('pc') 44 kernel_path = self.ASSET_F18_KERNEL.fetch() 45 max_size = 2 * (1024 ** 3) - 1 46 47 with tempfile.NamedTemporaryFile() as initrd: 48 initrd.seek(max_size) 49 initrd.write(b'\0') 50 initrd.flush() 51 self.vm.add_args('-kernel', kernel_path, '-initrd', initrd.name, 52 '-m', '4096') 53 self.vm.set_qmp_monitor(enabled=False) 54 self.vm.launch() 55 self.vm.wait() 56 self.assertEqual(self.vm.exitcode(), 1) 57 expected_msg = r'.*initrd is too large.*max: \d+, need %s.*' % ( 58 max_size + 1) 59 self.assertRegex(self.vm.get_log(), expected_msg) 60 61 # XXX file tracking bug 62 @skipFlakyTest(bug_url=None) 63 def test_with_2gib_file_should_work_with_linux_v4_16(self): 64 """ 65 QEMU has supported up to 4 GiB initrd for recent kernel 66 Expect guest can reach 'Unpacking initramfs...' 67 """ 68 self.set_machine('pc') 69 kernel_path = self.ASSET_F28_KERNEL.fetch() 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 94if __name__ == '__main__': 95 QemuSystemTest.main() 96