스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
macOS 또는 Linux 가상 머신 만들기
가상화 프레임워크를 사용하여 Mac에 가상 머신을 빠르게 만드는 방법을 알아보세요. 가상 Mac을 만들고 격리된 환경에서 앱의 변경 사항을 빠르게 테스트하는 방법을 보여드립니다. 또한 전체 Linux 배포판을 Apple 실리콘에서 설치 및 실행하는 방법을 알아보고, Rosetta 2를 활용하여 x86-64 Linux 바이너리를 실행하는 방법을 소개합니다.
리소스
관련 비디오
WWDC23
-
다운로드
♪ ♪
안녕하세요, '가상화' 세션을 진행할 Benjamin Poulain입니다 오늘은 이 작업을 함께 할 텐데요 macOS와 Linux의 Apple Silicon이 탑재된 가상 머신 내 운영 방식을 알아볼겁니다 이번 세션 마지막에는 직접 해보실 수 있을 거예요 야심찬 거 아니냐 하시겠지만 따라 오세요 함께 하면 가능합니다 오늘의 주제입니다 먼저 가상화 기술에 대해 간략하게 살펴볼 거고요 가상 머신 구축을 위한 프레임워크 사용법을 확인한 후 macOS에 대해 깊이 들어가 보겠습니다 가상 Mac 설정과 macOS 설치 방법을 보고 마지막으로 Linux에 대해 깊이 알아 보겠습니다 Linux 완전 배포판 실행 방식과 함께 몇 가지 특징을 살펴 보죠 먼저 가상화 기술이 뭔지 알아보겠습니다 먼저 가상화를 가능하게 하는 스택을 살펴 보겠습니다 모든 것은 하드웨어에서 시작되는데요 Apple Silicon에는 CPU와 메모리 가상화를 가능케 하는 하드웨어가 있죠 단일 SoC에 여러 개의 운영 체제 실행이 가능합니다 그 다음 하드웨어를 이용할 소프트웨어가 필요하죠 소프트웨어는 macOS 커널에 바로 구축됩니다 더이상 커널 확장 즉, KEXT가 필요 없죠 이미 구축되어 있으니까요 애플리케이션을 통해 이 기능을 활용하려면 Hypervisor 프레임워크를 사용해야 합니다 CPU와 메모리를 가상화하는 하위 수준 API이죠 하지만 하위 수준 프레임워크이기 때문에 가상 환경의 모든 상세 내용을 하나 하나 써주어야 합니다 다수 운영 체제를 전체 실행하려면 보다 고수준 API인 Virtualization 프레임워크가 필요합니다 이걸로 Apple Silicon에서 macOS를 Apple Silicon과 Intel에서 Linux를 실행할 수 있죠 오늘은 이 Virtualization 프레임워크 부분에 집중해 보겠습니다 이 프레임워크를 사용할 때에는 두 가지 객체가 필요한데요 첫 번째는 구성 객체입니다 가상 머신의 모든 속성을 정의하죠 두 번째는 가상 머신 객체입니다 이 둘은 가상 머신과 이들의 상호 작용 방식을 추상화합니다 먼저 구성 객체부터 살펴보죠 설정은 하드웨어를 정의하고 하나의 설정을 만드는 것은 Apple Store에서 Mac을 구성하는 것과 같죠 CPU 갯수, 메모리 용량 장치 종류를 정의하는 겁니다 시작은 단순 구성부터 가능한데요 디스플레이를 추가하면 콘텐츠를 볼 수 있고 키보드를 추가하면 타이핑을 할 수 있습니다 트랙패드를 추가하면 UI와 상호 작용할 수 있고요 가상 머신 구성도 이와 유사합니다 하지만 가상 머신이니까 이 작업은 코딩으로 진행됩니다 다음으로 Swift에서 구성 코드 내용을 살펴봅시다 하드웨어 정의 작업은 매우 간단합니다 이 유형의 객체부터 시작하는데요 이건 모든 구성의 객체 식별자입니다 다음으로 우리 머신이 가질 CPU 갯수가 정의되고요 여기엔 CPU가 4개 있네요 그 다음 메모리 용량이 설정되죠 이 경우 메모리가 4GB네요 마지막으로는 가상 머신이 가질 장치가 정의됩니다 여기서는 단일 저장 장치와 부팅 디스크, 마우스와 같은 포인팅 장치가 설치되어 있네요 다양한 장치를 이용할 수 있습니다 설정 장치는 해결하고자 하는 문제에 따라 달라질 수 있고요 구성 객체를 살펴 봤는데요 구성 만들기는 이 객체로 시작됩니다 CPU, 메모리, 장치를 추가하는 곳이죠 다음으로 가상 머신 객체를 살펴 보겠습니다
Mac 기기를 받았다고 해봅시다 언박싱하고 시작해 봐야겠죠 하지만 지금 가상 머신을 다루는 것이니 이것도 코딩으로 해야 합니다 Swift를 통해 살펴보죠 먼저, 구성에서 VZVirtualMachine이라는 인스턴스를 만들 겁니다 이건 가상 하드웨어 인스턴스를 추상화하고요 우리에겐 운영할 수 있는 가상 머신이 있습니다 이 경우에는 시작하기 위해 start()를 호출해야 하고요 우리는 종종 가상 머신과 상호 작용핱텐데 이때 다른 객체가 우릴 도와줍니다 가령, 가상 디스플레이를 보여주고 싶다면 VZVirtualMachineView 객체를 사용할 수 있죠 뷰 객체 만들기로 시작하여 가상 머신을 virtualMachine 프로퍼티로 설정합니다 준비가 완료됐습니다 이제 NSView와 같은 객체를 사용할 수 있는데요 가상 머신 콘텐츠를 보기 위해 이걸 앱에 통합할 수 있습니다
구성 객체를 정리해 볼게요 구성은 이 객체에서 시작됩니다 여기서 CPU, 메모리 장치가 정의되죠 구성 객체에서 가상 머신을 만들게 됩니다 그리고 그 가상 머신 객체를 사용하게 될 거고요 가상 머신 자체를 추상화하려면 이 객체가 필요하고 콘텐츠를 보여주려면 그 다음 객체가 필요합니다 가상 머신 사용을 돕는 다른 객체들도 존재하고요 이렇게 가상 머신 정의 방식에 있어서 구성의 유연성에 대해 살펴 보셨는데요 아쉽지만 모든 특징을 살펴보기에는 시간이 부족합니다 따라서 이번 세션에서는 핵심 기능만 살펴보겠습니다 Apple 개발자 문서를 통해 이와 같은 것들도 살펴 보시길 바랍니다 지금까지 가상 머신 구축 방법을 알아 보았는데요 가상 머신 내 전체 운영 체제 실행 방식을 알아 보겠습니다 macOS부터 시작해 보죠 Virtualization 프레임워크는 Apple Silicon에서 macOS를 지원합니다 Virtualization 프레임워크를 구축하면서 macOS와 이 프레임워크를 함께 개발했었죠? 이를 통해 가상 머신 내에서 macOS가 실행될 때 효율성이 극대화됩니다 다음 살펴볼 내용은요 가상 머신을 가상 Mac 전환할 때 뭘 해야 할지 먼저 확인하고 가상 Mac에 macOS를 설치해 보겠습니다 그 다음 macOS에 필요한 특수 장치들을 살펴 볼게요 마지막으로 호스트 시스템과 가상 Mac 간 파일 공유에 관한 중요한 사용 사례를 살펴 보겠습니다
먼저 구성부터 시작하겠습니다 이전에 일반 가상 머신을 구축하는 방법을 살펴 봤는데요 이제 가상 머신을 Mac으로 만들어줄 속성을 추가할 겁니다 그렇다면 가상 Mac은 어떻게 만들 수 있을까요? 먼저, 특수 플랫폼을 정의해야 합니다 플랫폼이란 특정 가상 머신 유형의 모든 속성을 합친 하나의 객체를 뜻합니다 가상 Mac 하드웨어만 있는 3가지 플랫폼 속성이 있는데요 먼저, 하드웨어 모델입니다 원하는 가상 Mac 버전을 구체화하죠 다음은 보조 기억 장치입니다 이건 운영 체제에서 사용되는 비휘발성 메모리 형태이고요 마지막으로 머신 식별자가 있습니다 이건 실제 Mac의 전용 시리얼 넘버처럼 머신을 나타내는 특유의 숫자입니다 플랫폼에는 하드웨어를 설명하는 모든 구성 요소가 존재합니다 그러나 macOS를 부팅하려면 하나 이상의 요소가 필요하죠 이를 위해서는 특수 부트로더가 필요합니다 macOS 부트로더가 필요하죠 이제 Swift에서 어떻게 해야 할지 살펴볼까요? 우선 이전과 동일하게 시작되는데요 이전에 사용했던 코드죠 첫째 줄의 객체를 만듭니다 이건 가상 Mac을 위한 플랫폼 객체이고요 다음으로 하드웨어 모델이 필요하죠 이전에 저장해둔 것을 사용했는데요 가상 머신의 보조 기억 장치는 로컬 파일시스템 파일의 지원을 받습니다 여기서 파일 URL을 통해 초기 설정하고요 특수 식별자에는 이전에 저장해 두었던 객체가 필요합니다 새로 설치하기 위해서 새 식별자를 만들 수 있습니다 이렇게 3가지 속성을 설정했고 플랫폼이 준비되었습니다 이제 남은 건 구성 객체에 플랫폼을 배치하는 건데요 그렇게 하드웨어가 나타나면 부팅을 해야겠죠 VZMacBootLoader 객체로 부트로더를 설정해 주시면 머신 부팅 준비가 완료됩니다 지금까지 가상 Mac 정의와 시작 방법을 살펴 보았는데요 하지만 우리에게는 설치 소프트웨어가 필요합니다 macOS 설치는 3단계로 이루어지는데요 먼저, 설치하고자 하는 macOS 버전과 함께 복구 이미지를 다운로드해야 합니다 그 다음 해당 버전과 호환되는 구성을 만들어 주어야 합니다 마지막으로 호환 가상 머신에 복구 이미지를 설치합니다 먼저, 복구 이미지부터 다운로드하겠습니다 이건 개발자 웹사이트에서 다운로드하실 수 있는데요 여기선 가상화로 해결할 수 있습니다 안정된 macOS 최신 버전에 대한 객체를 만들기 위해 최상단의 객체를 호출해 주세요 다운로드 시 사용 가능한 URL 속성이 보이네요 우리는 다운로드한 macOS 버전과 호환되는 가상 머신을 만드려는 건데요 여기서도 가상화가 역할을 할 수 있습니다 복구 이미지 객체에 구성 요건 요청이 가능하거든요 복구 이미지가 현재 시스템에서 실행된다면 요건을 나열한 객체가 존재하는 거죠 요건에서 이 macOS 버전 실행에 필요한 하드웨어 모델을 얻을 수 있고요 하드웨어 복구 방법은 앞서 살펴 봤습니다 이렇게 새로운 하드웨어 모델을 얻을 수 있죠
요건에 중요한 속성이 2가지 포함되어 있네요 이 객체로 이 OS 버전에 몇 개의 CPU가 필요한지 메모리가 얼마나 필요한지 알 수 있습니다 드디어 설치 준비가 완료되었습니다 구성에서 새로운 가상 머신을 만드는 것으로 시작해 봤는데요 이제 인스톨러를 만들 차례입니다 인스톨러에는 인수가 2개 있습니다 우리가 만든 호환 가상 머신과 다운로드한 복구 이미지 경로 이렇게 2가지입니다 이제 install()을 호출하면 OS 실행 준비가 끝난 겁니다 가상 Mac을 설정하고 macOS를 설치했으니 Mac만의 특수 장치를 살펴 봅시다 첫 번째는 GPU Acceleration입니다 우리는 가상 Mac에 GPU의 기능을 노출하는 그래픽 장치를 만들었는데요 이건 가상 머신에서 Metal 실행이 가능하여 엄청난 그래픽 퍼포먼스를 즐길 수 있다는 뜻입니다 설정 방법을 보죠
먼저 그래픽 장치 구성부터 만듭니다 여기서는 이 객체를 사용할 거고요 다음으로 디스플레이를 부여하고 싶은데요 디스플레이 크기와 픽셀 밀도를 정의합니다 장치 구성은 이렇게 준비됐고요 이전처럼 주요 구성 객체에 배치합니다 우리 가상 머신의 그래픽 장치로요
다음으로 Mac과 상호작용하는 새로운 장치를 살펴 봅시다 macOS Ventura에서 가상 Mac에 대해 트랙패드 지원을 추가할 겁니다 새로운 트랙패드로 회전, 핀치투줌 등의 동작을 하는 것이 가능해지는 것이죠 이 새 장치에서는 macOS의 새 드라이버가 필요한데 그러려면 호스트 시스템과 가상 시스템에 모두 macOS 13 설치가 필요합니다 설정 방법을 살펴보죠 매우 쉽습니다 이렇게 새로운 객체를 만들어 가상 머신의 포인팅 장치로 배치합니다 이제 가상 Mac 뷰 사용 시 동작 사용이 가능해졌습니다 마지막으로 흔한 사용 사례를 살펴 보겠습니다 호스트 시스템과 가상 머신 간 파일을 공유하는 건데요 우리는 macOS 12에 Linux 파일 공유를 위해 Virtio를 도입했습니다 macOS Ventura에서 macOS 지원도 추가했고요 원하는 폴더를 가상 머신과 공유할 수 있게 된 거죠 호스트 시스템의 변화는 가상 머신에 즉각 반영되며 그 반대도 동일합니다 그럼 설정 방법을 살펴 볼까요? 먼저 우리가 공유하고자 하는 디렉토리 객체를 만듭니다 다음으로 공유 객체를 만들고요 단일 디렉토리 공유를 위해 다음 객체를 사용할 겁니다 다수를 공유하시려면 Single을 Multiple로 바꿔주세요 이제 공유 객체가 있으니 장치 객체가 필요하겠죠 하지만 그 전에 먼저 확인해야 할 게 있습니다 파일 시스템 장치는 태그로 식별되는데요 macOS Ventura에 장치를 자동 마운팅하라고 가상 머신에 말해주는 특별 태그가 추가됐습니다 여기서 이 특별 태그를 사용하고 있습니다 이제 장치도 완성되었고 특별 태그 사용도 가능합니다 구성 단일 디렉토리에서 공유 객체를 배치하고 마지막으로 이전과 같이 구성에 장치를 추가합니다 이제 데모를 통해 종합적으로 살펴 봅시다 기본 구성부터 시작하죠 이 객체로 시작하고 CPU, 메모리, 키보드 디스크를 배치합니다 가상 Mac을 만들어야 하는데 그러려면 플랫폼 설정부터 시작해야 하죠 정의된 객체를 사용할 겁니다 가상 Mac의 두 번째 요소는 부트로더인데요 macOS 부팅 방법을 알려면 부트로더가 필요합니다 플랫폼 부트로더를 배치하기 위해서는 다음을 호출해야 합니다 그 다음 장치를 설정해야겠죠 가속 그래픽을 설정하려고 하는데요 그러려면 다음을 진행해야 합니다 객체를 만들어서 디스플레이 크기와 픽셀 밀도를 정의한 다음 구성에 추가하는 거죠 그 다음 새 트랙패드를 사용해 볼 건데요 여기서는 포인팅 장치를 이 객체에 배치하기만 하면 됩니다 이게 끝이죠 이제 가상 머신 실행 전에 마무리 작업을 해 봅시다 디렉터리 공유 방법 기억하시나요? 여기서 해볼게요 파일시스템 장치 구성을 만드는 것부터 시작했는데요 macOS에 자동 마운트해주는 특별 태그에 주목하세요 그 다음 공유 객체를 정의합니다 우리는 파일시스템 경로에 있는 단일 디렉토리를 공유할 건데요 지금 편집 중인 프로젝트를 공유해 보도록 하겠습니다
구성에 장치를 추가하면 끝납니다 모두 준비됐으니 앱을 시작해 볼까요? MacGraphics 장치를 구성했기 때문에 콘텐츠가 보일 겁니다 창에 이런 모습이 나타나는데요 다 됐습니다 macOS 구성이 완료됐네요 여기서 공유 디렉토리와 이 프로젝트 확인도 가능합니다 마지막으로 Linux에 대해 살펴 보도록 하죠 Virtualization 프레임워크는 macOS Big Sur의 시작부터 Linux를 지원했습니다 macOS Ventura에서 새로운 기능이 추가되었고 그걸 오늘 여러분과 공유하겠습니다
먼저, 가상 머신에서 전혀 손을 대지 않은 Linux 배포판을 설치해 볼게요 Linux UI를 보기 위한 추가 장치를 알아 본 후 Linux 바이너리를 가상 머신에서 실행하기 위해 Rosetta 2를 어떻게 이용할 수 있을지 확인해 보죠 설치부터 시작해 봅시다 실제 머신에 Linux를 설치하려면 인스톨러로 ISO 파일을 먼저 다운로드해야 합니다 그 다음 ISO 파일로 플래시 드라이브를 지우고 마지막으로 드라이브를 컴퓨터에 꽂아 부팅해야 하죠 가상 머신에서도 동일하게 진행됩니다 실제 USB 드라이브가 아닌 가상 드라이브를 사용하지만요 한 번 볼까요? 먼저 다운로드한 ISO 파일로 이어지는 경로 URL을 만듭니다 그 다음 파일에서 디스크 이미지 첨부 파일을 만들고요 이건 장치에 장착할 수 있는 저장 공간을 뜻합니다 다음으로 가상 저장 장치를 구성하는데 이 경우 USB 저장 장치이니 다음 객체를 사용합니다 마지막으로 언제나 그렇듯 주요 구성에 우리의 장치를 추가합니다 여기서 USB 장치는 우리가 Linux를 설치할 때 사용할 메인 디스크로 나타납니다 이제 USB 드라이브도 있지만 부팅 방법이 필요한데요 우리는 macOS Ventura에 EFIR 지원 기능을 추가했습니다 EFI는 ARM, Intel 하드웨어 부팅이 가능한 산업 표준입니다 가상 머신에도 동일하게 지원해 볼거고요 EFI는 부트 검색 메커니즘을 특징으로 합니다 이를 통해 USB 드라이브의 인스톨러를 검색할 수 있죠 EFI는 모든 드라이브를 보고 부팅될 수 있는 걸 찾습니다 인스톨러를 찾게 되면 거기서부터 시작되죠 인스톨러 스스로 EFI에게 다음 드라이브를 알려줍니다 설치가 되면 Linux 배포가 시작될 수 있고요 코딩으로 EFI 설정을 해보죠 먼저, 이 객체를 통해 부트로더를 만듭니다 EFI는 비휘발성 메모리로 부트 간 정보를 저장해야 하죠 이걸 EFI 변수 스토어라고 부릅니다 가상 머신에서는 파일시스템의 파일을 통해 그러한 저장 공간을 지원할 수 있죠 여기서는 새로운 변수 스토어를 처음부터 만들었습니다 이제 EFI가 준비됐고요 구성에서 부트로더로 배치해야겠죠 이제, Linux 가상 머신의 새로운 기능인 그래픽을 볼게요 우리는 macOS Ventura에서 Virtio GPU 2D 지원을 추가했습니다 이건 Linux가 호스트 macOS에 대한 표면을 제공하는 반가상화 장치입니다 Linux는 콘텐츠를 렌더링하고 렌더링된 프레임을 Virtualization 프레임워크에 전달하면 그게 화면에 나타납니다 macOS에서처럼 여러분의 앱에서도 이 콘텐츠를 볼 수 있는 거죠 설정 방법을 살펴 보죠
장치 설정은 macOS에서 했던 것과 비슷합니다 이 객체를 만드는 것으로 시작하고요 가상 디스플레이 크기도 정의해야겠죠 Virtio에서는 가상 디스플레이를 '스캔아웃'이라고 합니다 이렇게 하나의 스캔아웃을 만들고 마지막으로 새로운 장치를 우리 구성의 그래픽 장치로 배치합니다 이제 우리의 가상 머신에서 콘텐츠를 보여줄 수 있습니다 다음으로 데모를 통해 종합적으로 살펴 보죠 아까 했던 부분부터 시작하죠 Mac 전용 코드는 지웁니다 그 다음 부팅하려는 디스크를 변경해 보죠 Mac에서 Linux 드라이브로 경로를 바꿀 겁니다 다음으로 부트로더가 필요하죠 이 객체를 통해 EFI를 설정합니다 처음으로 EFI 부트로더 객체를 만들었네요 그 다음 이 파일에서 변수 스토어를 로딩합니다 마지막으로 EFI를 우리 구성의 부트로더로 배치합니다 이제 부팅은 가능해졌지만 UI를 보여줘야 하는데요 Virtio GPU를 구성에 추가해 보겠습니다 그래픽 장치를 만들기 위해 다음을 입력하시고요 가상 디스플레이 크기를 스캔아웃으로 정의합니다 Virtio GPU가 우리 구성에 배치됐네요 마지막으로 마우스가 작동해야겠죠 가상 USB 스크린 좌표 포인터 장치를 사용하면 Linux에서 마우스 사용이 가능해질 겁니다 여기까집니다 이제 실행이 가능합니다 EFI는 디스크를 살펴 부팅이 가능한지 확인합니다 그럼 Virtio GPU 장치를 통해 UI 콘텐츠가 나타나죠 이제 Linux에서 마우스 사용이 가능해졌습니다 마지막이지만 중요한 내용인데요 Linux에서의 Rosetta 2 사용법을 알아보겠습니다 Mac에서 서비스를 개발하는 건 너무 좋지만 작업이 준비되면 x86 서버에서 바이너리를 실행해야 할지도 모릅니다 이를 위해서는 x86 명령어 에뮬레이션이 필요했었지만 이제 우린 다른 방법을 사용할 수 있습니다 우리는 macOS Ventura에서 Rosetta 2의 힘을 가져올 겁니다
Rosetta 2는 Linux x86-64를 가상 머신 내부로 옮겨줄 겁니다 이로써 가장 인기 있는 ARM Linux 배포판 실행과 Rosetta에서의 x86-64 앱 실행이 가능해지는 겁니다 속도도 빠릅니다 우리가 Mac에서 사용해 온 기술과 동일하고요 퍼포먼스가 뛰어나다는 뜻이겠죠 그럼 사용 방법을 살펴 봅시다 먼저 Linux의 Rosetta 접근이 가능해야 합니다 이를 위해 macOS와 동일한 파일 공유 기술을 사용합니다 폴더 공유 대신 특정 객체를 사용하죠 다음 객체입니다 공유 장치를 만든 후 Rosetta 디렉토리 공유를 설정합니다 마지막으로 항상 하던 대로 구성에 장치를 설정하고요 이제 우리의 가상 머신에서 Rosetta를 사용할 수 있습니다 다음으로 Linux가 어떻게 이용할 수 있는지 보죠
여기서는 우선 파일 시스템의 공유 디렉토리를 마운팅합니다 Linux에 앱 변환이 가능한 Rosetta 바이너리가 보이네요 업데이트 bin 포맷을 통해 시스템에 Rosetta를 사용해 x86-64 바이너리 처리를 명령할 수 있습니다 이 명령어도 외우실 필요 없습니다 Apple 개발자 문서에 있으니까요 이렇게 Linux 준비도 완료되었습니다 시작된 모든 x86-64 바이너리는 Rosetta로 옮겨질 겁니다
Linux 섹션을 끝내기 전에 전체적으로 살펴 보죠 Linux 배포판을 처음부터 설치했고요 Virtio GPU 2D를 통해 UI를 볼 수 있습니다 Rosetta를 통해 PHP 서버 실행이 가능하고요 macOS 호스트와 연결할 수도 있습니다
가상 머신 만들기 정말 쉽습니다 Virtualization 프레임워크만 있으면 코드 몇 줄만으로도 가상 머신 실행이 가능하죠 macOS에서의 실행 속도도 엄청났잖아요 가상화에 대해 더 알고 싶으시다면 코드 샘플과 개발자 문서를 확인해 보시길 바라겠습니다 이 기술로 여러분들이 무엇을 보여주실지 손꼽아 기다리고 있겠습니다
-
-
4:11 - Running the virtual machine
let virtualMachine = VZVirtualMachine(configuration: configuration) try await virtualMachine.start()
-
4:33 - Showing the virtual machine’s display
let virtualMachineView = VZVirtualMachineView() virtualMachineView.virtualMachine = virtualMachine
-
7:43 - Start from the base
var configuration = VZVirtualMachineConfiguration() configuration.cpuCount = 4 configuration.memorySize = (4 * 1024 * 1024 * 1024) as UInt64 configuration.storageDevices = [newBlockDevice()] configuration.pointingDevices = [newPointingDevice()]
-
7:47 - Set up the platform
let platform = VZMacPlatformConfiguration() let hardwareModel = VZMacHardwareModel(dataRepresentation: savedHardwareModel) platform.hardwareModel = hardwareModel! let auxiliaryStorage = VZMacAuxiliaryStorage(contentsOf: auxiliaryStorageURL) platform.auxiliaryStorage = auxiliaryStorage let machineIdentifier = VZMacMachineIdentifier(dataRepresentation: savedIdentifier) platform.machineIdentifier = machineIdentifier! configuration.platform = platform
-
8:31 - Boot loader
configuration.bootLoader = VZMacOSBootLoader()
-
9:16 - 1. Getting an image
let restoreImage = try await VZMacOSRestoreImage.latestSupported try await download(restoreImage.url)
-
9:29 - 2. Create a compatible configuration
let requirements = restoreImage.mostFeaturefulSupportedConfiguration guard let requirements = requirements else { // No compatible configuration. return } platform.hardwareModel = requirements.hardwareModel configuration.cpuCount = requirements.minimumSupportedCPUCount configuration.memorySize = requirements.minimumSupportedMemorySize
-
10:10 - 3. Install macOS
let virtualMachine = VZVirtualMachine(configuration: configuration) let installer = VZMacOSInstaller(virtualMachine: virtualMachine, restoringFromImageAt: imageURL) try await installer.install()
-
10:58 - Setting up GPU acceleration
let graphicsConfiguration = VZMacGraphicsDeviceConfiguration() graphicsConfiguration.displays = [ VZMacGraphicsDisplayConfiguration(widthInPixels: 1920, heightInPixels: 1200, pixelsPerInch: 80) ] configuration.graphicsDevices = [graphicsConfiguration]
-
11:48 - Setting up the Mac trackpad
let trackpad = VZMacTrackpadConfiguration() configuration.pointingDevices = [trackpad]
-
12:33 - Share a folder
let sharedDirectory = VZSharedDirectory(url: directoryURL, readOnly: false) let share = VZSingleDirectoryShare(directory: sharedDirectory) let tag = VZVirtioFileSystemDeviceConfiguration.macOSGuestAutomountTag let sharingDevice = VZVirtioFileSystemDeviceConfiguration(tag: tag) sharingDevice.share = share configuration.directorySharingDevices = [sharingDevice]
-
16:10 - Setting up USB Mass Storage device configuration
let diskImageURL = URL(fileURLWithPath: "linux.iso") let attachment = try! VZDiskImageStorageDeviceAttachment(url: diskImageURL, readOnly: true) let usbDeviceConfiguration = VZUSBMassStorageDeviceConfiguration(attachment: attachment) configuration.storageDevices = [usbDeviceConfiguration, createBlockDevice()]
-
17:27 - Booting Linux
let efi = VZEFIBootLoader() efi.variableStore = VZEFIVariableStore(creatingVariableStoreAt: storeURL, options: []) configuration.bootLoader = efi
-
18:24 - Setting up Virtio graphics
let virtioGPU = VZVirtioGraphicsDeviceConfiguration() virtioGPU.scanouts = [ VZVirtioGraphicsScanoutConfiguration(widthInPixels: 1280, heightInPixels: 720) ] configuration.graphicsDevices = [virtioGPU]
-
21:02 - Setting up Rosetta
let rosettaDirectoryShare = try! VZLinuxRosettaDirectoryShare() let directorySharingDevice = VZVirtioFileSystemDeviceConfiguration(tag: "RosettaShare") directorySharingDevice.share = rosettaDirectoryShare configuration.directorySharingDevices = [directorySharingDevice]
-
21:37 - Setting up Linux
mount -t virtiofs RosettaShare /mnt/Rosetta sudo /usr/sbin/update-binfmts --install rosetta /mnt/Rosetta/rosetta \ --magic "\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00" \ --mask "\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff" \ --credentials yes --preserve no --fix-binary yes
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.