구형 인텔 맥에 최신 OSX 설치

설치전에 먼저, 아래 방법은 문제가 발생하여 기존에 설치된 데이터를 모두 날려먹거나 부팅이 안될 수도 있으니 반드시 데이터는 백업 받거나 아예 다른 HDD 를 하나 구해서 기존 HDD 를 제거하고 설치한 후 테스트를 한 후에 적용하여야 한다.


얼마전에 MacPro 1.1 을 구했다. 사양은 http://www.everymac.com/systems/apple/mac_pro/specs/mac-pro-quad-2.66-specs.html 에서 볼 수 있듯이 현 시점에서 보기에도 그다지 딸리지는 않는다. 메모리가 Registered DDR2-5300F 정도로 일반적으로 구하기 쉽지 않다는 정도를 뺀다면 ..

일단 방법은 그다지 어렵진 않다. 귀찮을 뿐 ..

준비할 것은 OSX 설치 매체다. 그게 USB 든 DVD 든 .. 웬만하면 USB 가 좋다. 요세미티 베타버전이 나오기는 했지만 현시점에서는 매버릭스가 최신 버전이고, http://macnews.tistory.com/1645 를 참조하면 어렵진 않다.

준비할 것을 정리하자면,

  1. 8 GB 이상 남아 있는 USB 메모리에 설치된 OSX 설치 이미지
  2. boot.efi 파일 - http://forums.macrumors.com/showthread.php?t=1598176&page=2 에서 tiamo 라는 ID 가 쓴 글을 보면 첨부파일로 boot.zip 파일이 있는데, 여기서 나오는 boot.efi 파일
  3. 수정된 OSInstall.mpkg 파일
  4. 약간의 삽질

이다.

일단 OSX 설치 이미지가 준비되었다면,

다운로드 받은 boot.efi 파일을 USB 로 복사하자. USB 에 있는 아래 디렉터리로 두곳에 복사하면 된다. 다만, 기존 boot.efi 파일은 boot.efi.ORIGINAL 정도로 미리 다른 이름으로 복사해두자.

 System/Library/CoreServices/boot.efi
 usr/standalone/i386/boot.efi

USB (아마도 /Volumes/Install OS X Mavericks 라는 디렉터리에 위치할 거다.) 에 저 두 파일을 다운받은 boot.efi 로 대체하면 된다.

그 다음에는 OSInstall.mpkg 파일을 손 보아야 한다.

USB 메모리 깊숙한 곳에 있는 OSInstall.mpkg 파일을 /Users/akpil/Desktop 정도로 꺼내자.

 cp OSInstall.mpkg /Users/akpil/Desktop 

물론, 작업하기 편한 아무곳에나 꺼내도 무방하다.

다음의 명령어를 입력하자.

 pkgutil --expand ./OSInstall.mpkg ./OSInstall

그러면 OSInstall 이라는 디렉터리가 보이고, 거기로 들어가면 Distribution 이라는 이라는 파일이 보일텐데, 저 아래에 있는 것으로 대체하면 된다. 수정할 부분은 3곳이다.

  var minRam = 2048; 에서 2048 을 1024 로 변경
  function isVirtualMachine() 함수에서 return true 로 되어 있는 것을 return false 로 변경
  function isSupportedPlatform() 함수에서 return false 로 되어 있는 것을 return true 로 변경

그 뒤에

 pkgutil --flatten ./OSInstall ./OSInstall.mpkg

명령으로 OSInstall.mpkg 파일을 다시 만들어주자. 그리고 원래 있던 곳으로 복사해 넣으면 된다.

자 이렇게 만들어진 USB 로 설치하자. 대략 1시간 이상 걸린다. 그리고 운 나쁘면 부팅이 안되고 물음표가 계속 나올 수도 있다. VGA 카드 바이오스 문제 등등 여러가지가 있으므로 이럴 땐 열심히 구글링해서 뭔가 또 삽질을 해야 한다. 케이스 바이 케이스라서 워낙 많은 경우가 있을 수 있으니 그건 나중에 알아보자…

Distribution
<?xml version="1.0" standalone="yes"?>
<installer-gui-script minSpecVersion="1">
  <options eraseOptionAvailable="true" hostArchitectures="i386" allow-external-scripts="yes" osVersion="10.9.3" osBuildVersion="13D65"/>
  <title>MacOSX_Title</title>
  <license file="License.rtf"/>
  <conclusion file="Conclusion.rtfd"/>
  <script>
        var minRam = 1024;
 
