SSD Nodes Learn Hosting plans →
Hướng dẫn Matt ConnorBởi Matt Connor

Solaris đến illumos: fork Unix vẫn còn tồn tại

Sun xây dựng ZFS và DTrace trong Solaris, rồi mở mã nguồn năm 2005. Oracle mua Sun năm 2010 và đóng lại, còn illumos tiếp tục phát triển fork này.

Solaris và illumos là gì

Solaris và illumos là hai nhánh của cùng một cây mã nguồn Unix. Sun Microsystems phát triển Solaris và công bố phần lớn mã nguồn vào năm 2005. Oracle mua lại Sun vào năm 2010 rồi ngừng công bố mã nguồn đó. Vì vậy, các nhà phát triển bên ngoài Oracle tiếp tục phát triển phần mã nguồn mở dưới một tên mới: illumos. Bản thân hệ điều hành này khá ít phổ biến trong năm 2026. Nhưng lớp storage và công cụ tracing được xây dựng bên trong nó thì không. Đó là lý do lịch sử này đáng để bạn tìm hiểu.

Nếu bạn chạy ZFS trên Linux hoặc FreeBSD, bạn đang chạy mã được viết tại Sun cho Solaris và đã tồn tại lâu hơn cả công ty, dòng sản phẩm lẫn tranh chấp về license. Bài viết này kể lại quá trình đó, với các mốc thời gian đã được kiểm tra.

Nguồn gốc của Solaris: BSD, System V và SVR4

Sun Microsystems được thành lập vào ngày 24 tháng 2 năm 1982 bởi Scott McNealy, Andy Bechtolsheim, Vinod Khosla và Bill Joy. Hệ điều hành của hãng là SunOS, bắt nguồn từ BSD (Berkeley Software Distribution), dòng Unix đại học mà Bill Joy đã phát triển trước khi Sun tồn tại. Dòng Unix còn lại là System V của AT&T, được bán thương mại. Hai nhánh này là sự phân tách được mô tả trong cây phả hệ Unix kết thúc ở Linux, và Sun thuộc phía BSD trong một thập kỷ.

Năm 1987, Sun và AT&T công bố một dự án chung nhằm hợp nhất BSD, System V và Xenix thành một bản phát hành duy nhất: UNIX System V Release 4, thường được viết là SVR4. Ngày 4 tháng 9 năm 1991, Sun thông báo SunOS 4 sẽ được thay thế bằng một hệ thống bắt nguồn từ SVR4 với tên marketing mới là Solaris 2. Solaris 2.0 được phát hành vào tháng 6 năm 1992, chỉ chạy trên phần cứng SPARC. Sun đã đổi phía trong cuộc phân tách Unix, và khách hàng của hãng phải port phần mềm của họ.

Tên cũ không bao giờ biến mất. Kernel vẫn giữ cách đánh số của SunOS, nên Solaris 2.6 chạy SunOS 5.6, còn Oracle Solaris 11.4 vẫn tự nhận là SunOS 5.11. Chạy uname -a trên một máy illumos vào năm 2026, từ đầu tiên được in ra vẫn là SunOS, vì illumos kế thừa tên này cùng với code.

Solaris 10 giới thiệu gì vào năm 2005

Solaris 10 được phát hành vào ngày 31 tháng 1 năm 2005. Phiên bản này quan trọng ở đây vì mọi thành phần còn tồn tại sau khi công ty thay đổi đều đã có trong bản phát hành đó hoặc xuất hiện trong một bản update của nó.

DTrace được Bryan Cantrill, Mike Shapiro và Adam Leventhal viết tại Sun, và lần đầu có mặt vào tháng 11 năm 2003. DTrace instrument kernel đang chạy và các user process đang chạy mà không cần compile lại bất kỳ thứ gì, cũng không cần restart process đang được monitor. Một probe chưa được enable không tốn chi phí nào, vì instrumentation chỉ được patch vào khi script yêu cầu. Đây là lý do các administrator sẵn sàng dùng DTrace trên máy production. DTrace giành giải cao nhất trong The Wall Street Journal's 2006 Technology Innovation Awards và một giải của USENIX STUG (Software Tools User Group) vào năm 2008.

