summaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
authorMark Hatle <mark.hatle@windriver.com>2015-05-22 12:56:53 -0700
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-05-24 07:19:21 +0100
commit7a7c6b021f114c6bedfbdc9afd2bf2925b238d19 (patch)
treea401b672c58ba02694afefac6fc6db395bf75674 /meta
parentfa00c9a93046b928416911521844d36f7806fc8d (diff)
downloadpoky-7a7c6b021f114c6bedfbdc9afd2bf2925b238d19.tar.gz
image.bbclass: Add a method for creating a companion debug filesystem
The companion debug filesystem contains only the package database and the complementary *-dbg packages for the main filesystem component. This is useful in a production environment to produce a companion filesystem capable of remote system debugging, without requiring corresponding debug symbols or source code on the device. (From OE-Core rev: 1a6ed48c65f922c66b005aa966d7ee4878ee95e3) Signed-off-by: Mark Hatle <mark.hatle@windriver.com> Signed-off-by: Robert Yang <liezhi.yang@windriver.com> If dbg pkgs have already been installed to the rootfs image, the installation to companion debug filesystem will fail, because both of image creation make use of the same pm database. In this situation, try to copy installed dbg files from rootfs image to companion debug filesystem. Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> Signed-off-by: Robert Yang <liezhi.yang@windriver.com> Signed-off-by: Mark Hatle <mark.hatle@windriver.com> Acked-by: Christopher Larson <chris_larson@mentor.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r--meta/classes/image.bbclass5
-rw-r--r--meta/lib/oe/rootfs.py57
2 files changed, 61 insertions, 1 deletions
diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass
index 01f8b3fc19..58b4add8fa 100644
--- a/meta/classes/image.bbclass
+++ b/meta/classes/image.bbclass
@@ -24,6 +24,9 @@ IMAGE_FEATURES ?= ""
24IMAGE_FEATURES[type] = "list" 24IMAGE_FEATURES[type] = "list"
25IMAGE_FEATURES[validitems] += "debug-tweaks read-only-rootfs empty-root-password allow-empty-password post-install-logging" 25IMAGE_FEATURES[validitems] += "debug-tweaks read-only-rootfs empty-root-password allow-empty-password post-install-logging"
26 26
27# Generate companion debugfs?
28IMAGE_GEN_DEBUGFS ?= "0"
29
27# rootfs bootstrap install 30# rootfs bootstrap install
28ROOTFS_BOOTSTRAP_INSTALL = "${@bb.utils.contains("IMAGE_FEATURES", "package-management", "", "${ROOTFS_PKGMANAGE_BOOTSTRAP}",d)}" 31ROOTFS_BOOTSTRAP_INSTALL = "${@bb.utils.contains("IMAGE_FEATURES", "package-management", "", "${ROOTFS_PKGMANAGE_BOOTSTRAP}",d)}"
29 32
@@ -108,7 +111,7 @@ def rootfs_variables(d):
108 'SDK_OUTPUT','SDKPATHNATIVE','SDKTARGETSYSROOT','SDK_DIR','SDK_VENDOR','SDKIMAGE_INSTALL_COMPLEMENTARY','SDK_PACKAGE_ARCHS','SDK_OUTPUT','SDKTARGETSYSROOT','MULTILIBRE_ALLOW_REP', 111 'SDK_OUTPUT','SDKPATHNATIVE','SDKTARGETSYSROOT','SDK_DIR','SDK_VENDOR','SDKIMAGE_INSTALL_COMPLEMENTARY','SDK_PACKAGE_ARCHS','SDK_OUTPUT','SDKTARGETSYSROOT','MULTILIBRE_ALLOW_REP',
109 'MULTILIB_TEMP_ROOTFS','MULTILIB_VARIANTS','MULTILIBS','ALL_MULTILIB_PACKAGE_ARCHS','MULTILIB_GLOBAL_VARIANTS','BAD_RECOMMENDATIONS','NO_RECOMMENDATIONS','PACKAGE_ARCHS', 112 'MULTILIB_TEMP_ROOTFS','MULTILIB_VARIANTS','MULTILIBS','ALL_MULTILIB_PACKAGE_ARCHS','MULTILIB_GLOBAL_VARIANTS','BAD_RECOMMENDATIONS','NO_RECOMMENDATIONS','PACKAGE_ARCHS',
110 'PACKAGE_CLASSES','TARGET_VENDOR','TARGET_VENDOR','TARGET_ARCH','TARGET_OS','OVERRIDES','BBEXTENDVARIANT','FEED_DEPLOYDIR_BASE_URI','INTERCEPT_DIR','USE_DEVFS', 113 'PACKAGE_CLASSES','TARGET_VENDOR','TARGET_VENDOR','TARGET_ARCH','TARGET_OS','OVERRIDES','BBEXTENDVARIANT','FEED_DEPLOYDIR_BASE_URI','INTERCEPT_DIR','USE_DEVFS',
111 'COMPRESSIONTYPES'] 114 'COMPRESSIONTYPES', 'IMAGE_GEN_DEBUGFS']
112 variables.extend(command_variables(d)) 115 variables.extend(command_variables(d))
113 variables.extend(variable_depends(d)) 116 variables.extend(variable_depends(d))
114 return " ".join(variables) 117 return " ".join(variables)
diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py
index a9a6c85a2c..5f1f7b3e5d 100644
--- a/meta/lib/oe/rootfs.py
+++ b/meta/lib/oe/rootfs.py
@@ -95,6 +95,57 @@ class Rootfs(object):
95 def _cleanup(self): 95 def _cleanup(self):
96 pass 96 pass
97 97
98 def _setup_dbg_rootfs(self, dirs):
99 gen_debugfs = self.d.getVar('IMAGE_GEN_DEBUGFS', True) or '0'
100 if gen_debugfs != '1':
101 return
102
103 bb.note(" Renaming the original rootfs...")
104 try:
105 shutil.rmtree(self.image_rootfs + '-orig')
106 except:
107 pass
108 os.rename(self.image_rootfs, self.image_rootfs + '-orig')
109
110 bb.note(" Creating debug rootfs...")
111 bb.utils.mkdirhier(self.image_rootfs)
112
113 bb.note(" Copying back package database...")
114 for dir in dirs:
115 bb.utils.mkdirhier(self.image_rootfs + os.path.dirname(dir))
116 shutil.copytree(self.image_rootfs + '-orig' + dir, self.image_rootfs + dir)
117
118 cpath = oe.cachedpath.CachedPath()
119 # Copy files located in /usr/lib/debug or /usr/src/debug
120 for dir in ["/usr/lib/debug", "/usr/src/debug"]:
121 src = self.image_rootfs + '-orig' + dir
122 if cpath.exists(src):
123 dst = self.image_rootfs + dir
124 bb.utils.mkdirhier(os.path.dirname(dst))
125 shutil.copytree(src, dst)
126
127 # Copy files with suffix '.debug' or located in '.debug' dir.
128 for root, dirs, files in cpath.walk(self.image_rootfs + '-orig'):
129 relative_dir = root[len(self.image_rootfs + '-orig'):]
130 for f in files:
131 if f.endswith('.debug') or '/.debug' in relative_dir:
132 bb.utils.mkdirhier(self.image_rootfs + relative_dir)
133 shutil.copy(os.path.join(root, f),
134 self.image_rootfs + relative_dir)
135
136 bb.note(" Install complementary '*-dbg' packages...")
137 self.pm.install_complementary('*-dbg')
138
139 bb.note(" Rename debug rootfs...")
140 try:
141 shutil.rmtree(self.image_rootfs + '-dbg')
142 except:
143 pass
144 os.rename(self.image_rootfs, self.image_rootfs + '-dbg')
145
146 bb.note(" Restoreing original rootfs...")
147 os.rename(self.image_rootfs + '-orig', self.image_rootfs)
148
98 def _exec_shell_cmd(self, cmd): 149 def _exec_shell_cmd(self, cmd):
99 fakerootcmd = self.d.getVar('FAKEROOT', True) 150 fakerootcmd = self.d.getVar('FAKEROOT', True)
100 if fakerootcmd is not None: 151 if fakerootcmd is not None:
@@ -369,6 +420,8 @@ class RpmRootfs(Rootfs):
369 420
370 self.pm.install_complementary() 421 self.pm.install_complementary()
371 422
423 self._setup_dbg_rootfs(['/etc/rpm', '/var/lib/rpm', '/var/lib/smart'])
424
372 if self.inc_rpm_image_gen == "1": 425 if self.inc_rpm_image_gen == "1":
373 self.pm.backup_packaging_data() 426 self.pm.backup_packaging_data()
374 427
@@ -475,6 +528,8 @@ class DpkgRootfs(Rootfs):
475 528
476 self.pm.install_complementary() 529 self.pm.install_complementary()
477 530
531 self._setup_dbg_rootfs(['/var/lib/dpkg'])
532
478 self.pm.fix_broken_dependencies() 533 self.pm.fix_broken_dependencies()
479 534
480 self.pm.mark_packages("installed") 535 self.pm.mark_packages("installed")
@@ -743,6 +798,8 @@ class OpkgRootfs(Rootfs):
743 798
744 self.pm.install_complementary() 799 self.pm.install_complementary()
745 800
801 self._setup_dbg_rootfs(['/var/lib/opkg'])
802
746 execute_pre_post_process(self.d, opkg_post_process_cmds) 803 execute_pre_post_process(self.d, opkg_post_process_cmds)
747 execute_pre_post_process(self.d, rootfs_post_install_cmds) 804 execute_pre_post_process(self.d, rootfs_post_install_cmds)
748 805