function checkSupportedMachine(machineType) {
	return true;
}
 
function checkSupportedBootRom(machineType) {
	return true;
}
 
function hasAtLeastRam(RAM) {
	var requiredRAM = (RAM * 1024 * 1024);
	var actualRAM = system.sysctl('hw.memsize');
	return (actualRAM &gt; (requiredRAM - 1));
}
 
function is64bit() {
    var is64bit =system.sysctl('hw.cpu64bit_capable');
	return is64bit;
}
 
function isVirtualMachine(){
 
	var cpuFeatures = system.sysctl( 'machdep.cpu.features' );
			cpuFeatures=cpuFeatures.split(" ");
			for( var i = 0; i &lt; cpuFeatures.length; i++ ){
			 	if( cpuFeatures[i] == "VMM" ){
						return false;
			  	}	
			}
			return false;			
 
}
 
function isSupportedPlatform(){
 
	if( isVirtualMachine() ){
		return true;
	}
 
	var platformSupportValues=["Mac-031B6874CF7F642A","Mac-F2268DC8","Mac-50619A408DB004DA","Mac-F2218EA9","Mac-F42D86A9","Mac-F22C8AC8","Mac-F22586C8","Mac-AFD8A9D944EA4843","Mac-942B59F58194171B","Mac-F226BEC8","Mac-7DF2A3B5E5D671ED","Mac-35C1E88140C3E6CF","Mac-77EB7D7DAF985301","Mac-2E6FAB96566FE58C","Mac-7BA5B2794B2CDB12","Mac-031AEE4D24BFF0B1","Mac-00BE6ED71E35EB86","Mac-4B7AC7E43945597E","Mac-F22C89C8","Mac-F22587A1","Mac-942459F5819B171B","Mac-F42388C8","Mac-F223BEC8","Mac-F4238CC8","Mac-F222BEC8","Mac-F227BEC8","Mac-F2208EC8","Mac-66F35F19FE2A0D05","Mac-F4238BC8","Mac-189A3D4F975D5FFC","Mac-C08A6BB70A942AC2","Mac-8ED6AF5B48C039E1","Mac-F2238AC8","Mac-FC02E91DDD3FA6A4","Mac-6F01561E16C75D06","Mac-F60DEB81FF30ACF6","Mac-F2268EC8","Mac-F22589C8","Mac-3CBD00234E554E41","Mac-F22788AA","Mac-F42C86C8","Mac-F221BEC8","Mac-942C5DF58193131B","Mac-F2238BAE","Mac-F22C86C8","Mac-F2268CC8","Mac-F221DCC8","Mac-F2218FC8","Mac-742912EFDBEE19B3","Mac-27ADBB7B4CEE8E61","Mac-F65AE981FFA204ED","Mac-F42D89C8","Mac-F22587C8","Mac-F42D89A9","Mac-F2268AC8","Mac-F42C89C8","Mac-942452F5819B1C1B","Mac-F2218FA9","Mac-F42D88C8","Mac-94245B3640C91C81","Mac-F42D86C8","Mac-4BC72D62AD45599E","Mac-F2268DAE","Mac-2BD1B31983FE1663","Mac-7DF21CB3ED6977E5","Mac-F42C88C8","Mac-94245A3940C91C80","Mac-F42386C8","Mac-C3EC7CD22292981F","Mac-942B5BF58194151B","Mac-F2218EC8"];
	var boardID = system.ioregistry.fromPath('IOService:/')['board-id'];
 
	if( !boardID || platformSupportValues.length == 0 ) {
		return false
	}
	for( var i = 0; i &lt; platformSupportValues.length; i++ ){
	 	if( boardID == platformSupportValues[i] ){
				return true;
	  	}	
	}
 
	return true;
}
 