ZFS được Jeff Bonwick, Bill Moore và Matthew Ahrens thiết kế tại Sun, và được công bố vào ngày 14 tháng 9 năm 2004. ZFS hợp nhất volume manager và filesystem vào một layer. Nhờ đó, ZFS có thể checksum từng block khi đọc và repair block bị lỗi từ một bản copy dự phòng. Hoạt động ghi dùng cơ chế copy on write: block không bao giờ bị overwrite tại chỗ. Vì vậy, nếu hệ thống crash giữa lúc ghi, dữ liệu cũ vẫn nguyên vẹn thay vì để lại một filesystem bị ghi dở. Snapshot gần như không tốn chi phí, vì snapshot chỉ đơn giản là tập hợp các block mà những lần ghi sau đó không thay đổi. ZFS không có trong bản phát hành Solaris 10 ban đầu. ZFS được phát hành trong bản update Solaris 10 6/06 vào tháng 6 năm 2006.

Zones là mảnh ghép thứ ba. Một zone cho phép một kernel cung cấp nhiều user space bị cô lập, mỗi user space có root filesystem, process table và network configuration riêng. Zones xuất hiện trong một bản beta của Solaris 10 vào tháng 2 năm 2004 và được phát hành cùng bản release đầy đủ. FreeBSD đã đạt đến ý tưởng tương tự sớm hơn theo một hướng khác, và so sánh giữa jail và Docker container vẫn là cách rõ nhất để hiểu isolation ở cấp kernel thực sự là gì. Zones hiện vẫn tồn tại trong illumos và là nền tảng của ít nhất một distribution được đề cập bên dưới.

Vì sao Sun công khai mã nguồn Solaris

Sun đã đệ trình CDDL (Common Development and Distribution License) lên OSI (Open Source Initiative) vào ngày 1 tháng 12 năm 2004, và OSI phê duyệt giấy phép này vào ngày 14 tháng 1 năm 2005. CDDL dựa trên phiên bản 1.1 của MPL (Mozilla Public License). Cơ chế copyleft của CDDL áp dụng ở cấp từng file: file mã nguồn CDDL phải tiếp tục dùng CDDL, nhưng binary được build từ file đó có thể kết hợp với code theo các điều khoản khác.

DTrace được công khai trước. Mã nguồn của DTrace được phát hành theo CDDL vào ngày 25 tháng 1 năm 2005 trên website opensolaris.org mới ra mắt, trước khi Solaris 10 được release 6 ngày. Phần lớn code hệ thống Solaris được công khai tiếp vào ngày 14 tháng 6 năm 2005. ZFS được tích hợp vào main development trunk của Solaris vào ngày 31 tháng 10 năm 2005 và đến tay các developer OpenSolaris trong build 27 vào ngày 16 tháng 11 năm 2005. OpenSolaris cũng trở thành một distribution có thể cài đặt: bản 2008.05 xuất hiện vào ngày 5 tháng 5 năm 2008 dưới dạng live CD, còn bản 2009.06 xuất hiện vào ngày 1 tháng 6 năm 2009 với hỗ trợ SPARC.

Lựa chọn license này vẫn quyết định những gì bạn có thể chạy ngày nay. Free Software Foundation xếp CDDL vào nhóm free software license nhưng không tương thích với GPL (GNU General Public License). Sự không tương thích này kế thừa từ MPL 1.1. Linux kernel sử dụng GPLv2. Vì vậy, ZFS on Linux được build dưới dạng kernel module bên ngoài kernel source tree thay vì được merge vào kernel, và không nằm trong mainline kernel. Quyết định công khai mã nguồn theo một open license mới là yếu tố quan trọng nhất đối với phần còn lại của câu chuyện này, và lịch sử cấp phép mã nguồn mở giải thích vì sao một công ty lại đưa ra quyết định đó.

Điều gì xảy ra khi Oracle mua Sun

Oracle thông báo vào ngày 20 tháng 4 năm 2009 rằng họ sẽ mua Sun với giá 7.4 tỷ USD, hoặc 5.6 tỷ USD sau khi trừ tiền mặt và nợ của Sun. Thương vụ hoàn tất vào ngày 27 tháng 1 năm 2010.

