Преглед изворни кода

Use fakeroot and makedevs to fake mksquashfs into building properly setup file
permissions and device nodes into the target rootfs without needing to be root.

Eric Andersen пре 20 година
родитељ
комит
afcdf8a01a

+ 0 - 2
package/fakeroot/fakeroot.mk

@@ -40,8 +40,6 @@ $(FAKEROOT_DIR1)/faked: $(FAKEROOT_DIR1)/.configured
 
 $(STAGING_DIR)/usr/bin/fakeroot: $(FAKEROOT_DIR1)/faked
 	$(MAKE) DESTDIR=$(STAGING_DIR) -C $(FAKEROOT_DIR1) install
-	#-mv $(TARGET_DIR)/usr/bin/$(ARCH)-linux-faked $(TARGET_DIR)/usr/bin/faked
-	#-mv $(TARGET_DIR)/usr/bin/$(ARCH)-linux-fakeroot $(TARGET_DIR)/usr/bin/fakeroot
 
 host-fakeroot: uclibc $(STAGING_DIR)/usr/bin/fakeroot
 

+ 5 - 1
target/makedevs/makedevs.mk

@@ -15,7 +15,11 @@ $(MAKEDEVS_DIR)/makedevs: $(MAKEDEVS_DIR)
 	gcc -Wall -O2 makedevs.c -o makedevs
 	touch -c $(MAKEDEVS_DIR)/makedevs
 
-makedevs: $(MAKEDEVS_DIR)/makedevs
+$(STAGING_DIR)/bin/makedevs: $(MAKEDEVS_DIR)/makedevs
+	$(INSTALL) -m 755 $(MAKEDEVS_DIR)/makedevs $(STAGING_DIR)/bin/makedevs
+	touch -c $(STAGING_DIR)/bin/makedevs
+
+makedevs: $(STAGING_DIR)/bin/makedevs
 
 makedevs-source:
 

+ 0 - 36
target/squashfs/squashfs.patch

@@ -1,36 +0,0 @@
-This is a stupid little patch adding an option to change all uid/gid to
-root/root in the generated filesystem.  We really need to teach mksquashfs
-about device tables though...
-
---- squashfs1.3r3/squashfs-tools/mksquashfs.c-dist	2004-03-29 20:35:37.000000000 -0600
-+++ squashfs1.3r3/squashfs-tools/mksquashfs.c	2004-03-29 22:28:51.000000000 -0600
-@@ -136,6 +136,8 @@
- 	stotal_bytes, stotal_inode_bytes, stotal_directory_bytes, sinode_count, sfile_count, ssym_count, sdev_count, sdir_count, sdup_files;
- int restore = 0;
- 
-+unsigned int root_owned = 0;
-+
- /*flag whether destination file is a block device */
- int block_device = 0;
- 
-@@ -421,6 +423,11 @@
- 		return SQUASHFS_INVALID;
- 	}
- 
-+	if (root_owned) {
-+		buf.st_uid = 0;
-+		buf.st_gid = 0;
-+	}
-+
- 	base->mode = SQUASHFS_MODE(buf.st_mode);
- 	base->uid = get_uid(&file_type, (squashfs_uid) buf.st_uid);
- 	base->inode_type = file_type;
-@@ -1268,6 +1275,8 @@
- 			root_name = argv[i];
- 		} else if(strcmp(argv[i], "-version") == 0) {
- 			VERSION();
-+		} else if (strcmp(argv[i], "-root-owned") == 0) {
-+			root_owned = TRUE;
- 		} else {
- 			ERROR("%s: invalid option\n\n", argv[0]);
- printOptions:

+ 16 - 4
target/squashfs/squashfsroot.mk

@@ -34,13 +34,25 @@ squashfs-dirclean:
 #
 #############################################################
 
-squashfsroot: squashfs
-	#-@find $(TARGET_DIR)/lib -type f -name \*.so\* | xargs $(STRIP) --strip-unneeded 2>/dev/null || true;
+squashfsroot: squashfs host-fakeroot makedevs
+	rm -f $(STAGING_DIR)/fakeroot.env
+	touch $(STAGING_DIR)/fakeroot.env
+	# Use fakeroot to pretend all target binaries are owned by root
+	$(STAGING_DIR)/usr/bin/fakeroot -i $(STAGING_DIR)/fakeroot.env \
+		-s $(STAGING_DIR)/fakeroot.env -- \
+		find $(TARGET_DIR) | xargs chown -R root:root
+	# Use fakeroot to pretend to create all needed device nodes
+	$(STAGING_DIR)/usr/bin/fakeroot -i $(STAGING_DIR)/fakeroot.env \
+		-s $(STAGING_DIR)/fakeroot.env -- \
+		$(STAGING_DIR)/bin/makedevs -r $(TARGET_DIR) \
+		target/default/device_table.txt
 	-@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true;
 	@rm -rf $(TARGET_DIR)/usr/man
 	@rm -rf $(TARGET_DIR)/usr/info
-	#$(SQUASHFS_DIR)/squashfs-tools/mksquashfs -q -D target/default/device_table.txt $(TARGET_DIR) $(IMAGE)
-	$(SQUASHFS_DIR)/squashfs-tools/mksquashfs $(TARGET_DIR) $(IMAGE).squashfs -noappend -root-owned
+	# Use fakeroot to fake out mksquashfs per the previous fakery
+	$(STAGING_DIR)/usr/bin/fakeroot -i $(STAGING_DIR)/fakeroot.env -- \
+		$(SQUASHFS_DIR)/squashfs-tools/mksquashfs $(TARGET_DIR) \
+		$(IMAGE).squashfs -noappend
 
 squashfsroot-source: squashfs-source