function isSupportedFirmware(){
 
	var property = system.sysctl("hw.model");
 
    if (property &amp;&amp; (property == "MacBookAir5,1") || (property == "MacBookAir5,2") ) {
		var reg;
		try {
			reg = system.ioregistry.matchingName('IOAHCIDevice');
			for( var i = 0 ; i &lt; reg.length ; i++ ) {
				var childrenArray = system.ioregistry.childrenOf(reg[i]);
				for( var j = 0 ; j &lt; childrenArray.length ; j++ ) {
					var model = childrenArray[j]['Model'];
					var revision = childrenArray[j]['Revision'];
 
					if( null != model &amp;&amp; null != revision ) {
						if( model.match(/TS064E/) &amp;&amp; (revision.match(/TPSABBF0/) || revision.match(/TPVABBF0/))) 
						{
							return false;
						}
						if( model.match(/TS128E/) &amp;&amp; (revision.match(/TPSABBF0/)  || revision.match(/TPVABBF0/))) 
						{
							return false;
						}
					}
				}
			}
		} catch(err) { return false; }    
    }
 
    return true;
}
 
 
 
	function installCheckScript(){
 
			try{
				var machineType = system.ioregistry.fromPath('IODeviceTree:/')['compatible'];
 
				if (typeof(isFNI) == "undefined" &amp;&amp; typeof(hwbeInstallCheck) != "undefined") {
					if (!hwbeInstallCheck()) {
						return false;
					}
				} 
 
				if(!is64bit()){
					my.result.message = system.localizedStringWithFormat('IC_Unsupported_Processor');
					my.result.type = 'Fatal';
					return false;
				}
 
				if(!isSupportedPlatform()){
					my.result.message = system.localizedStringWithFormat('IC_Unsupported_Platform');
					my.result.type = 'Fatal';
					return false;
				}
 
				if(!hasAtLeastRam(minRam)){
					my.result.message = system.localizedStringWithFormat('IC_RAM_message');
					my.result.type = 'Fatal';
					return false;
				}
 
				if(!isSupportedFirmware()){
					my.result.title = system.localizedStringWithFormat('IC_UnsupportedFirmware_Title');
					my.result.message = system.localizedStringWithFormat('IC_UnsupportedFirmware');
					my.result.type = 'Fatal';
					return false;
				}
 
				if (system.compareVersions(system.version.ProductVersion, '10.9') &lt; 0 &amp;&amp; system.env.COMMAND_LINE_INSTALL) {
					my.result.message = system.localizedStringWithFormat('IC_Command_Line_message', '10.9');
					my.result.type = 'Fatal';
					return false;
				}
 
				if( system.compareVersions(my.target.systemVersion.ProductVersion, '10.9') &gt;= 0 &amp;&amp;  system.compareVersions(my.target.systemVersion.ProductVersion, '10.10') &lt; 0){			
					my.result.message = system.localizedStringWithFormat('IC_Redownload_message', system.version.ProductVersion);
					my.result.type = 'Warn';
					return false;
				}
 
				if (typeof(findBJPrinters) != "undefined") findBJPrinters();
 
			} catch (e) {
				system.log('installCheckScript threw exception ' + e);
			}
 
			return true;
	}
 
 