Ngày 13 tháng 8 năm 2010, một memo nội bộ của Oracle do Mike Shapiro, Bill Nesheim và Chris Armes soạn đã được lưu hành trong công ty rồi bị rò rỉ. Memo nêu trực tiếp chính sách mới: “Chúng tôi sẽ không còn phân phối source code của toàn bộ hệ điều hành Solaris theo thời gian thực trong quá trình phát triển, trên cơ sở hằng đêm.” Chính sách này loại trừ các bản build cộng đồng tiếp theo: “Chúng tôi sẽ không phát hành bất kỳ bản phân phối binary nào khác, chẳng hạn các bản build binary hằng đêm hoặc 2 tuần một lần của Solaris, hay bản phân phối OpenSolaris 2010.05 hoặc mới hơn.” Các bản phát hành open source sẽ thay vào đó đi theo các sản phẩm đã phát hành: “Chúng tôi sẽ phân phối các bản cập nhật cho code được cấp phép theo CDDL hoặc giấy phép open source khác sau các bản phát hành đầy đủ của hệ điều hành Solaris enterprise.”

Ngày 23 tháng 8 năm 2010, OpenSolaris Governing Board thông qua một nghị quyết ghi nhận rằng Oracle chưa bổ nhiệm liaison cho hội đồng và đã thông báo chấm dứt quan hệ đối tác phát triển vào ngày 13 tháng 8. Hội đồng bỏ phiếu trả quyền kiểm soát cộng đồng về cho Oracle theo charter do Sun soạn ban đầu; việc này giải thể hội đồng.

Oracle Solaris 11 được phát hành vào ngày 9 tháng 11 năm 2011. Ngày 2 tháng 9 năm 2017, Oracle cho thôi việc phần lớn các team Solaris. Oracle Solaris 11.4 được phát hành vào ngày 28 tháng 8 năm 2018 và vẫn là release hiện tại, tiếp tục nhận các bản cập nhật từ support repository vào tháng 7 năm 2026. Khi Oracle sửa đổi lần gần nhất chính sách hỗ trợ theo vòng đời cho 11.4 vào tháng 1 năm 2024, họ giữ Premier Support đến năm 2031 và kéo dài Extended Support từ năm 2034 đến năm 2037. Vì vậy, Solaris là một sản phẩm thương mại vẫn được hỗ trợ, có ngày kết thúc được công bố, trên một release đã hiện hành từ năm 2018.

illumos bắt đầu như thế nào và vì sao được gọi là một fork

Ngày 3 tháng 8 năm 2010, mười ngày trước khi bản ghi nhớ bị rò rỉ, Garrett D'Amore công bố illumos. Tên này ghép illum, tiếng Latin nghĩa là ánh sáng, với OS, viết tắt của operating system. Dự án viết tên này thành một từ, chỉ viết hoa chữ cái đầu tiên.

Mục tiêu là OS/Net, thường được viết là ON: consolidation chứa kernel và các tiện ích hệ thống cốt lõi. OpenSolaris chưa bao giờ hoàn toàn mở. Một số thành phần được phát hành dưới dạng binary đóng mà không ai bên ngoài Sun có thể build lại, trong đó có mã internationalisation bên trong thư viện C (libc_i18n), NFS lock manager, cryptographic framework, các driver như mpt driver cho LSI host bus adapter và một phần code cho nền tảng SPARC. Thay thế các thành phần đó là công việc đầu tiên của dự án, vì một operating system không thể build từ source thì cũng không thể được maintain.

D'Amore thận trọng khi dùng từ fork. Ông viết: “Hôm nay chúng tôi chưa phải là một fork, vì cách chúng tôi theo dõi OS/Net”, khi mô tả một downstream repository sẽ theo dõi tree của Oracle và có thể gửi các thay đổi ngược lên upstream. Mười ngày sau, upstream ngừng công bố mã nguồn. illumos mặc nhiên trở thành một fork vì không còn gì để theo dõi. Core tree, illumos-gate, đã vượt 23,000 commit tính đến tháng 10 năm 2026 và vẫn tiếp tục nhận commit mới.

Những distribution nào được xây dựng từ illumos