function volCheckScript(){
		var target = my.target;
		var destSystemVersion = target['systemVersion'];
 
		if(system.files.fileExistsAtPath(my.target.mountpoint + "/Backups.backupdb")) {
			my.result.message = system.localizedString('VC_Backup_message');
			my.result.type = 'Fatal';
			return false;
		}
 
		if(my.target.systemVersion){
			if( system.compareVersions(my.target.systemVersion.ProductVersion, '10.10') &gt;= 0){			
				my.result.message = system.localizedString('VC_Newer_message');
				my.result.type = 'Fatal';
				return false;
			}			
		}
 
		if (destSystemVersion) {
 
			// Don't allow upgrades on volumes less than 10.6.6
			if (-1 == system.numericalCompare(destSystemVersion['ProductVersion'], '10.6.6')) {
					my.result.message = system.localizedString('VC_Upgrade_message');
					my.result.type = 'Fatal';
 
					return false;
			}
		}
 
		//FDE CHECKS
		var plist = system.files.plistAtPath('/System/Library/Extensions/CoreStorage.kext/Contents/Info.plist');
		if(plist){
				var plistKeyValue = plist['CoreStorageDiskFormatVersion'];
				if((system.ioregistry.matchingClass('CoreStorageGroup').length != 0) &amp;&amp; (system.compareVersions(plistKeyValue, '1') != 0) ){
					my.result.message = system.localizedString('CS_message');
					my.result.type = 'Fatal';
					return false;
 
				}	
		}
 
		return true;
}
 
 
	function language_running(langKey){
		var appleLanguages = system.defaults['AppleLanguages'];
 
 
		if(!appleLanguages || (appleLanguages.length == 0))
				return ((langKey == 'English') || (langKey == 'en'))
 
		return (langKey == appleLanguages[0]);
	}
 
	gLanguageRequired = {
	};
 
	//Function returns true if the langKey is required, it uses a cache so that the logic doesn't
	//have to be run hundreds of times
	function language_required(langKey){
 
		if(! (gLanguageRequired[langKey])){
			var required = false;
 
			if(language_running(langKey)){
				required =  true;
			}
 
			gLanguageRequired[langKey] = required;
		}
 
		return gLanguageRequired[langKey];
	}
 
	function language_enabled(langKey){
		var enabled = !(language_required(langKey));
 
		if(false == enabled){
			my.choice.tooltip = system.localizedString('TT_Language_Required_message');
		}
 
		return enabled;
	}
 
	function language_selected(langKey){
		var selected = my.choice.selected || language_required(langKey);
 
		return selected;
	}
 
 
	function verCompare(checkVer){
		var sysVer = my.target['systemVersion'];
		if (sysVer) {
			return system.numericalCompare(sysVer['ProductVersion'],checkVer);
		}
		return -1;
	}
 
	function upgrade_allowed(){
		var argv = upgrade_allowed.arguments;
		var upgradable = true;
		var upgradeAction = my.choice.packageUpgradeAction;
 
		if(argv.length &gt; 0) { 
			upgradeAction = eval('choices.' + argv[0] + '.packageUpgradeAction');	
		}
 
		if((upgradeAction == 'downgrade') || (upgradeAction == 'mixed')){
			my.choice.tooltip = system.localizedString('TT_Newer_Package_Installed_message');	
			upgradable = false;
		}
 
		return upgradable;
	}
 
	function systemHasDVD(){
		var obj = system.ioregistry.matchingClass("IODVDBlockStorageDriver");
		if (obj) {
			return true;
		}
		var obj2 = system.ioregistry.matchingName("ApplePlatformEnabler","IOService");
		if (obj2 ) {
			if ( obj2[0]['DVDSupported'] ) {
				return true;
			}
		}
		return false;
	}
 
	function hasNetInfo() {
		var path = my.target.mountpoint + "/private/var/db/netinfo/local.nidb";
	    if (system.files.fileExistsAtPath(path)) {
			return true;
		}
 
		return false;
	}
 
	function needsX11redirect() {
			var sysVer = my.target['systemVersion'];
			if (!sysVer) {
				return true;
			}
			var path = my.target.mountpoint + "/private/var/db/receipts/com.apple.pkg.X11redirect.plist";
		    if (system.files.fileExistsAtPath(path) || system.compareVersions(my.target.systemVersion.ProductVersion, '10.8') &lt; 0) {
				return true;
			}
 
			return false;
		}
 
 
 
	</script>
  <installation-check script="installCheckScript()"/>
  <volume-check script="volCheckScript()"/>
  <choices-outline>
    <line choice="EssentialSystemSoftware">
      <line choice="EssentialSystemSoftwareGroup"/>
      <line choice="AdditionalEssentials"/>
      <line choice="AdditionalSpeechVoices"/>
      <line choice="AsianLanguagesSupport"/>
      <line choice="MediaFiles"/>
      <line choice="JavaEssentials"/>
      <line choice="OxfordDictionaries"/>
      <line choice="X11"/>
    </line>
    <line choice="OSInstallScripts"/>
  </choices-outline>
  <choice id="EssentialSystemSoftware" title="EssentialSystemSoftware_title" description="EssentialSystemSoftware_description" start_enabled="false" start_visible="false"/>
  <choice id="EssentialSystemSoftwareGroup" start_visible="false" start_selected="true">
    <pkg-ref id="com.apple.pkg.BaseSystemBinaries"/>
    <pkg-ref id="com.apple.pkg.BaseSystemResources"/>
    <system-image id="com.apple.dmg.MacOSX"/>
    <pkg-ref id="com.apple.mpkg.OSInstall"/>
    <pkg-ref id="com.apple.pkg.Essentials"/>
    <pkg-ref id="com.apple.pkg.BSD"/>
    <pkg-ref id="com.apple.pkg.JavaTools"/>
  </choice>
  <choice id="AdditionalEssentials" start_visible="false" start_selected="true">
    <pkg-ref id="com.apple.pkg.AdditionalEssentials"/>
    <pkg-ref id="com.apple.pkg.OSUpgrade" active="!my.target.ignoreContents &amp;&amp; hasNetInfo() &amp;&amp; verCompare(10.3) &gt;= 0"/>
  </choice>
  <choice id="AsianLanguagesSupport" start_visible="false" start_selected="true">
    <pkg-ref id="com.apple.pkg.AsianLanguagesSupport"/>
  </choice>
  <choice id="JavaEssentials" start_visible="false" start_selected="true">
    <pkg-ref id="com.apple.pkg.JavaEssentials"/>
  </choice>
  <choice id="MediaFiles" start_visible="false" start_selected="true">
    <pkg-ref id="com.apple.pkg.MediaFiles"/>
  </choice>
  <choice id="OxfordDictionaries" start_visible="false" start_selected="true">
    <pkg-ref id="com.apple.pkg.OxfordDictionaries"/>
  </choice>
  <choice id="OSInstallScripts" start_visible="false" start_selected="true">
    <pkg-ref id="com.apple.pkg.OSInstall"/>
  </choice>
  <choice id="AdditionalSpeechVoices" start_visible="false" start_selected="true">
    <pkg-ref id="com.apple.pkg.AdditionalSpeechVoices"/>
  </choice>
  <choice id="X11" start_selected="true" start_visible="false">
    <pkg-ref id="com.apple.pkg.X11redirect" active="needsX11redirect()"/>
  </choice>
  <pkg-ref id="com.apple.pkg.AdditionalSpeechVoices" auth="root" installKBytes="286664" version="10.9.0.1.1.1306847324">AdditionalSpeechVoices.pkg</pkg-ref>
  <pkg-ref id="com.apple.pkg.AsianLanguagesSupport" auth="root" installKBytes="3924" version="10.9.0.1.1.1306847324">AsianLanguagesSupport.pkg</pkg-ref>
  <pkg-ref id="com.apple.pkg.BaseSystemBinaries" auth="root" installKBytes="543702" version="10.9.0.1.1.1306847324">BaseSystemBinaries.pkg</pkg-ref>
  <pkg-ref id="com.apple.pkg.BaseSystemResources" auth="root" installKBytes="357886" version="10.9.0.1.1.1306847324">BaseSystemResources.pkg</pkg-ref>
  <pkg-ref id="com.apple.pkg.BSD" auth="root" installKBytes="711545" version="10.9.0.1.1.1306847324">BSD.pkg</pkg-ref>
  <pkg-ref id="com.apple.pkg.Essentials" auth="root" installKBytes="4601561" version="10.9.0.1.1.1306847324">Essentials.pkg</pkg-ref>
  <pkg-ref id="com.apple.pkg.AdditionalEssentials" auth="root" installKBytes="160106" version="10.9.0.1.1.1306847324">AdditionalEssentials.pkg</pkg-ref>
  <pkg-ref id="com.apple.pkg.OSUpgrade" auth="root" installKBytes="0" version="10.9.0.1">OSUpgrade.pkg</pkg-ref>
  <pkg-ref id="com.apple.pkg.JavaEssentials" auth="root" installKBytes="6509" version="10.9.0.1.1.1306847324">JavaEssentials.pkg</pkg-ref>
  <pkg-ref id="com.apple.pkg.MediaFiles" auth="root" installKBytes="229893" version="10.9.0.1.1.1306847324">MediaFiles.pkg</pkg-ref>
  <pkg-ref id="com.apple.pkg.OSInstall" auth="root" installKBytes="0" version="10.9.0.1">OSInstall.pkg</pkg-ref>
  <pkg-ref id="com.apple.pkg.OxfordDictionaries" auth="root" installKBytes="99895" version="10.9.0.1.1.1306847324">OxfordDictionaries.pkg</pkg-ref>
  <pkg-ref id="com.apple.pkg.X11redirect" auth="root" installKBytes="3391" version="10.9.0.1.1.1306847324">X11redirect.pkg</pkg-ref>
  <pkg-ref id="com.apple.pkg.JavaTools" auth="root" installKBytes="92" version="10.9.0.1.1.1306847324">JavaTools.pkg</pkg-ref>
  <pkg-ref id="com.apple.mpkg.OSInstall" auth="root" version="10.9.0">OSInstall.mpkg</pkg-ref>
  <system-image id="com.apple.dmg.MacOSX">InstallESD.dmg<pkg-ref id="com.apple.mpkg.OSInstall" auth="root" version="10.9.0"/></system-image>
  <system-image id="com.apple.dmg.MacOSX" version="10.9.0.1.1.1306847324" sha1="9feada4340901e67094f3b1edb420f9af9c4c000"/>
</installer-gui-script>