illumos không phải là thứ bạn cài đặt trực tiếp. Đây là cây mã nguồn lõi, còn các distribution xây dựng một hệ thống có thể sử dụng bên trên nó. Những distribution sau vẫn còn được phát hành.

  • OpenIndiana được ra mắt chính thức vào ngày 14 September 2010 tại JISC Centre ở London. Đây là hậu duệ gần nhất của distribution OpenSolaris dành cho desktop và server trước đây. OpenIndiana là một rolling release có tên Hipster. Snapshot 2026.04 được phát hành vào ngày 5 May 2026.
  • OmniOS là một distribution dành cho server. Hiện cộng đồng duy trì distribution này dưới tên OmniOS CE, sau khi vendor ban đầu ngừng phát triển.
  • SmartOS là một nền tảng hypervisor xây dựng trên zones. Joyent tạo ra nền tảng này và thông báo vào April 2022 rằng SmartOS và Triton sẽ được chuyển sang MNX Solutions, có hiệu lực từ 1 May 2022.
  • NexentaStor dùng cùng base cho các storage appliance. Đây là dòng sản phẩm thương mại mà illumos phát triển từ đó.
  • Tribblix là một distribution nhỏ do Peter Tribble duy trì, được mô tả bên dưới.
  • DilOS đưa bộ công cụ quản lý package của Debian lên trên kernel illumos.

Cài đặt một hệ thống illumos hiện nay

Tribblix là ví dụ hữu ích vì hệ thống này nhỏ, có tài liệu công khai và vẫn được phát hành. Milestone 41 cho x86 được phát hành ngày 5 August 2026. Nhánh SPARC chuyển sang Milestone 35 ngày 23 September 2026. Đây là một bản phát hành tổng hợp, đưa các package mới hơn, trong đó có gcc 10, lên trên hệ điều hành Milestone 34; ISO cài đặt SPARC bạn tải xuống vẫn là Milestone 34. Dự án tự mô tả là phong cách retro với các thành phần hiện đại. Dự án vẫn giữ định dạng package SVR4 mà Solaris sử dụng thay vì chuyển sang hệ thống package mới hơn.

Quá trình cài đặt chạy từ một live image. Bạn boot ISO, đăng nhập bằng user jack với password jack, chuyển sang root rồi chạy installer trên một disk device. Đây là command được tài liệu cài đặt chính thức của dự án cung cấp:

./live_install.sh -G c1t0d0

Flag -G ghi layout phân vùng EFI (extensible firmware interface), còn -b chọn layout MBR (master boot record) legacy. Tên disk tuân theo quy ước cXtYdZ của Solaris thay vì /dev/sda. Đây là điểm đầu tiên sẽ trông lạ nếu bạn xuất phát từ Linux. Các software set được gọi là overlay và có thể chỉ định trên cùng một dòng:

./live_install.sh -G c1t0d0 develop desktop

Sau khi cài đặt, công cụ package là zap. Công cụ này hoạt động trên các overlay và tự xử lý dependency cho bạn:

zap refresh
zap install-overlay develop
zap update-overlay -a

Đó là các command Tribblix công bố. Chúng chạy trên hardware hoặc hypervisor do bạn kiểm soát. Bạn sẽ không tìm thấy Tribblix dưới dạng image one-click trong control panel của VPS. SmartOS là ngoại lệ trong các hệ thống illumos: MNX, công ty tiếp quản SmartOS từ Joyent, cung cấp lựa chọn “Linux, FreeBSD hoặc SmartOS” thông qua cloud control panel riêng (đã kiểm tra ngày 12 October 2026). Ngoài trường hợp đó, image illumos trong danh sách của provider vẫn hiếm. Đây là thực trạng triển khai illumos vào năm 2026.

Vì sao ZFS và DTrace tồn tại lâu hơn Solaris

ZFS rời Solaris gần như ngay sau khi mã nguồn được công bố. Pawel Jakub Dawidek đã port ZFS sang FreeBSD, nơi ZFS trở thành một phần của hệ thống từ FreeBSD 7.0 vào năm 2008. Công việc triển khai ZFS native cho Linux bắt đầu vào năm 2008 và cho ra bản stable đầu tiên vào năm 2013. Từ năm 2010 đến năm 2013, illumos giữ bản sao tham chiếu của mã nguồn ZFS, vì cây mã nguồn của Oracle đã bị đóng và mọi bản port khác cần một nơi để lấy mã nguồn. Đây là giá trị cụ thể của fork: nếu không có fork đó, các bản port sẽ không có common ancestor để merge.

Dự án OpenZFS được công bố vào ngày 17 tháng 9 năm 2013 để điều phối các bản port đó, với Matt Ahrens, một trong những tác giả ZFS ban đầu, là một trong các founder. OpenZFS 2.0 được phát hành vào ngày 30 tháng 11 năm 2020. Release notes nêu rõ kết quả: "The ZFS on Linux project has been renamed OpenZFS! Both Linux and FreeBSD are now supported from the same repository making all of the OpenZFS features available on both platforms." FreeBSD 13.0 đã bỏ bản sao riêng bắt nguồn từ illumos và chuyển sang cây mã nguồn dùng chung đó.

Hai dòng ZFS đã phân kỳ ở cấp disk format. Dòng mở dừng ở pool version 28, là version cuối cùng Sun công bố, rồi chuyển sang dùng named feature flags dưới placeholder version 5000. Vì vậy, pool quảng bá các feature mà nó sử dụng thay vì chỉ dùng một số version. Oracle tiếp tục tăng các version number riêng trong mã nguồn đóng. Pool được tạo sau version 28 ở một bên không thể import ở bên kia. Nếu bạn đang chọn nơi chạy ZFS, OpenZFS hoạt động như thế nào trên FreeBSD so với Linux giải thích những điểm thực sự khác nhau giữa hai host.

DTrace di chuyển trên quãng đường ngắn hơn. DTrace đã là thành phần tiêu chuẩn trong FreeBSD từ 7.1 vào tháng 1 năm 2009, và Apple thêm DTrace vào Mac OS X 10.5 Leopard. Oracle phát hành kernel code của DTrace theo GPLv2 vào tháng 8 năm 2017. Thay đổi này được chú ý rộng rãi vào tháng 2 năm 2018 và đã gỡ bỏ rào cản license đối với Linux. DTrace chưa bao giờ được merge vào mainline kernel. Trên thực tế, Linux tracing chạy trên eBPF, và bpftrace cung cấp cho nó một scripting language được thiết kế gần với D của DTrace.

Điểm chính là pattern này mang tính tổng quát, không chỉ áp dụng cho Solaris. Sun đã công bố ZFS và DTrace theo một license cho phép người khác giữ một bản copy và tiếp tục phát triển. Khi công ty tài trợ cho công việc đó dừng hoạt động, công việc vẫn tiếp tục vì code đã nằm trong các cây mã nguồn và được những người khác duy trì. Những phần của Solaris chưa từng được mở, bao gồm các binary đóng mà illumos phải viết lại, đã biến mất cùng công ty. Đó là tác động của việc open source, và cũng là cơ chế đứng sau cách các Linux distribution kế thừa lẫn nhau.

Bạn có nên chạy illumos trên VPS?

Với gần như mọi người, câu trả lời là không. Những nội dung trên không phải là khuyến nghị bạn thử illumos. illumos hỗ trợ phạm vi phần cứng khá hẹp, vì bộ driver của nó gồm các driver từng được Sun hỗ trợ và những driver do một cộng đồng nhỏ phát triển sau đó. Hầu hết nhà cung cấp VPS chỉ công bố image Linux và BSD. Ngoại lệ là MNX, đơn vị đã tiếp quản SmartOS từ Joyent và cung cấp SmartOS cùng với Linux và FreeBSD trên cloud riêng của mình. Ở nơi khác, cài illumos thường có nghĩa là tải ISO của bạn lên một nhà cung cấp cho phép dùng image tùy chỉnh, rồi kiểm tra xem các thiết bị disk ảo và network có được nhận diện hay không. Phần mềm bên thứ ba đến từ bộ package riêng của distribution hoặc từ compiler của bạn.

Có những lý do thực tế để chạy illumos: bạn cần duy trì một workload Solaris, đã vận hành một hệ thống zones, hoặc muốn đọc source code. Các distribution được liệt kê ở trên vẫn được duy trì và mailing list của chúng có thể trả lời câu hỏi. Đây là một lựa chọn khác với việc chọn illumos làm mặc định cho một server mới.

Nếu bạn tìm hiểu illumos vì ZFS, bạn không cần illumos để sử dụng ZFS. Hãy chạy OpenZFS trên Linux hoặc FreeBSD, nơi OpenZFS đã được đóng package, có tài liệu và được triển khai rộng rãi. Nếu bạn đang cân nhắc phía BSD của cùng họ hệ điều hành này cho một server, bài so sánh thực tế giữa Linux và FreeBSD dưới vai trò nền tảng server giải thích những điểm thay đổi trong vận hành hằng ngày. illumos là nguồn gốc của các công cụ này. Biết chúng bắt nguồn từ đâu sẽ giúp giải thích nhiều hành vi của chúng, bắt đầu từ lý do zpool và zfs có cảm giác hoàn toàn khác với phần còn lại của storage stack trên Linux.

FAQ

illumos có phải là OpenSolaris không?

Không. OpenSolaris là dự án và bản phân phối của Sun, sau đó thuộc Oracle, và Oracle đã kết thúc dự án này vào năm 2010. illumos là một dự án riêng, được công bố vào ngày 3 August 2010, xây dựng từ mã nguồn lõi OpenSolaris được công bố lần cuối, tức phần hợp nhất OS/Net. Nhiệm vụ đầu tiên của dự án là thay thế các thành phần binary đóng mà OpenSolaris đã phát hành, gồm libc_i18n, NFS lock manager, cryptographic framework và một số driver. Sau năm 2010, không có mã illumos nào đến từ Oracle vì Oracle đã ngừng công bố mã nguồn.

Vì sao Linux không thể đưa ZFS vào kernel?

Các giấy phép không tương thích. ZFS dùng CDDL. Free Software Foundation xếp CDDL là giấy phép phần mềm tự do nhưng không tương thích với GPL. CDDL kế thừa điểm không tương thích này từ MPL 1.1. Linux kernel dùng GPLv2. Kết quả thực tế là OpenZFS trên Linux được phát hành dưới dạng kernel module ngoài cây mã nguồn. Module này thường được DKMS build cho từng kernel bạn cài đặt, hoặc được cung cấp dưới dạng package module đã build sẵn. Module hoạt động tốt, nhưng phải build lại sau mỗi kernel mới. Vì vậy, module có thể chậm hơn một bản phát hành kernel mới từ vài ngày đến vài tuần.

Oracle Solaris còn được hỗ trợ không?

Có. Oracle Solaris 11.4 được phát hành vào ngày 28 August 2018 và đến July 2026 vẫn là bản phát hành hiện tại, vẫn nhận các bản cập nhật từ support repository. Chính sách hỗ trợ vòng đời của Oracle, được sửa đổi gần nhất cho 11.4 vào January 2024, cung cấp Premier Support đến năm 2031 và Extended Support đến năm 2037. Oracle đã cho nghỉ việc phần lớn đội ngũ Solaris vào ngày 2 September 2017. Kể từ đó, 11.4 nhận các bản cập nhật từ support repository thay vì có một major version mới. Oracle không công bố toàn bộ mã nguồn theo cách OpenSolaris từng công bố.

Tôi có thể cài illumos trên VPS không?

Có thể, nhưng hiếm khi cài được trực tiếp từ danh sách image của provider. MNX, đơn vị duy trì SmartOS, cung cấp SmartOS từ cloud control panel riêng. Ở các provider khác, bạn thường cần provider cho phép gắn custom ISO và sử dụng console. Sau đó, hãy kiểm tra xem virtual disk và network driver trong cây mã nguồn illumos có nhận diện được thiết bị của hypervisor hay không. OpenIndiana và Tribblix thường là điểm bắt đầu phù hợp để cài hệ thống general purpose. SmartOS được thiết kế làm hypervisor host, không phải guest để bạn tự cài đặt. Hãy thử nghiệm trên local virtual machine trước khi trả tiền cho bất kỳ dịch vụ nào.

Nếu chỉ dùng Linux, học DTrace có đáng không?

Mô hình tư duy có thể áp dụng, dù phần lớn công cụ thì không. Oracle đã phát hành mã nguồn kernel của DTrace theo GPLv2 vào August 2017 và duy trì một port cho Oracle Linux. Tuy nhiên, mã này chưa từng được merge vào mainline kernel. Trên Linux, tracing thực tế sử dụng eBPF. Ngôn ngữ mà bpftrace sử dụng được thiết kế giống D của DTrace. Vì vậy, probe, predicate và aggregation có cùng ý nghĩa trong cả hai hệ thống. Học cách tư duy của DTrace giúp bạn đọc hiểu script bpftrace ngay từ lần đầu.

#solaris#illumos#unix-history#zfs#dtrace